From c3c138b10f40c9225a6d00456620ba2bb1a72d98 Mon Sep 17 00:00:00 2001 From: Rhys Perry Date: Fri, 5 Jan 2024 17:42:41 +0000 Subject: [PATCH] radv: optimize msad_4x8 to mqsad_4x8 Signed-off-by: Rhys Perry Reviewed-by: Georg Lehmann Part-of: --- src/amd/vulkan/radv_pipeline.c | 3 ++- src/amd/vulkan/radv_shader.c | 6 ++++-- src/amd/vulkan/radv_shader.h | 2 +- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/src/amd/vulkan/radv_pipeline.c b/src/amd/vulkan/radv_pipeline.c index 855f67ce0f6..bb8580c7447 100644 --- a/src/amd/vulkan/radv_pipeline.c +++ b/src/amd/vulkan/radv_pipeline.c @@ -681,7 +681,8 @@ radv_postprocess_nir(struct radv_device *device, const struct radv_graphics_stat &stage->args.ac); NIR_PASS_V(stage->nir, radv_nir_lower_abi, gfx_level, stage, gfx_state, pdev->info.address32_hi); radv_optimize_nir_algebraic( - stage->nir, io_to_mem || lowered_ngg || stage->stage == MESA_SHADER_COMPUTE || stage->stage == MESA_SHADER_TASK); + stage->nir, io_to_mem || lowered_ngg || stage->stage == MESA_SHADER_COMPUTE || stage->stage == MESA_SHADER_TASK, + gfx_level >= GFX7); NIR_PASS(_, stage->nir, nir_lower_fp16_casts, nir_lower_fp16_split_fp64); diff --git a/src/amd/vulkan/radv_shader.c b/src/amd/vulkan/radv_shader.c index 82602bccc97..d909c3f208e 100644 --- a/src/amd/vulkan/radv_shader.c +++ b/src/amd/vulkan/radv_shader.c @@ -201,7 +201,7 @@ radv_optimize_nir(struct nir_shader *shader, bool optimize_conservatively) } void -radv_optimize_nir_algebraic(nir_shader *nir, bool opt_offsets) +radv_optimize_nir_algebraic(nir_shader *nir, bool opt_offsets, bool opt_mqsad) { bool more_algebraic = true; while (more_algebraic) { @@ -222,6 +222,8 @@ radv_optimize_nir_algebraic(nir_shader *nir, bool opt_offsets) }; NIR_PASS(_, nir, nir_opt_offsets, &offset_options); } + if (opt_mqsad) + NIR_PASS(_, nir, nir_opt_mqsad); /* Do late algebraic optimization to turn add(a, * neg(b)) back into subs, then the mandatory cleanup @@ -848,7 +850,7 @@ radv_lower_ngg(struct radv_device *device, struct radv_shader_stage *ngg_stage, assert(info->is_ngg); if (info->has_ngg_culling) - radv_optimize_nir_algebraic(nir, false); + radv_optimize_nir_algebraic(nir, false, false); options.num_vertices_per_primitive = num_vertices_per_prim; options.early_prim_export = info->has_ngg_early_prim_export; diff --git a/src/amd/vulkan/radv_shader.h b/src/amd/vulkan/radv_shader.h index cb7b29008fd..2c67e126b0e 100644 --- a/src/amd/vulkan/radv_shader.h +++ b/src/amd/vulkan/radv_shader.h @@ -504,7 +504,7 @@ struct radv_pipeline_layout; struct radv_shader_stage; void radv_optimize_nir(struct nir_shader *shader, bool optimize_conservatively); -void radv_optimize_nir_algebraic(nir_shader *shader, bool opt_offsets); +void radv_optimize_nir_algebraic(nir_shader *shader, bool opt_offsets, bool opt_mqsad); void radv_nir_lower_rt_io(nir_shader *shader, bool monolithic, uint32_t payload_offset);