diff --git a/src/compiler/nir/nir_validate.c b/src/compiler/nir/nir_validate.c index 16e75fabb3b..8e931031405 100644 --- a/src/compiler/nir/nir_validate.c +++ b/src/compiler/nir/nir_validate.c @@ -805,6 +805,44 @@ validate_intrinsic_instr(nir_intrinsic_instr *instr, validate_state *state) } } +static void +validate_tex_src_texture_deref(nir_tex_instr *instr, validate_state *state, + nir_deref_instr *deref) +{ + validate_assert(state, glsl_type_is_image(deref->type) || + glsl_type_is_texture(deref->type) || + glsl_type_is_sampler(deref->type)); + + switch (instr->op) { + case nir_texop_descriptor_amd: + case nir_texop_sampler_descriptor_amd: + case nir_texop_custom_border_color_agx: + break; + case nir_texop_lod: + case nir_texop_lod_bias_agx: + validate_assert(state, nir_alu_type_get_base_type(instr->dest_type) == nir_type_float); + break; + case nir_texop_samples_identical: + case nir_texop_has_custom_border_color_agx: + validate_assert(state, nir_alu_type_get_base_type(instr->dest_type) == nir_type_bool); + break; + case nir_texop_txs: + case nir_texop_texture_samples: + case nir_texop_query_levels: + case nir_texop_fragment_mask_fetch_amd: + case nir_texop_txf_ms_mcs_intel: + validate_assert(state, nir_alu_type_get_base_type(instr->dest_type) == nir_type_int || + nir_alu_type_get_base_type(instr->dest_type) == nir_type_uint); + break; + default: + validate_assert(state, + glsl_get_sampler_result_type(deref->type) == GLSL_TYPE_VOID || + glsl_base_type_is_integer(glsl_get_sampler_result_type(deref->type)) == + (nir_alu_type_get_base_type(instr->dest_type) == nir_type_int || + nir_alu_type_get_base_type(instr->dest_type) == nir_type_uint)); + } +} + static void validate_tex_instr(nir_tex_instr *instr, validate_state *state) { @@ -847,38 +885,7 @@ validate_tex_instr(nir_tex_instr *instr, validate_state *state) if (!validate_assert(state, deref)) break; - validate_assert(state, glsl_type_is_image(deref->type) || - glsl_type_is_texture(deref->type) || - glsl_type_is_sampler(deref->type)); - switch (instr->op) { - case nir_texop_descriptor_amd: - case nir_texop_sampler_descriptor_amd: - case nir_texop_custom_border_color_agx: - break; - case nir_texop_lod: - case nir_texop_lod_bias_agx: - validate_assert(state, nir_alu_type_get_base_type(instr->dest_type) == nir_type_float); - break; - case nir_texop_samples_identical: - case nir_texop_has_custom_border_color_agx: - validate_assert(state, nir_alu_type_get_base_type(instr->dest_type) == nir_type_bool); - break; - case nir_texop_txs: - case nir_texop_texture_samples: - case nir_texop_query_levels: - case nir_texop_fragment_mask_fetch_amd: - case nir_texop_txf_ms_mcs_intel: - validate_assert(state, nir_alu_type_get_base_type(instr->dest_type) == nir_type_int || - nir_alu_type_get_base_type(instr->dest_type) == nir_type_uint); - - break; - default: - validate_assert(state, - glsl_get_sampler_result_type(deref->type) == GLSL_TYPE_VOID || - glsl_base_type_is_integer(glsl_get_sampler_result_type(deref->type)) == - (nir_alu_type_get_base_type(instr->dest_type) == nir_type_int || - nir_alu_type_get_base_type(instr->dest_type) == nir_type_uint)); - } + validate_tex_src_texture_deref(instr, state, deref); break; }