summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGert Wollny <gert.wollny@collabora.com>2021-01-13 10:28:59 +0100
committerGert Wollny <gert.wollny@collabora.com>2021-02-26 09:51:37 +0100
commit4f4e1e5ed9a20a457181be78646c68944535d83a (patch)
tree4ead5cbf5a3e2cfaf5235fffed4cbd2a0997966b
parentb44c48fd2121986d42d3faeb64027082cadccc51 (diff)
nir: Add flag to tex instruction to indicate lowering cube to array
E.g. r600 a cube texture lookup uses a specific cube instruction to evaluate the sample coordinates and the face ID, so that the cube texture lookup can be lowered to a array texture lookup, thereby sharing the code with the 2D array texture lopkup. However, for TXD the given gradients still need to be three-component vectors, so add a flag that the NIR validation knows that we deal with cube texture that was lowered to an array and can validate accordingly. v2: Handle new flag in serialization (Marek) v3: Rebase so that the change does not require the patch to deduct the number of offset and grad components from sampler type Signed-off-by: Gert Wollny <gert.wollny@collabora.com> Reviewed-by: Marek Olšák <marek.olsak@amd.com> (v2) Acked-by: Eric Anholt <eric@anholt.net> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/9200>
-rw-r--r--src/compiler/nir/nir.h6
-rw-r--r--src/compiler/nir/nir_clone.c1
-rw-r--r--src/compiler/nir/nir_serialize.c5
3 files changed, 10 insertions, 2 deletions
diff --git a/src/compiler/nir/nir.h b/src/compiler/nir/nir.h
index fd35676bf3b..5a88bef0a81 100644
--- a/src/compiler/nir/nir.h
+++ b/src/compiler/nir/nir.h
@@ -2049,6 +2049,9 @@ typedef struct {
/* gather component selector */
unsigned component : 2;
+ /* Validation needs to know this for gradient component count */
+ unsigned array_is_lowered_cube : 1;
+
/* gather offsets */
int8_t tg4_offsets[4][2];
@@ -2268,7 +2271,8 @@ nir_tex_instr_src_size(const nir_tex_instr *instr, unsigned src)
if (instr->src[src].src_type == nir_tex_src_ddx ||
instr->src[src].src_type == nir_tex_src_ddy) {
- if (instr->is_array)
+
+ if (instr->is_array && !instr->array_is_lowered_cube)
return instr->coord_components - 1;
else
return instr->coord_components;
diff --git a/src/compiler/nir/nir_clone.c b/src/compiler/nir/nir_clone.c
index ab3ca607969..b5cffe7eb7e 100644
--- a/src/compiler/nir/nir_clone.c
+++ b/src/compiler/nir/nir_clone.c
@@ -411,6 +411,7 @@ clone_tex(clone_state *state, const nir_tex_instr *tex)
}
ntex->coord_components = tex->coord_components;
ntex->is_array = tex->is_array;
+ ntex->array_is_lowered_cube = tex->array_is_lowered_cube;
ntex->is_shadow = tex->is_shadow;
ntex->is_new_style_shadow = tex->is_new_style_shadow;
ntex->is_sparse = tex->is_sparse;
diff --git a/src/compiler/nir/nir_serialize.c b/src/compiler/nir/nir_serialize.c
index 35f3ba222f8..08bb8e89442 100644
--- a/src/compiler/nir/nir_serialize.c
+++ b/src/compiler/nir/nir_serialize.c
@@ -1460,7 +1460,8 @@ union packed_tex_data {
unsigned component:2;
unsigned texture_non_uniform:1;
unsigned sampler_non_uniform:1;
- unsigned unused:7; /* Mark unused for valgrind. */
+ unsigned array_is_lowered_cube:1;
+ unsigned unused:6; /* Mark unused for valgrind. */
} u;
};
@@ -1496,6 +1497,7 @@ write_tex(write_ctx *ctx, const nir_tex_instr *tex)
.u.component = tex->component,
.u.texture_non_uniform = tex->texture_non_uniform,
.u.sampler_non_uniform = tex->sampler_non_uniform,
+ .u.array_is_lowered_cube = tex->array_is_lowered_cube,
};
blob_write_uint32(ctx->blob, packed.u32);
@@ -1532,6 +1534,7 @@ read_tex(read_ctx *ctx, union packed_instr header)
tex->component = packed.u.component;
tex->texture_non_uniform = packed.u.texture_non_uniform;
tex->sampler_non_uniform = packed.u.sampler_non_uniform;
+ tex->array_is_lowered_cube = packed.u.array_is_lowered_cube;
for (unsigned i = 0; i < tex->num_srcs; i++) {
union packed_src src = read_src(ctx, &tex->src[i].src, &tex->instr);