[Mesa-dev] [PATCH 1/2] compiler/nir: add a is_image_sample_dref flag to texture instructions

Iago Toral Quiroga itoral at igalia.com
Wed Mar 28 09:33:14 UTC 2018


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



More information about the mesa-dev mailing list