Mesa (main): pan/midg: Fix swizzling on 8-bit sources
GitLab Mirror
gitlab-mirror at kemper.freedesktop.org
Fri Feb 4 23:24:20 UTC 2022
Module: Mesa
Branch: main
Commit: 39e4b7279dcdcef91a0e829a1938b2816aa4ce75
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=39e4b7279dcdcef91a0e829a1938b2816aa4ce75
Author: Boris Brezillon <boris.brezillon at collabora.com>
Date: Mon Sep 6 12:52:17 2021 +0200
pan/midg: Fix swizzling on 8-bit sources
Even though 8-bit ALUs are not supported, we can have [un]pack_32_4x8
instructions which translate to IMOVs, and those operate on 8-bit
vectors. The problem is, the swizzling granularity is 16 bit, which
means we don't support
MOV.i8 R0.xyzw, TMP0.xxxx, R1.zyxw
and the compiler doesn't even complain, it just applies 8 bit
swizzling directly, which obviously doesn't work.
This is probably not the right way to fix that, but I thought I'd
raised the issue with a hack to fix, so we can get the discussion
started.
(Found while debugging FB store lowering on Midgard).
Signed-off-by: Boris Brezillon <boris.brezillon at collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/14885>
---
src/panfrost/ci/panfrost-t860-fails.txt | 2 --
src/panfrost/midgard/midgard_emit.c | 6 ++++++
src/panfrost/midgard/mir.c | 6 ++++++
3 files changed, 12 insertions(+), 2 deletions(-)
diff --git a/src/panfrost/ci/panfrost-t860-fails.txt b/src/panfrost/ci/panfrost-t860-fails.txt
index 73b25f1ef85..f0d2eee30ce 100644
--- a/src/panfrost/ci/panfrost-t860-fails.txt
+++ b/src/panfrost/ci/panfrost-t860-fails.txt
@@ -90,5 +90,3 @@ dEQP-GLES31.functional.texture.multisample.samples_3.use_texture_uint_2d,Fail
dEQP-GLES31.functional.texture.multisample.samples_3.use_texture_uint_2d_array,Fail
dEQP-GLES31.functional.texture.multisample.samples_4.use_texture_int_2d,Fail
dEQP-GLES31.functional.texture.multisample.samples_4.use_texture_int_2d_array,Fail
-dEQP-GLES31.functional.texture.multisample.samples_4.use_texture_uint_2d,Fail
-dEQP-GLES31.functional.texture.multisample.samples_4.use_texture_uint_2d_array,Fail
diff --git a/src/panfrost/midgard/midgard_emit.c b/src/panfrost/midgard/midgard_emit.c
index bcff2f114af..3d8c61c792f 100644
--- a/src/panfrost/midgard/midgard_emit.c
+++ b/src/panfrost/midgard/midgard_emit.c
@@ -333,6 +333,12 @@ mir_pack_vector_srcs(midgard_instruction *ins, midgard_vector_alu *alu)
unsigned sz = nir_alu_type_get_type_size(ins->src_types[i]);
assert((sz == base_size) || (sz == base_size / 2));
+ /* Promote 8bit moves to 16bit ones so we can support any swizzles. */
+ if (sz == 8 && base_size == 8 && ins->op == midgard_alu_op_imov) {
+ ins->outmod = midgard_outmod_keeplo;
+ base_size = 16;
+ }
+
midgard_src_expand_mode expand_mode = midgard_src_passthrough;
unsigned swizzle = mir_pack_swizzle(ins->mask, ins->swizzle[i],
sz, base_size, channeled,
diff --git a/src/panfrost/midgard/mir.c b/src/panfrost/midgard/mir.c
index 426eab8e812..5d76af80ed8 100644
--- a/src/panfrost/midgard/mir.c
+++ b/src/panfrost/midgard/mir.c
@@ -240,6 +240,12 @@ mir_upper_override(midgard_instruction *ins, unsigned inst_size)
{
unsigned type_size = nir_alu_type_get_type_size(ins->dest_type);
+ /* 8bit imovs are promoted to 16bit ones with .sext on the source and
+ * .keeplo on the destination to accomodate with non-identity swizzles.
+ */
+ if (ins->op == midgard_alu_op_imov && type_size == 8)
+ return 0;
+
/* If the sizes are the same, there's nothing to override */
if (type_size == inst_size)
return -1;
More information about the mesa-commit
mailing list