summaryrefslogtreecommitdiff
path: root/src/panfrost/midgard/midgard_address.c
diff options
context:
space:
mode:
authorAlyssa Rosenzweig <alyssa.rosenzweig@collabora.com>2021-02-07 13:40:03 -0500
committerMarge Bot <eric+marge@anholt.net>2021-02-11 17:24:37 +0000
commit2a82e5836089d26fcb70a3e964b8a395c25f1b9d (patch)
tree2303de5c7c02da97f63305f4471d179701a40089 /src/panfrost/midgard/midgard_address.c
parent73bbf08897545a97edd0e7e1d202ba317bc69968 (diff)
pan/mdg: Optimize UBO offset calculations
LD_UNIFORM supports constant shifts and biases, just like LD, so take advantage of that. Will avoid a regression in code quality from lowering uniforms to UBOs. No shader-db changes. Signed-off-by: Alyssa Rosenzweig <alyssa.rosenzweig@collabora.com> Reviewed-by: Boris Brezillon <boris.brezillon@collabora.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/8973>
Diffstat (limited to 'src/panfrost/midgard/midgard_address.c')
-rw-r--r--src/panfrost/midgard/midgard_address.c34
1 files changed, 28 insertions, 6 deletions
diff --git a/src/panfrost/midgard/midgard_address.c b/src/panfrost/midgard/midgard_address.c
index 3dbbd72eaca..54e942a3457 100644
--- a/src/panfrost/midgard/midgard_address.c
+++ b/src/panfrost/midgard/midgard_address.c
@@ -199,11 +199,11 @@ mir_match_mov(struct mir_address *address)
/* Tries to pattern match into mir_address */
static struct mir_address
-mir_match_offset(nir_ssa_def *offset, bool first_free)
+mir_match_offset(nir_ssa_def *offset, bool first_free, bool extend)
{
struct mir_address address = {
.B = { .def = offset },
- .type = ITYPE_U64,
+ .type = extend ? ITYPE_U64 : ITYPE_U32,
};
mir_match_mov(&address);
@@ -211,9 +211,13 @@ mir_match_offset(nir_ssa_def *offset, bool first_free)
mir_match_mov(&address);
mir_match_iadd(&address, first_free);
mir_match_mov(&address);
- mir_match_u2u64(&address);
- mir_match_i2i64(&address);
- mir_match_mov(&address);
+
+ if (extend) {
+ mir_match_u2u64(&address);
+ mir_match_i2i64(&address);
+ mir_match_mov(&address);
+ }
+
mir_match_ishl(&address);
return address;
@@ -246,7 +250,7 @@ mir_set_offset(compiler_context *ctx, midgard_instruction *ins, nir_src *offset,
bool first_free = (seg == LDST_GLOBAL);
- struct mir_address match = mir_match_offset(offset->ssa, first_free);
+ struct mir_address match = mir_match_offset(offset->ssa, first_free, true);
if (match.A.def) {
ins->src[1] = nir_ssa_index(match.A.def);
@@ -272,3 +276,21 @@ mir_set_offset(compiler_context *ctx, midgard_instruction *ins, nir_src *offset,
ins->constants.u32[0] = match.bias;
}
+
+
+void
+mir_set_ubo_offset(midgard_instruction *ins, nir_src *src, unsigned bias)
+{
+ assert(src->is_ssa);
+ struct mir_address match = mir_match_offset(src->ssa, false, false);
+
+ if (match.B.def) {
+ ins->src[2] = nir_ssa_index(match.B.def);
+
+ for (unsigned i = 0; i < ARRAY_SIZE(ins->swizzle[2]); ++i)
+ ins->swizzle[2][i] = match.B.comp;
+ }
+
+ ins->load_store.arg_2 |= (match.shift) << 5;
+ ins->constants.u32[0] = match.bias + bias;
+}