diff --git a/src/amd/vulkan/radv_pipeline_graphics.c b/src/amd/vulkan/radv_pipeline_graphics.c index 73d54dc2ea4..5bfd9f6c723 100644 --- a/src/amd/vulkan/radv_pipeline_graphics.c +++ b/src/amd/vulkan/radv_pipeline_graphics.c @@ -1585,6 +1585,8 @@ radv_graphics_shaders_link_varyings(struct radv_shader_stage *stages) NIR_PASS(_, producer, nir_copy_prop); } + int highest_changed_producer = -1; + /* Optimize varyings from first to last stage. */ for (int i = 0; i < ARRAY_SIZE(graphics_shader_order); ++i) { const gl_shader_stage s = graphics_shader_order[i]; @@ -1604,6 +1606,8 @@ radv_graphics_shaders_link_varyings(struct radv_shader_stage *stages) if (p & nir_progress_producer) { radv_optimize_nir_algebraic(producer, false, false); NIR_PASS(_, producer, nir_opt_undef); + + highest_changed_producer = i; } if (p & nir_progress_consumer) { radv_optimize_nir_algebraic(consumer, false, false); @@ -1612,7 +1616,7 @@ radv_graphics_shaders_link_varyings(struct radv_shader_stage *stages) } /* Optimize varyings from last to first stage. */ - for (int i = ARRAY_SIZE(graphics_shader_order) - 1; i >= 0; --i) { + for (int i = highest_changed_producer; i >= 0; --i) { const gl_shader_stage s = graphics_shader_order[i]; const gl_shader_stage next = stages[s].info.next_stage; if (!stages[s].nir || next == MESA_SHADER_NONE || !stages[next].nir)