diff --git a/src/amd/common/nir/ac_nir.h b/src/amd/common/nir/ac_nir.h index 57dcc0aeca3..36c237a522a 100644 --- a/src/amd/common/nir/ac_nir.h +++ b/src/amd/common/nir/ac_nir.h @@ -194,7 +194,7 @@ ac_nir_lower_ngg_mesh(nir_shader *shader, bool has_query, bool fast_launch_2); -void +bool ac_nir_lower_task_outputs_to_mem(nir_shader *shader, unsigned task_payload_entry_bytes, unsigned task_num_entries, diff --git a/src/amd/common/nir/ac_nir_lower_taskmesh_io_to_mem.c b/src/amd/common/nir/ac_nir_lower_taskmesh_io_to_mem.c index 8bd5020e95f..6ed94c63949 100644 --- a/src/amd/common/nir/ac_nir_lower_taskmesh_io_to_mem.c +++ b/src/amd/common/nir/ac_nir_lower_taskmesh_io_to_mem.c @@ -275,18 +275,19 @@ lower_task_intrinsics(nir_builder *b, } } -void +bool ac_nir_lower_task_outputs_to_mem(nir_shader *shader, unsigned task_payload_entry_bytes, unsigned task_num_entries, bool has_query) { assert(util_is_power_of_two_nonzero(task_num_entries)); + bool progress = false; nir_lower_task_shader_options lower_ts_opt = { .payload_to_shared_for_atomics = true, }; - nir_lower_task_shader(shader, lower_ts_opt); + progress |= nir_lower_task_shader(shader, lower_ts_opt); lower_tsms_io_state state = { .draw_entry_bytes = 16, @@ -295,15 +296,20 @@ ac_nir_lower_task_outputs_to_mem(nir_shader *shader, .has_query = has_query, }; - nir_function_impl *impl = nir_shader_get_entrypoint(shader); + progress |= nir_shader_lower_instructions(shader, + filter_task_intrinsics, + lower_task_intrinsics, + &state); - nir_shader_lower_instructions(shader, - filter_task_intrinsics, - lower_task_intrinsics, - &state); + if (progress) { + /* The nir_shader_lower_instructions pass can't detect the CF changes + * that are made by lower_task_launch_mesh_workgroups. + */ + nir_function_impl *impl = nir_shader_get_entrypoint(shader); + nir_metadata_preserve(impl, nir_metadata_none); + } - nir_metadata_preserve(impl, nir_metadata_none); - nir_validate_shader(shader, "after lowering task shader outputs to memory stores"); + return progress; } static bool diff --git a/src/compiler/nir/nir_lower_task_shader.c b/src/compiler/nir/nir_lower_task_shader.c index 1b9d0c8b49a..8765f25c4df 100644 --- a/src/compiler/nir/nir_lower_task_shader.c +++ b/src/compiler/nir/nir_lower_task_shader.c @@ -446,6 +446,7 @@ nir_lower_task_shader(nir_shader *shader, nir_block *last_block = nir_impl_last_block(impl); builder.cursor = nir_after_block_before_jump(last_block); nir_launch_mesh_workgroups(&builder, nir_imm_zero(&builder, 3, 32)); + nir_metadata_preserve(impl, nir_metadata_control_flow); } bool atomics = options.payload_to_shared_for_atomics;