From 1632948a7640e0acb569be7c61e0840451daca2e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Ol=C5=A1=C3=A1k?= Date: Sat, 13 Apr 2024 15:28:57 -0400 Subject: [PATCH] nir: validate src_type of store_output intrinsics, require bit_size >= 16 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Reviewed-by: Georg Lehmann Reviewed-by: Timur Kristóf Part-of: --- src/broadcom/compiler/v3d_nir_lower_io.c | 3 ++- src/compiler/nir/nir_validate.c | 13 ++++++++++--- .../nir/tests/opt_varyings_tests_dead_output.cpp | 6 +++--- 3 files changed, 15 insertions(+), 7 deletions(-) diff --git a/src/broadcom/compiler/v3d_nir_lower_io.c b/src/broadcom/compiler/v3d_nir_lower_io.c index 55e2e4f2e11..96f28fff2b3 100644 --- a/src/broadcom/compiler/v3d_nir_lower_io.c +++ b/src/broadcom/compiler/v3d_nir_lower_io.c @@ -85,7 +85,8 @@ v3d_nir_store_output(nir_builder *b, int base, nir_def *offset, offset = nir_imm_int(b, 0); } - nir_store_output(b, chan, offset, .base = base, .write_mask = 0x1, .component = 0); + nir_store_output(b, chan, offset, .base = base, .write_mask = 0x1, .component = 0, + .src_type = nir_type_uint | chan->bit_size); } static int diff --git a/src/compiler/nir/nir_validate.c b/src/compiler/nir/nir_validate.c index 2d0db485401..f67ce47f223 100644 --- a/src/compiler/nir/nir_validate.c +++ b/src/compiler/nir/nir_validate.c @@ -645,12 +645,19 @@ validate_intrinsic_instr(nir_intrinsic_instr *instr, validate_state *state) util_is_power_of_two_nonzero(nir_intrinsic_align_mul(instr))); validate_assert(state, nir_intrinsic_align_offset(instr) < nir_intrinsic_align_mul(instr)); - FALLTHROUGH; + /* All memory store operations must store at least a byte */ + validate_assert(state, nir_src_bit_size(instr->src[0]) >= 8); + break; case nir_intrinsic_store_output: case nir_intrinsic_store_per_vertex_output: - /* All memory store operations must store at least a byte */ - validate_assert(state, nir_src_bit_size(instr->src[0]) >= 8); + if (state->shader->info.stage == MESA_SHADER_FRAGMENT) + validate_assert(state, nir_src_bit_size(instr->src[0]) >= 8); + else + validate_assert(state, nir_src_bit_size(instr->src[0]) >= 16); + validate_assert(state, + nir_src_bit_size(instr->src[0]) == + nir_alu_type_get_type_size(nir_intrinsic_src_type(instr))); break; case nir_intrinsic_deref_mode_is: 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 5929a88f63d..c254f814f27 100644 --- a/src/compiler/nir/tests/opt_varyings_tests_dead_output.cpp +++ b/src/compiler/nir/tests/opt_varyings_tests_dead_output.cpp @@ -16,7 +16,7 @@ TEST_F(nir_opt_varyings_test_dead_output, \ create_shaders(MESA_SHADER_##producer_stage, MESA_SHADER_##consumer_stage); \ nir_intrinsic_instr *intr = \ store_output(b1, VARYING_SLOT_##slot, 0, nir_type_float##bitsize, \ - nir_imm_float(b1, 0), 0); \ + nir_imm_floatN_t(b1, 0, bitsize), 0); \ \ ASSERT_TRUE(opt_varyings() == nir_progress_producer); \ ASSERT_TRUE(b1->shader->info.outputs_written == 0 && \ @@ -32,7 +32,7 @@ TEST_F(nir_opt_varyings_test_dead_output, \ create_shaders(MESA_SHADER_##producer_stage, MESA_SHADER_##consumer_stage); \ nir_intrinsic_instr *intr = \ store_output(b1, VARYING_SLOT_##slot, 0, nir_type_float##bitsize, \ - nir_imm_float(b1, 0), 0); \ + nir_imm_floatN_t(b1, 0, bitsize), 0); \ \ ASSERT_TRUE(opt_varyings() == 0); \ ASSERT_TRUE(b1->shader->info.outputs_written == VARYING_BIT_##slot); \ @@ -52,7 +52,7 @@ TEST_F(nir_opt_varyings_test_dead_output, \ create_shaders(MESA_SHADER_##producer_stage, MESA_SHADER_##consumer_stage); \ nir_intrinsic_instr *intr = \ store_output(b1, VARYING_SLOT_##slot, 0, nir_type_float##bitsize, \ - nir_imm_float(b1, 0), 0); \ + nir_imm_floatN_t(b1, 0, bitsize), 0); \ \ struct nir_io_xfb xfb; \ memset(&xfb, 0, sizeof(xfb)); \