nir: Propagate the type sampler type change to the used variable.
authorCorentin Noël <corentin.noel@collabora.com>
Tue, 23 May 2023 15:13:07 +0000 (17:13 +0200)
committerMarge Bot <emma+marge@anholt.net>
Wed, 24 May 2023 07:48:18 +0000 (07:48 +0000)
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 <corentin.noel@collabora.com>
Reviewed-by: Jesse Natalie <jenatali@microsoft.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/23183>

src/compiler/nir/nir_remove_tex_shadow.c
src/gallium/drivers/virgl/ci/virpipe-gl-fails.txt

index 2a11048..4d37d64 100644 (file)
 #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;
index 04dc22f..3672ec4 100644 (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.1@line-smooth-stipple,Fail
-spec@arb_fragment_program_shadow@tex-shadow2dnotdepth,Crash