nir: validate src_type of store_output intrinsics, require bit_size >= 16

Reviewed-by: Georg Lehmann <dadschoorse@gmail.com>
Reviewed-by: Timur Kristóf <timur.kristof@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/28845>
This commit is contained in:
Marek Olšák 2024-04-13 15:28:57 -04:00 committed by Marge Bot
parent 0217a7c007
commit 1632948a76
3 changed files with 15 additions and 7 deletions

View file

@ -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

View file

@ -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 */
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:

View file

@ -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)); \