intel/brw: Reduce scope of some GS specific functions
Reviewed-by: Ian Romanick <ian.d.romanick@intel.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/30169>
This commit is contained in:
@@ -30,6 +30,60 @@ static const GLuint gl_prim_to_hw_prim[MESA_PRIM_TRIANGLE_STRIP_ADJACENCY+1] = {
|
||||
[MESA_PRIM_TRIANGLE_STRIP_ADJACENCY] = _3DPRIM_TRISTRIP_ADJ,
|
||||
};
|
||||
|
||||
static void
|
||||
brw_emit_gs_thread_end(fs_visitor &s)
|
||||
{
|
||||
assert(s.stage == MESA_SHADER_GEOMETRY);
|
||||
|
||||
struct brw_gs_prog_data *gs_prog_data = brw_gs_prog_data(s.prog_data);
|
||||
|
||||
if (s.gs_compile->control_data_header_size_bits > 0) {
|
||||
s.emit_gs_control_data_bits(s.final_gs_vertex_count);
|
||||
}
|
||||
|
||||
const fs_builder abld = fs_builder(&s).at_end().annotate("thread end");
|
||||
fs_inst *inst;
|
||||
|
||||
if (gs_prog_data->static_vertex_count != -1) {
|
||||
/* Try and tag the last URB write with EOT instead of emitting a whole
|
||||
* separate write just to finish the thread.
|
||||
*/
|
||||
if (s.mark_last_urb_write_with_eot())
|
||||
return;
|
||||
|
||||
brw_reg srcs[URB_LOGICAL_NUM_SRCS];
|
||||
srcs[URB_LOGICAL_SRC_HANDLE] = s.gs_payload().urb_handles;
|
||||
srcs[URB_LOGICAL_SRC_COMPONENTS] = brw_imm_ud(0);
|
||||
inst = abld.emit(SHADER_OPCODE_URB_WRITE_LOGICAL, reg_undef,
|
||||
srcs, ARRAY_SIZE(srcs));
|
||||
} else {
|
||||
brw_reg srcs[URB_LOGICAL_NUM_SRCS];
|
||||
srcs[URB_LOGICAL_SRC_HANDLE] = s.gs_payload().urb_handles;
|
||||
srcs[URB_LOGICAL_SRC_DATA] = s.final_gs_vertex_count;
|
||||
srcs[URB_LOGICAL_SRC_COMPONENTS] = brw_imm_ud(1);
|
||||
inst = abld.emit(SHADER_OPCODE_URB_WRITE_LOGICAL, reg_undef,
|
||||
srcs, ARRAY_SIZE(srcs));
|
||||
}
|
||||
inst->eot = true;
|
||||
inst->offset = 0;
|
||||
}
|
||||
|
||||
static void
|
||||
brw_assign_gs_urb_setup(fs_visitor &s)
|
||||
{
|
||||
assert(s.stage == MESA_SHADER_GEOMETRY);
|
||||
|
||||
struct brw_vue_prog_data *vue_prog_data = brw_vue_prog_data(s.prog_data);
|
||||
|
||||
s.first_non_payload_grf +=
|
||||
8 * vue_prog_data->urb_read_length * s.nir->info.gs.vertices_in;
|
||||
|
||||
foreach_block_and_inst(block, fs_inst, inst, s.cfg) {
|
||||
/* Rewrite all ATTR file references to GRFs. */
|
||||
s.convert_attr_sources_to_hw_regs(inst);
|
||||
}
|
||||
}
|
||||
|
||||
static bool
|
||||
run_gs(fs_visitor &s)
|
||||
{
|
||||
@@ -57,7 +111,7 @@ run_gs(fs_visitor &s)
|
||||
|
||||
nir_to_brw(&s);
|
||||
|
||||
s.emit_gs_thread_end();
|
||||
brw_emit_gs_thread_end(s);
|
||||
|
||||
if (s.failed)
|
||||
return false;
|
||||
@@ -67,7 +121,7 @@ run_gs(fs_visitor &s)
|
||||
brw_fs_optimize(s);
|
||||
|
||||
s.assign_curb_setup();
|
||||
s.assign_gs_urb_setup();
|
||||
brw_assign_gs_urb_setup(s);
|
||||
|
||||
brw_fs_lower_3src_null_dest(s);
|
||||
brw_fs_workaround_memory_fence_before_eot(s);
|
||||
|
@@ -1117,44 +1117,6 @@ fs_visitor::mark_last_urb_write_with_eot()
|
||||
return false;
|
||||
}
|
||||
|
||||
void
|
||||
fs_visitor::emit_gs_thread_end()
|
||||
{
|
||||
assert(stage == MESA_SHADER_GEOMETRY);
|
||||
|
||||
struct brw_gs_prog_data *gs_prog_data = brw_gs_prog_data(prog_data);
|
||||
|
||||
if (gs_compile->control_data_header_size_bits > 0) {
|
||||
emit_gs_control_data_bits(this->final_gs_vertex_count);
|
||||
}
|
||||
|
||||
const fs_builder abld = fs_builder(this).at_end().annotate("thread end");
|
||||
fs_inst *inst;
|
||||
|
||||
if (gs_prog_data->static_vertex_count != -1) {
|
||||
/* Try and tag the last URB write with EOT instead of emitting a whole
|
||||
* separate write just to finish the thread.
|
||||
*/
|
||||
if (mark_last_urb_write_with_eot())
|
||||
return;
|
||||
|
||||
brw_reg srcs[URB_LOGICAL_NUM_SRCS];
|
||||
srcs[URB_LOGICAL_SRC_HANDLE] = gs_payload().urb_handles;
|
||||
srcs[URB_LOGICAL_SRC_COMPONENTS] = brw_imm_ud(0);
|
||||
inst = abld.emit(SHADER_OPCODE_URB_WRITE_LOGICAL, reg_undef,
|
||||
srcs, ARRAY_SIZE(srcs));
|
||||
} else {
|
||||
brw_reg srcs[URB_LOGICAL_NUM_SRCS];
|
||||
srcs[URB_LOGICAL_SRC_HANDLE] = gs_payload().urb_handles;
|
||||
srcs[URB_LOGICAL_SRC_DATA] = this->final_gs_vertex_count;
|
||||
srcs[URB_LOGICAL_SRC_COMPONENTS] = brw_imm_ud(1);
|
||||
inst = abld.emit(SHADER_OPCODE_URB_WRITE_LOGICAL, reg_undef,
|
||||
srcs, ARRAY_SIZE(srcs));
|
||||
}
|
||||
inst->eot = true;
|
||||
inst->offset = 0;
|
||||
}
|
||||
|
||||
static unsigned
|
||||
round_components_to_whole_registers(const intel_device_info *devinfo,
|
||||
unsigned c)
|
||||
@@ -1421,22 +1383,6 @@ fs_visitor::assign_tes_urb_setup()
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
fs_visitor::assign_gs_urb_setup()
|
||||
{
|
||||
assert(stage == MESA_SHADER_GEOMETRY);
|
||||
|
||||
struct brw_vue_prog_data *vue_prog_data = brw_vue_prog_data(prog_data);
|
||||
|
||||
first_non_payload_grf +=
|
||||
8 * vue_prog_data->urb_read_length * nir->info.gs.vertices_in;
|
||||
|
||||
foreach_block_and_inst(block, fs_inst, inst, cfg) {
|
||||
/* Rewrite all ATTR file references to GRFs. */
|
||||
convert_attr_sources_to_hw_regs(inst);
|
||||
}
|
||||
}
|
||||
|
||||
int
|
||||
brw_get_subgroup_id_param_index(const intel_device_info *devinfo,
|
||||
const brw_stage_prog_data *prog_data)
|
||||
|
@@ -307,7 +307,6 @@ public:
|
||||
void convert_attr_sources_to_hw_regs(fs_inst *inst);
|
||||
void assign_tcs_urb_setup();
|
||||
void assign_tes_urb_setup();
|
||||
void assign_gs_urb_setup();
|
||||
bool assign_regs(bool allow_spilling, bool spill_all);
|
||||
void assign_regs_trivial();
|
||||
void calculate_payload_ranges(unsigned payload_node_count,
|
||||
@@ -332,7 +331,6 @@ public:
|
||||
void emit_gs_control_data_bits(const brw_reg &vertex_count);
|
||||
brw_reg gs_urb_channel_mask(const brw_reg &dword_index);
|
||||
brw_reg gs_urb_per_slot_dword_index(const brw_reg &vertex_count);
|
||||
void emit_gs_thread_end();
|
||||
bool mark_last_urb_write_with_eot();
|
||||
void emit_tcs_thread_end();
|
||||
void emit_urb_fence();
|
||||
|
Reference in New Issue
Block a user