From 0f69ada3b5dcff937d0333358852c445c4bfca59 Mon Sep 17 00:00:00 2001 From: Job Noorman Date: Mon, 24 Feb 2025 07:45:15 +0100 Subject: [PATCH] ir3/lower_tess: make all NIR passes report progress Signed-off-by: Job Noorman Part-of: --- src/freedreno/ir3/ir3_nir.h | 10 ++--- src/freedreno/ir3/ir3_nir_lower_tess.c | 59 ++++++++++++++++++++------ 2 files changed, 50 insertions(+), 19 deletions(-) diff --git a/src/freedreno/ir3/ir3_nir.h b/src/freedreno/ir3/ir3_nir.h index 2b902dcb3be..0f826f74b89 100644 --- a/src/freedreno/ir3/ir3_nir.h +++ b/src/freedreno/ir3/ir3_nir.h @@ -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); diff --git a/src/freedreno/ir3/ir3_nir_lower_tess.c b/src/freedreno/ir3/ir3_nir_lower_tess.c index 8f17bd3f6f5..54ee6d18046 100644 --- a/src/freedreno/ir3/ir3_nir_lower_tess.c +++ b/src/freedreno/ir3/ir3_nir_lower_tess.c @@ -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; }