mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-21 09:20:12 +01:00
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:
parent
f4aa99f0da
commit
1a8dd84ec6
2 changed files with 49 additions and 1 deletions
|
|
@ -24,6 +24,40 @@
|
|||
#include "nir.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
|
||||
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);
|
||||
|
||||
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;
|
||||
nir_tex_instr_remove_src(tex, index);
|
||||
return true;
|
||||
|
|
|
|||
|
|
@ -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.1@line-smooth-stipple,Fail
|
||||
spec@arb_fragment_program_shadow@tex-shadow2dnotdepth,Crash
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue