mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-04-21 18:30:42 +02:00
ir3/lower_tess: make all NIR passes report progress
Signed-off-by: Job Noorman <jnoorman@igalia.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/33701>
This commit is contained in:
parent
7276191d59
commit
0f69ada3b5
2 changed files with 50 additions and 19 deletions
|
|
@ -33,16 +33,16 @@ bool ir3_nir_lower_layer_id(nir_shader *shader);
|
|||
bool ir3_nir_lower_frag_shading_rate(nir_shader *shader);
|
||||
bool ir3_nir_lower_primitive_shading_rate(nir_shader *shader);
|
||||
|
||||
void ir3_nir_lower_to_explicit_output(nir_shader *shader,
|
||||
bool ir3_nir_lower_to_explicit_output(nir_shader *shader,
|
||||
struct ir3_shader_variant *v,
|
||||
unsigned topology);
|
||||
void ir3_nir_lower_to_explicit_input(nir_shader *shader,
|
||||
bool ir3_nir_lower_to_explicit_input(nir_shader *shader,
|
||||
struct ir3_shader_variant *v);
|
||||
void ir3_nir_lower_tess_ctrl(nir_shader *shader, struct ir3_shader_variant *v,
|
||||
bool ir3_nir_lower_tess_ctrl(nir_shader *shader, struct ir3_shader_variant *v,
|
||||
unsigned topology);
|
||||
void ir3_nir_lower_tess_eval(nir_shader *shader, struct ir3_shader_variant *v,
|
||||
bool ir3_nir_lower_tess_eval(nir_shader *shader, struct ir3_shader_variant *v,
|
||||
unsigned topology);
|
||||
void ir3_nir_lower_gs(nir_shader *shader);
|
||||
bool ir3_nir_lower_gs(nir_shader *shader);
|
||||
|
||||
bool ir3_supports_vectorized_nir_op(nir_op op);
|
||||
uint8_t ir3_nir_vectorize_filter(const nir_instr *instr, const void *data);
|
||||
|
|
|
|||
|
|
@ -226,10 +226,12 @@ calc_primitive_map_size(nir_shader *shader)
|
|||
return max_index;
|
||||
}
|
||||
|
||||
static void
|
||||
static bool
|
||||
lower_block_to_explicit_output(nir_block *block, nir_builder *b,
|
||||
struct state *state)
|
||||
{
|
||||
bool progress = false;
|
||||
|
||||
nir_foreach_instr_safe (instr, block) {
|
||||
if (instr->type != nir_instr_type_intrinsic)
|
||||
continue;
|
||||
|
|
@ -256,6 +258,7 @@ lower_block_to_explicit_output(nir_block *block, nir_builder *b,
|
|||
nir_intrinsic_component(intr), intr->src[1].ssa);
|
||||
|
||||
nir_store_shared_ir3(b, intr->src[0].ssa, offset);
|
||||
progress = true;
|
||||
break;
|
||||
}
|
||||
|
||||
|
|
@ -263,6 +266,8 @@ lower_block_to_explicit_output(nir_block *block, nir_builder *b,
|
|||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return progress;
|
||||
}
|
||||
|
||||
static nir_def *
|
||||
|
|
@ -271,7 +276,7 @@ local_thread_id(nir_builder *b)
|
|||
return bitfield_extract(b, nir_load_gs_header_ir3(b), 16, 1023);
|
||||
}
|
||||
|
||||
void
|
||||
bool
|
||||
ir3_nir_lower_to_explicit_output(nir_shader *shader,
|
||||
struct ir3_shader_variant *v,
|
||||
unsigned topology)
|
||||
|
|
@ -291,19 +296,27 @@ ir3_nir_lower_to_explicit_output(nir_shader *shader,
|
|||
else
|
||||
state.header = nir_load_gs_header_ir3(&b);
|
||||
|
||||
nir_foreach_block_safe (block, impl)
|
||||
lower_block_to_explicit_output(block, &b, &state);
|
||||
bool progress = false;
|
||||
|
||||
nir_metadata_preserve(impl,
|
||||
nir_metadata_control_flow);
|
||||
nir_foreach_block_safe (block, impl)
|
||||
progress |= lower_block_to_explicit_output(block, &b, &state);
|
||||
|
||||
if (progress) {
|
||||
nir_metadata_preserve(impl, nir_metadata_control_flow);
|
||||
} else {
|
||||
nir_metadata_preserve(impl, nir_metadata_all);
|
||||
}
|
||||
|
||||
v->output_size = state.map.stride;
|
||||
return progress;
|
||||
}
|
||||
|
||||
static void
|
||||
static bool
|
||||
lower_block_to_explicit_input(nir_block *block, nir_builder *b,
|
||||
struct state *state)
|
||||
{
|
||||
bool progress = false;
|
||||
|
||||
nir_foreach_instr_safe (instr, block) {
|
||||
if (instr->type != nir_instr_type_intrinsic)
|
||||
continue;
|
||||
|
|
@ -324,6 +337,7 @@ lower_block_to_explicit_input(nir_block *block, nir_builder *b,
|
|||
|
||||
replace_intrinsic(b, intr, nir_intrinsic_load_shared_ir3, offset, NULL,
|
||||
NULL);
|
||||
progress = true;
|
||||
break;
|
||||
}
|
||||
|
||||
|
|
@ -332,6 +346,7 @@ lower_block_to_explicit_input(nir_block *block, nir_builder *b,
|
|||
|
||||
nir_def *iid = build_invocation_id(b, state);
|
||||
nir_def_replace(&intr->def, iid);
|
||||
progress = true;
|
||||
break;
|
||||
}
|
||||
|
||||
|
|
@ -339,9 +354,11 @@ lower_block_to_explicit_input(nir_block *block, nir_builder *b,
|
|||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return progress;
|
||||
}
|
||||
|
||||
void
|
||||
bool
|
||||
ir3_nir_lower_to_explicit_input(nir_shader *shader,
|
||||
struct ir3_shader_variant *v)
|
||||
{
|
||||
|
|
@ -364,10 +381,19 @@ ir3_nir_lower_to_explicit_input(nir_shader *shader,
|
|||
else
|
||||
state.header = nir_load_tcs_header_ir3(&b);
|
||||
|
||||
bool progress = false;
|
||||
|
||||
nir_foreach_block_safe (block, impl)
|
||||
lower_block_to_explicit_input(block, &b, &state);
|
||||
progress |= lower_block_to_explicit_input(block, &b, &state);
|
||||
|
||||
if (progress) {
|
||||
nir_metadata_preserve(impl, nir_metadata_control_flow);
|
||||
} else {
|
||||
nir_metadata_preserve(impl, nir_metadata_all);
|
||||
}
|
||||
|
||||
v->input_size = calc_primitive_map_size(shader);
|
||||
return progress;
|
||||
}
|
||||
|
||||
static nir_def *
|
||||
|
|
@ -630,7 +656,7 @@ lower_tess_ctrl_block(nir_block *block, nir_builder *b, struct state *state)
|
|||
}
|
||||
}
|
||||
|
||||
void
|
||||
bool
|
||||
ir3_nir_lower_tess_ctrl(nir_shader *shader, struct ir3_shader_variant *v,
|
||||
unsigned topology)
|
||||
{
|
||||
|
|
@ -698,6 +724,7 @@ ir3_nir_lower_tess_ctrl(nir_shader *shader, struct ir3_shader_variant *v,
|
|||
nir_pop_if(&b, nif);
|
||||
|
||||
nir_metadata_preserve(impl, nir_metadata_none);
|
||||
return true;
|
||||
}
|
||||
|
||||
static void
|
||||
|
|
@ -762,7 +789,7 @@ lower_tess_eval_block(nir_block *block, nir_builder *b, struct state *state)
|
|||
}
|
||||
}
|
||||
|
||||
void
|
||||
bool
|
||||
ir3_nir_lower_tess_eval(nir_shader *shader, struct ir3_shader_variant *v,
|
||||
unsigned topology)
|
||||
{
|
||||
|
|
@ -774,7 +801,7 @@ ir3_nir_lower_tess_eval(nir_shader *shader, struct ir3_shader_variant *v,
|
|||
nir_log_shaderi(shader);
|
||||
}
|
||||
|
||||
NIR_PASS_V(shader, nir_lower_tess_coord_z, topology == IR3_TESS_TRIANGLES);
|
||||
nir_lower_tess_coord_z(shader, topology == IR3_TESS_TRIANGLES);
|
||||
|
||||
nir_function_impl *impl = nir_shader_get_entrypoint(shader);
|
||||
assert(impl);
|
||||
|
|
@ -787,6 +814,7 @@ ir3_nir_lower_tess_eval(nir_shader *shader, struct ir3_shader_variant *v,
|
|||
v->input_size = calc_primitive_map_size(shader);
|
||||
|
||||
nir_metadata_preserve(impl, nir_metadata_none);
|
||||
return true;
|
||||
}
|
||||
|
||||
/* The hardware does not support incomplete primitives in multiple streams at
|
||||
|
|
@ -950,7 +978,7 @@ lower_gs_block(nir_block *block, nir_builder *b, struct state *state)
|
|||
}
|
||||
}
|
||||
|
||||
void
|
||||
bool
|
||||
ir3_nir_lower_gs(nir_shader *shader)
|
||||
{
|
||||
struct state state = {};
|
||||
|
|
@ -958,7 +986,7 @@ ir3_nir_lower_gs(nir_shader *shader)
|
|||
/* Don't lower multiple times: */
|
||||
nir_foreach_shader_out_variable (var, shader)
|
||||
if (var->data.location == VARYING_SLOT_GS_VERTEX_FLAGS_IR3)
|
||||
return;
|
||||
return false;
|
||||
|
||||
if (shader_debug_enabled(shader->info.stage, shader->info.internal)) {
|
||||
mesa_logi("NIR (before gs lowering):");
|
||||
|
|
@ -1080,4 +1108,7 @@ ir3_nir_lower_gs(nir_shader *shader)
|
|||
mesa_logi("NIR (after gs lowering):");
|
||||
nir_log_shaderi(shader);
|
||||
}
|
||||
|
||||
nir_metadata_preserve(impl, nir_metadata_none);
|
||||
return true;
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue