Mesa (main): pan/bi: Create a mask of UBOs that need to be uploaded

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Sat Jul 3 13:36:07 UTC 2021


Module: Mesa
Branch: main
Commit: aa11c0307af4858cb6205a346ceffdff611e1332
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=aa11c0307af4858cb6205a346ceffdff611e1332

Author: Icecream95 <ixn at disroot.org>
Date:   Tue May 18 14:19:57 2021 +1200

pan/bi: Create a mask of UBOs that need to be uploaded

Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/11700>

---

 src/panfrost/bifrost/bi_opt_push_ubo.c | 35 +++++++++++++++++++++++++++++-----
 src/panfrost/bifrost/compiler.h        |  3 +++
 2 files changed, 33 insertions(+), 5 deletions(-)

diff --git a/src/panfrost/bifrost/bi_opt_push_ubo.c b/src/panfrost/bifrost/bi_opt_push_ubo.c
index 8debdd486fd..caaa5ee872f 100644
--- a/src/panfrost/bifrost/bi_opt_push_ubo.c
+++ b/src/panfrost/bifrost/bi_opt_push_ubo.c
@@ -30,10 +30,16 @@
  * structure returned back to the command stream. */
 
 static bool
-bi_is_direct_aligned_ubo(bi_instr *ins)
+bi_is_ubo(bi_instr *ins)
 {
         return (bi_opcode_props[ins->op].message == BIFROST_MESSAGE_LOAD) &&
-                (ins->seg == BI_SEG_UBO) &&
+                (ins->seg == BI_SEG_UBO);
+}
+
+static bool
+bi_is_direct_aligned_ubo(bi_instr *ins)
+{
+        return bi_is_ubo(ins) &&
                 (ins->src[0].type == BI_INDEX_CONSTANT) &&
                 (ins->src[1].type == BI_INDEX_CONSTANT) &&
                 ((ins->src[0].value & 0x3) == 0);
@@ -118,8 +124,11 @@ bi_pick_ubo(struct panfrost_ubo_push *push, struct bi_ubo_analysis *analysis)
 void
 bi_opt_push_ubo(bi_context *ctx)
 {
-        if (ctx->inputs->no_ubo_to_push)
+        if (ctx->inputs->no_ubo_to_push) {
+                /* If nothing is pushed, all UBOs need to be uploaded */
+                ctx->ubo_mask = ~0;
                 return;
+        }
 
         /* This pass only runs once */
         assert(ctx->info->push.count == 0);
@@ -127,15 +136,31 @@ bi_opt_push_ubo(bi_context *ctx)
         struct bi_ubo_analysis analysis = bi_analyze_ranges(ctx);
         bi_pick_ubo(&ctx->info->push, &analysis);
 
+        ctx->ubo_mask = 0;
+
         bi_foreach_instr_global_safe(ctx, ins) {
-                if (!bi_is_direct_aligned_ubo(ins)) continue;
+                if (!bi_is_ubo(ins)) continue;
 
                 unsigned ubo = ins->src[1].value;
                 unsigned offset = ins->src[0].value;
 
+                if (!bi_is_direct_aligned_ubo(ins)) {
+                        /* The load can't be pushed, so this UBO needs to be
+                         * uploaded conventionally */
+                        if (ins->src[1].type == BI_INDEX_CONSTANT)
+                                ctx->ubo_mask |= BITSET_BIT(ubo);
+                        else
+                                ctx->ubo_mask = ~0;
+
+                        continue;
+                }
+
                 /* Check if we decided to push this */
                 assert(ubo < analysis.nr_blocks);
-                if (!BITSET_TEST(analysis.blocks[ubo].pushed, offset / 4)) continue;
+                if (!BITSET_TEST(analysis.blocks[ubo].pushed, offset / 4)) {
+                        ctx->ubo_mask |= BITSET_BIT(ubo);
+                        continue;
+                }
 
                 /* Replace the UBO load with moves from FAU */
                 bi_builder b = bi_init_builder(ctx, bi_after_instr(ins));
diff --git a/src/panfrost/bifrost/compiler.h b/src/panfrost/bifrost/compiler.h
index 09d3f10f722..68b5c4025a1 100644
--- a/src/panfrost/bifrost/compiler.h
+++ b/src/panfrost/bifrost/compiler.h
@@ -553,6 +553,9 @@ typedef struct {
        /* Analysis results */
        bool has_liveness;
 
+       /* Mask of UBOs that need to be uploaded */
+       uint32_t ubo_mask;
+
        /* Stats for shader-db */
        unsigned instruction_count;
        unsigned loop_count;



More information about the mesa-commit mailing list