How is this different from is_shadow?

On March 28, 2018 02:33:50 Iago Toral Quiroga <ito...@igalia.com> wrote:

So we can recognize image sampling instructions that involve a depth
comparison against a reference, such as SPIR-V's
OpImageSample{Proj}Dref{Explicit,Implicit}Lod and we can acknowledge
that they return a single scalar value instead of a vec4.
---
src/compiler/nir/nir.h           | 9 +++++++++
src/compiler/nir/nir_clone.c     | 1 +
src/compiler/nir/nir_instr_set.c | 2 ++
src/compiler/nir/nir_lower_tex.c | 5 ++++-
src/compiler/nir/nir_serialize.c | 5 ++++-
5 files changed, 20 insertions(+), 2 deletions(-)

diff --git a/src/compiler/nir/nir.h b/src/compiler/nir/nir.h
index 0d207d0ea5..625092cd2b 100644
--- a/src/compiler/nir/nir.h
+++ b/src/compiler/nir/nir.h
@@ -1231,6 +1231,12 @@ typedef struct {
    */
   bool is_new_style_shadow;

+   /**
+    * If is_image_sample_dref is true, this is an image sample with depth
+    * comparing.
+    */
+   bool is_image_sample_dref;
+
   /* gather component selector */
   unsigned component : 2;

@@ -1316,6 +1322,9 @@ nir_tex_instr_dest_size(const nir_tex_instr *instr)
      if (instr->is_shadow && instr->is_new_style_shadow)
         return 1;

+      if (instr->is_image_sample_dref)
+         return 1;
+
      return 4;
   }
}
diff --git a/src/compiler/nir/nir_clone.c b/src/compiler/nir/nir_clone.c
index bcfdaa7594..7d6cfd896f 100644
--- a/src/compiler/nir/nir_clone.c
+++ b/src/compiler/nir/nir_clone.c
@@ -415,6 +415,7 @@ clone_tex(clone_state *state, const nir_tex_instr *tex)
   ntex->is_array = tex->is_array;
   ntex->is_shadow = tex->is_shadow;
   ntex->is_new_style_shadow = tex->is_new_style_shadow;
+   ntex->is_image_sample_dref = tex->is_image_sample_dref;
   ntex->component = tex->component;

   ntex->texture_index = tex->texture_index;
diff --git a/src/compiler/nir/nir_instr_set.c b/src/compiler/nir/nir_instr_set.c
index 9cb9ed43e8..5563f6f095 100644
--- a/src/compiler/nir/nir_instr_set.c
+++ b/src/compiler/nir/nir_instr_set.c
@@ -155,6 +155,7 @@ hash_tex(uint32_t hash, const nir_tex_instr *instr)
   hash = HASH(hash, instr->is_array);
   hash = HASH(hash, instr->is_shadow);
   hash = HASH(hash, instr->is_new_style_shadow);
+   hash = HASH(hash, instr->is_image_sample_dref);
   unsigned component = instr->component;
   hash = HASH(hash, component);
   hash = HASH(hash, instr->texture_index);
@@ -310,6 +311,7 @@ nir_instrs_equal(const nir_instr *instr1, const nir_instr *instr2)
          tex1->is_array != tex2->is_array ||
          tex1->is_shadow != tex2->is_shadow ||
          tex1->is_new_style_shadow != tex2->is_new_style_shadow ||
+          tex1->is_image_sample_dref != tex2->is_image_sample_dref ||
          tex1->component != tex2->component ||
         tex1->texture_index != tex2->texture_index ||
         tex1->texture_array_size != tex2->texture_array_size ||
diff --git a/src/compiler/nir/nir_lower_tex.c b/src/compiler/nir/nir_lower_tex.c
index 1062afd97f..03e7555679 100644
--- a/src/compiler/nir/nir_lower_tex.c
+++ b/src/compiler/nir/nir_lower_tex.c
@@ -114,6 +114,7 @@ get_texture_size(nir_builder *b, nir_tex_instr *tex)
   txs->is_array = tex->is_array;
   txs->is_shadow = tex->is_shadow;
   txs->is_new_style_shadow = tex->is_new_style_shadow;
+   txs->is_image_sample_dref = tex->is_image_sample_dref;
   txs->texture_index = tex->texture_index;
   txs->texture = nir_deref_var_clone(tex->texture, txs);
   txs->sampler_index = tex->sampler_index;
@@ -343,6 +344,7 @@ replace_gradient_with_lod(nir_builder *b, nir_ssa_def *lod, nir_tex_instr *tex)
   txl->is_array = tex->is_array;
   txl->is_shadow = tex->is_shadow;
   txl->is_new_style_shadow = tex->is_new_style_shadow;
+   txl->is_image_sample_dref = tex->is_image_sample_dref;
   txl->sampler_index = tex->sampler_index;
   txl->texture = nir_deref_var_clone(tex->texture, txl);
   txl->sampler = nir_deref_var_clone(tex->sampler, txl);
@@ -794,7 +796,8 @@ nir_lower_tex_block(nir_block *block, nir_builder *b,

      if (((1 << tex->texture_index) & options->swizzle_result) &&
          !nir_tex_instr_is_query(tex) &&
-          !(tex->is_shadow && tex->is_new_style_shadow)) {
+          !(tex->is_shadow && tex->is_new_style_shadow) &&
+          !tex->is_image_sample_dref) {
         swizzle_result(b, tex, options->swizzles[tex->texture_index]);
         progress = true;
      }
diff --git a/src/compiler/nir/nir_serialize.c b/src/compiler/nir/nir_serialize.c
index 00df49c2ef..dcbe1f0c13 100644
--- a/src/compiler/nir/nir_serialize.c
+++ b/src/compiler/nir/nir_serialize.c
@@ -583,10 +583,11 @@ union packed_tex_data {
      unsigned is_array:1;
      unsigned is_shadow:1;
      unsigned is_new_style_shadow:1;
+      unsigned is_image_sample_dref:1;
      unsigned component:2;
      unsigned has_texture_deref:1;
      unsigned has_sampler_deref:1;
-      unsigned unused:10; /* Mark unused for valgrind. */
+      unsigned unused:9; /* Mark unused for valgrind. */
   } u;
};

@@ -607,6 +608,7 @@ write_tex(write_ctx *ctx, const nir_tex_instr *tex)
      .u.is_array = tex->is_array,
      .u.is_shadow = tex->is_shadow,
      .u.is_new_style_shadow = tex->is_new_style_shadow,
+      .u.is_image_sample_dref = tex->is_image_sample_dref,
      .u.component = tex->component,
      .u.has_texture_deref = tex->texture != NULL,
      .u.has_sampler_deref = tex->sampler != NULL,
@@ -644,6 +646,7 @@ read_tex(read_ctx *ctx)
   tex->is_array = packed.u.is_array;
   tex->is_shadow = packed.u.is_shadow;
   tex->is_new_style_shadow = packed.u.is_new_style_shadow;
+   tex->is_image_sample_dref = packed.u.is_image_sample_dref;
   tex->component = packed.u.component;

   read_dest(ctx, &tex->dest, &tex->instr);
--
2.14.1

_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev



_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to