[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