mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-20 22:30:12 +01:00
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:
parent
0217a7c007
commit
1632948a76
3 changed files with 15 additions and 7 deletions
|
|
@ -85,7 +85,8 @@ v3d_nir_store_output(nir_builder *b, int base, nir_def *offset,
|
||||||
offset = nir_imm_int(b, 0);
|
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
|
static int
|
||||||
|
|
|
||||||
|
|
@ -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)));
|
util_is_power_of_two_nonzero(nir_intrinsic_align_mul(instr)));
|
||||||
validate_assert(state, nir_intrinsic_align_offset(instr) <
|
validate_assert(state, nir_intrinsic_align_offset(instr) <
|
||||||
nir_intrinsic_align_mul(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_output:
|
||||||
case nir_intrinsic_store_per_vertex_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);
|
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;
|
break;
|
||||||
|
|
||||||
case nir_intrinsic_deref_mode_is:
|
case nir_intrinsic_deref_mode_is:
|
||||||
|
|
|
||||||
|
|
@ -16,7 +16,7 @@ TEST_F(nir_opt_varyings_test_dead_output, \
|
||||||
create_shaders(MESA_SHADER_##producer_stage, MESA_SHADER_##consumer_stage); \
|
create_shaders(MESA_SHADER_##producer_stage, MESA_SHADER_##consumer_stage); \
|
||||||
nir_intrinsic_instr *intr = \
|
nir_intrinsic_instr *intr = \
|
||||||
store_output(b1, VARYING_SLOT_##slot, 0, nir_type_float##bitsize, \
|
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(opt_varyings() == nir_progress_producer); \
|
||||||
ASSERT_TRUE(b1->shader->info.outputs_written == 0 && \
|
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); \
|
create_shaders(MESA_SHADER_##producer_stage, MESA_SHADER_##consumer_stage); \
|
||||||
nir_intrinsic_instr *intr = \
|
nir_intrinsic_instr *intr = \
|
||||||
store_output(b1, VARYING_SLOT_##slot, 0, nir_type_float##bitsize, \
|
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(opt_varyings() == 0); \
|
||||||
ASSERT_TRUE(b1->shader->info.outputs_written == VARYING_BIT_##slot); \
|
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); \
|
create_shaders(MESA_SHADER_##producer_stage, MESA_SHADER_##consumer_stage); \
|
||||||
nir_intrinsic_instr *intr = \
|
nir_intrinsic_instr *intr = \
|
||||||
store_output(b1, VARYING_SLOT_##slot, 0, nir_type_float##bitsize, \
|
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; \
|
struct nir_io_xfb xfb; \
|
||||||
memset(&xfb, 0, sizeof(xfb)); \
|
memset(&xfb, 0, sizeof(xfb)); \
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue