Module: Mesa
Branch: main
Commit: 1a8dd84ec613f6e89ef5f180d79cddde0cd93d52
URL:    
http://cgit.freedesktop.org/mesa/mesa/commit/?id=1a8dd84ec613f6e89ef5f180d79cddde0cd93d52

Author: Corentin Noël <[email protected]>
Date:   Tue May 23 17:13:07 2023 +0200

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: 0843d4cbc3546a80d76109c892a1e1a3b847dd55

Signed-off-by: Corentin Noël <[email protected]>
Reviewed-by: Jesse Natalie <[email protected]>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/23183>

---

 src/compiler/nir/nir_remove_tex_shadow.c          | 49 +++++++++++++++++++++++
 src/gallium/drivers/virgl/ci/virpipe-gl-fails.txt |  1 -
 2 files changed, 49 insertions(+), 1 deletion(-)

diff --git a/src/compiler/nir/nir_remove_tex_shadow.c 
b/src/compiler/nir/nir_remove_tex_shadow.c
index 2a1104802d2..4d37d64df10 100644
--- a/src/compiler/nir/nir_remove_tex_shadow.c
+++ b/src/compiler/nir/nir_remove_tex_shadow.c
@@ -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;
diff --git a/src/gallium/drivers/virgl/ci/virpipe-gl-fails.txt 
b/src/gallium/drivers/virgl/ci/virpipe-gl-fails.txt
index 04dc22f64c0..3672ec4b1a5 100644
--- a/src/gallium/drivers/virgl/ci/virpipe-gl-fails.txt
+++ b/src/gallium/drivers/virgl/ci/virpipe-gl-fails.txt
@@ -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

Reply via email to