mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-21 11:30:11 +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.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;
|
||||||
|
|
|
||||||
|
|
@ -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
|
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue