nir: Propagate the type sampler type change to the used variable.

Avoid keeping a mismatching type between the sampler declaration and its
use.

In the case of virgl, we were hitting sanity checks when running the
spec@arb_fragment_program_shadow@tex-shadow2dnotdepth piglit test.

Fixes: 0843d4cbc3

Signed-off-by: Corentin Noël <corentin.noel@collabora.com>
Reviewed-by: Jesse Natalie <jenatali@microsoft.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/23183>
This commit is contained in:
Corentin Noël 2023-05-23 17:13:07 +02:00 committed by Marge Bot
parent f4aa99f0da
commit 1a8dd84ec6
2 changed files with 49 additions and 1 deletions

View file

@ -24,6 +24,40 @@
#include "nir.h" #include "nir.h"
#include "nir_builder.h" #include "nir_builder.h"
static const struct glsl_type *
strip_shadow(const struct glsl_type *type)
{
const struct glsl_type *new_type =
glsl_sampler_type(
glsl_get_sampler_dim(type),
false, glsl_sampler_type_is_array(type),
GLSL_TYPE_FLOAT);
return new_type;
}
static inline const struct glsl_type *
strip_shadow_with_array(const struct glsl_type *type)
{
return glsl_type_wrap_in_arrays(strip_shadow(glsl_without_array(type)), type);
}
static bool
change_deref_var_type(struct nir_builder *b, nir_instr *instr, void *data)
{
if (instr->type != nir_instr_type_deref)
return false;
nir_variable *sampler = data;
nir_deref_instr *deref = nir_instr_as_deref (instr);
if (deref->var == sampler) {
deref->type = sampler->type;
return true;
}
return false;
}
static bool static bool
remove_tex_shadow(struct nir_builder *b, nir_instr *instr, void *data) remove_tex_shadow(struct nir_builder *b, nir_instr *instr, void *data)
{ {
@ -43,6 +77,21 @@ remove_tex_shadow(struct nir_builder *b, nir_instr *instr, void *data)
int index = nir_tex_instr_src_index(tex, nir_tex_src_comparator); int index = nir_tex_instr_src_index(tex, nir_tex_src_comparator);
if (index != -1) { if (index != -1) {
nir_deref_instr *sampler_deref = NULL;
nir_variable *sampler = NULL;
int sampler_src_index = nir_tex_instr_src_index(tex, nir_tex_src_sampler_deref);
if (sampler_src_index >= 0) {
sampler_deref = nir_instr_as_deref(tex->src[sampler_src_index].src.ssa->parent_instr);
sampler = nir_deref_instr_get_variable(sampler_deref);
sampler->type = strip_shadow_with_array(sampler->type);
sampler_deref->type = sampler->type;
} else {
sampler = nir_find_variable_with_location(b->shader, nir_var_uniform, tex->sampler_index);
sampler->type = strip_shadow_with_array(sampler->type);
}
nir_shader_instructions_pass(b->shader, change_deref_var_type,
nir_metadata_none, sampler);
tex->is_shadow = false; tex->is_shadow = false;
nir_tex_instr_remove_src(tex, index); nir_tex_instr_remove_src(tex, index);
return true; return true;

View file

@ -698,4 +698,3 @@ spec@!opengl 1.0@depth-clear-precision-check,Fail
spec@!opengl 1.0@depth-clear-precision-check@depth32,Fail spec@!opengl 1.0@depth-clear-precision-check@depth32,Fail
spec@!opengl 1.1@line-smooth-stipple,Fail spec@!opengl 1.1@line-smooth-stipple,Fail
spec@arb_fragment_program_shadow@tex-shadow2dnotdepth,Crash