nir: create validate_tex_src_texture_deref() helper

Will be used in a following patch.

Acked-by: Marek Olšák <marek.olsak@amd.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/30315>
This commit is contained in:
Timothy Arceri
2024-07-23 12:57:38 +10:00
committed by Marge Bot
parent 3631196414
commit ef13ff00d1

View File

@@ -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 static void
validate_tex_instr(nir_tex_instr *instr, validate_state *state) 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)) if (!validate_assert(state, deref))
break; break;
validate_assert(state, glsl_type_is_image(deref->type) || validate_tex_src_texture_deref(instr, state, deref);
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));
}
break; break;
} }