From c1173f7a0b8651f6e63feafc7a167cb2ba64dda9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Ol=C5=A1=C3=A1k?= Date: Sat, 2 May 2026 10:21:47 -0400 Subject: [PATCH] nir/opt_varyings: always report progress when calling nir_remove_varying It changes IO semantics even if it doesn't remove the instruction. --- src/compiler/nir/nir_opt_varyings.c | 4 +++- .../nir/tests/opt_varyings_tests_dead_output.cpp | 9 +++++++-- src/compiler/nir/tests/opt_varyings_tests_prop_const.cpp | 4 ++-- src/compiler/nir/tests/opt_varyings_tests_prop_ubo.cpp | 4 ++-- .../nir/tests/opt_varyings_tests_prop_uniform.cpp | 4 ++-- .../nir/tests/opt_varyings_tests_prop_uniform_expr.cpp | 5 ++--- 6 files changed, 18 insertions(+), 12 deletions(-) diff --git a/src/compiler/nir/nir_opt_varyings.c b/src/compiler/nir/nir_opt_varyings.c index d21c502cc1a..e8d6b59cbcf 100644 --- a/src/compiler/nir/nir_opt_varyings.c +++ b/src/compiler/nir/nir_opt_varyings.c @@ -2009,9 +2009,11 @@ remove_all_stores(struct linkage_info *linkage, unsigned i, /* Remove all stores. */ list_for_each_entry_safe(struct list_node, iter, &slot->producer.stores, head) { + /* nir_remove_varying always makes progress. */ + *progress |= nir_progress_producer; + if (nir_remove_varying(iter->instr, linkage->consumer_stage)) { list_del(&iter->head); - *progress |= nir_progress_producer; } else { if (has_xfb(iter->instr)) { *uses_xfb = true; diff --git a/src/compiler/nir/tests/opt_varyings_tests_dead_output.cpp b/src/compiler/nir/tests/opt_varyings_tests_dead_output.cpp index b02a271c92a..a2ea5367e19 100644 --- a/src/compiler/nir/tests/opt_varyings_tests_dead_output.cpp +++ b/src/compiler/nir/tests/opt_varyings_tests_dead_output.cpp @@ -36,7 +36,7 @@ TEST_F(nir_opt_varyings_test_dead_output, \ store_output(b1, VARYING_SLOT_##slot, 0, nir_type_float##bitsize, \ nir_imm_floatN_t(b1, 0, bitsize), 0); \ \ - opt_varyings(); \ + ASSERT_EQ(opt_varyings(), nir_progress_producer); \ ASSERT_TRUE(b1->shader->info.outputs_written == VARYING_BIT_##slot); \ ASSERT_TRUE(shader_contains_instr(b1, &intr->instr)); \ ASSERT_TRUE(nir_intrinsic_io_semantics(intr).no_varying == \ @@ -69,8 +69,13 @@ TEST_F(nir_opt_varyings_test_dead_output, \ if (index == VARYING_SLOT_FOGC || index == VARYING_SLOT_PRIMITIVE_ID || \ index == VARYING_SLOT_TEX0 || index == VARYING_SLOT_VAR0_16BIT) \ index = VARYING_SLOT_VAR0; \ + \ + if (index == VARYING_SLOT_POS || index == VARYING_SLOT_PSIZ || \ + index == VARYING_SLOT_CLIP_VERTEX) \ + ASSERT_EQ(opt_varyings(), 0); \ + else \ + ASSERT_EQ(opt_varyings(), nir_progress_producer); \ \ - ASSERT_TRUE(opt_varyings() == 0); \ if (index >= VARYING_SLOT_VAR0_16BIT) { \ ASSERT_TRUE(b1->shader->info.outputs_written_16bit == \ BITFIELD_BIT(index - VARYING_SLOT_VAR0_16BIT)); \ diff --git a/src/compiler/nir/tests/opt_varyings_tests_prop_const.cpp b/src/compiler/nir/tests/opt_varyings_tests_prop_const.cpp index bbe23953f89..9c5a96e677c 100644 --- a/src/compiler/nir/tests/opt_varyings_tests_prop_const.cpp +++ b/src/compiler/nir/tests/opt_varyings_tests_prop_const.cpp @@ -61,7 +61,7 @@ TEST_F(nir_opt_varyings_test_prop_const, \ SHADER_CONST_OUTPUT(producer_stage, consumer_stage, slot, comp, type, bitsize, value, value) \ \ if (nir_slot_is_sysval_output((gl_varying_slot)pindex, MESA_SHADER_##consumer_stage)) { \ - ASSERT_TRUE(opt_varyings() & nir_progress_consumer); \ + ASSERT_EQ(opt_varyings(), (nir_progress_producer | nir_progress_consumer)); \ ASSERT_TRUE(b1->shader->info.outputs_written == BITFIELD64_BIT(pindex)); \ ASSERT_TRUE(nir_intrinsic_io_semantics(store).no_varying); \ } else { \ @@ -100,7 +100,7 @@ TEST_F(nir_opt_varyings_test_prop_const, \ if (store3) \ nir_intrinsic_set_io_xfb(store3, xfb); \ \ - ASSERT_TRUE(opt_varyings() == nir_progress_consumer); \ + ASSERT_EQ(opt_varyings(), (nir_progress_producer | nir_progress_consumer)); \ ASSERT_TRUE(b1->shader->info.outputs_written == BITFIELD64_BIT(pindex)); \ ASSERT_TRUE(nir_intrinsic_io_semantics(store).no_varying); \ ASSERT_TRUE(b2->shader->info.inputs_read == 0 && \ diff --git a/src/compiler/nir/tests/opt_varyings_tests_prop_ubo.cpp b/src/compiler/nir/tests/opt_varyings_tests_prop_ubo.cpp index 0677752bfe6..ecb5c301913 100644 --- a/src/compiler/nir/tests/opt_varyings_tests_prop_ubo.cpp +++ b/src/compiler/nir/tests/opt_varyings_tests_prop_ubo.cpp @@ -61,7 +61,7 @@ TEST_F(nir_opt_varyings_test_prop_ubo, \ SHADER_UBO_OUTPUT(producer_stage, consumer_stage, slot, comp, type, bitsize, 1, 1) \ \ if (nir_slot_is_sysval_output((gl_varying_slot)pindex, MESA_SHADER_##consumer_stage)) { \ - ASSERT_TRUE(opt_varyings() & nir_progress_consumer); \ + ASSERT_EQ(opt_varyings(), (nir_progress_producer | nir_progress_consumer)); \ ASSERT_TRUE(b1->shader->info.outputs_written == BITFIELD64_BIT(pindex)); \ ASSERT_TRUE(nir_intrinsic_io_semantics(store).no_varying); \ } else { \ @@ -100,7 +100,7 @@ TEST_F(nir_opt_varyings_test_prop_ubo, \ if (store3) \ nir_intrinsic_set_io_xfb(store3, xfb); \ \ - ASSERT_TRUE(opt_varyings() == nir_progress_consumer); \ + ASSERT_EQ(opt_varyings(), (nir_progress_producer | nir_progress_consumer)); \ ASSERT_TRUE(b1->shader->info.outputs_written == BITFIELD64_BIT(pindex)); \ ASSERT_TRUE(nir_intrinsic_io_semantics(store).no_varying); \ ASSERT_TRUE(b2->shader->info.inputs_read == 0 && \ diff --git a/src/compiler/nir/tests/opt_varyings_tests_prop_uniform.cpp b/src/compiler/nir/tests/opt_varyings_tests_prop_uniform.cpp index 9af7a62d201..07cb02f5b3c 100644 --- a/src/compiler/nir/tests/opt_varyings_tests_prop_uniform.cpp +++ b/src/compiler/nir/tests/opt_varyings_tests_prop_uniform.cpp @@ -61,7 +61,7 @@ TEST_F(nir_opt_varyings_test_prop_uniform, \ SHADER_UNIFORM_OUTPUT(producer_stage, consumer_stage, slot, comp, type, bitsize, 1, 1) \ \ if (nir_slot_is_sysval_output((gl_varying_slot)pindex, MESA_SHADER_##consumer_stage)) { \ - ASSERT_TRUE(opt_varyings() & nir_progress_consumer); \ + ASSERT_EQ(opt_varyings(), (nir_progress_producer | nir_progress_consumer)); \ ASSERT_TRUE(b1->shader->info.outputs_written == BITFIELD64_BIT(pindex)); \ ASSERT_TRUE(nir_intrinsic_io_semantics(store).no_varying); \ } else { \ @@ -100,7 +100,7 @@ TEST_F(nir_opt_varyings_test_prop_uniform, \ if (store3) \ nir_intrinsic_set_io_xfb(store3, xfb); \ \ - ASSERT_TRUE(opt_varyings() == nir_progress_consumer); \ + ASSERT_EQ(opt_varyings(), (nir_progress_producer | nir_progress_consumer)); \ ASSERT_TRUE(b1->shader->info.outputs_written == BITFIELD64_BIT(pindex)); \ ASSERT_TRUE(nir_intrinsic_io_semantics(store).no_varying); \ ASSERT_TRUE(b2->shader->info.inputs_read == 0 && \ diff --git a/src/compiler/nir/tests/opt_varyings_tests_prop_uniform_expr.cpp b/src/compiler/nir/tests/opt_varyings_tests_prop_uniform_expr.cpp index d049ef99431..33432575096 100644 --- a/src/compiler/nir/tests/opt_varyings_tests_prop_uniform_expr.cpp +++ b/src/compiler/nir/tests/opt_varyings_tests_prop_uniform_expr.cpp @@ -60,12 +60,11 @@ TEST_F(nir_opt_varyings_test_prop_uniform_expr, \ { \ SHADER_UNI_EXPR_OUTPUT(producer_stage, consumer_stage, slot, comp, type, bitsize, 1, 1) \ \ + ASSERT_EQ(opt_varyings(), (nir_progress_producer | nir_progress_consumer)); \ if (nir_slot_is_sysval_output((gl_varying_slot)pindex, MESA_SHADER_##consumer_stage)) { \ - ASSERT_TRUE(opt_varyings() & nir_progress_consumer); \ ASSERT_TRUE(b1->shader->info.outputs_written == BITFIELD64_BIT(pindex)); \ ASSERT_TRUE(nir_intrinsic_io_semantics(store).no_varying); \ } else { \ - ASSERT_TRUE(opt_varyings() == (nir_progress_producer | nir_progress_consumer)); \ ASSERT_TRUE(b1->shader->info.outputs_written == 0 && \ b1->shader->info.patch_outputs_written == 0 && \ b1->shader->info.outputs_written_16bit == 0); \ @@ -100,7 +99,7 @@ TEST_F(nir_opt_varyings_test_prop_uniform_expr, \ if (store3) \ nir_intrinsic_set_io_xfb(store3, xfb); \ \ - ASSERT_TRUE(opt_varyings() == nir_progress_consumer); \ + ASSERT_EQ(opt_varyings(), (nir_progress_producer | nir_progress_consumer)); \ ASSERT_TRUE(b1->shader->info.outputs_written == BITFIELD64_BIT(pindex)); \ ASSERT_TRUE(nir_intrinsic_io_semantics(store).no_varying); \ ASSERT_TRUE(b2->shader->info.inputs_read == 0 && \