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

Jason Ekstrand jason at jlekstrand.net
Thu Mar 29 00:19:50 UTC 2018


How is this different from is_shadow?

On March 28, 2018 02:33:50 Iago Toral Quiroga <itoral at 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 at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev





More information about the mesa-dev mailing list