Mesa (master): pan/midgard: Disassemble barrier instructions

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Mon Jan 27 14:06:14 UTC 2020


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

Author: Alyssa Rosenzweig <alyssa.rosenzweig at collabora.com>
Date:   Thu Jan 23 21:17:07 2020 -0500

pan/midgard: Disassemble barrier instructions

We don't need to print all the usual texture noise; just the relevant
fields and the rest can be guarded to zero.

Signed-off-by: Alyssa Rosenzweig <alyssa.rosenzweig at collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/merge_requests/3580>

---

 src/panfrost/midgard/disassemble.c | 35 +++++++++++++++++++++++++++++++++++
 src/panfrost/midgard/midgard.h     | 28 +++++++++++++++++++++++++---
 2 files changed, 60 insertions(+), 3 deletions(-)

diff --git a/src/panfrost/midgard/disassemble.c b/src/panfrost/midgard/disassemble.c
index bfa42b17278..a3eddaa514a 100644
--- a/src/panfrost/midgard/disassemble.c
+++ b/src/panfrost/midgard/disassemble.c
@@ -1283,6 +1283,35 @@ sampler_type_name(enum mali_sampler_type t)
 
 }
 
+static void
+print_texture_barrier(FILE *fp, uint32_t *word)
+{
+        midgard_texture_barrier_word *barrier = (midgard_texture_barrier_word *) word;
+
+        if (!barrier->cont)
+                fprintf(fp, "/* cont missing? */");
+
+        if (!barrier->last)
+                fprintf(fp, "/* last missing? */");
+
+        if (barrier->zero1)
+                fprintf(fp, "/* zero1 = 0x%X */ ", barrier->zero1);
+
+        if (barrier->zero2)
+                fprintf(fp, "/* zero2 = 0x%X */ ", barrier->zero2);
+
+        if (barrier->zero3)
+                fprintf(fp, "/* zero3 = 0x%X */ ", barrier->zero3);
+
+        if (barrier->zero4)
+                fprintf(fp, "/* zero4 = 0x%X */ ", barrier->zero4);
+
+        if (barrier->zero5)
+                fprintf(fp, "/* zero4 = 0x%" PRIx64 " */ ", barrier->zero5);
+
+        fprintf(fp, " 0x%X\n", barrier->unknown4);
+}
+
 #undef DEFINE_CASE
 
 static void
@@ -1296,6 +1325,12 @@ print_texture_word(FILE *fp, uint32_t *word, unsigned tabs, unsigned in_reg_base
         /* Broad category of texture operation in question */
         print_texture_op(fp, texture->op, texture->is_gather);
 
+        /* Barriers use a dramatically different code path */
+        if (texture->op == TEXTURE_OP_BARRIER) {
+                print_texture_barrier(fp, word);
+                return;
+        }
+
         /* Specific format in question */
         print_texture_format(fp, texture->format);
 
diff --git a/src/panfrost/midgard/midgard.h b/src/panfrost/midgard/midgard.h
index e2ca42a0e1c..0f6ec698d8a 100644
--- a/src/panfrost/midgard/midgard.h
+++ b/src/panfrost/midgard/midgard.h
@@ -745,9 +745,31 @@ __attribute__((__packed__))
 }
 midgard_texture_word;
 
-/* Up to 16 constant bytes can be embedded in a bundle. This union describes
- * all possible layouts.
- */
+/* Technically barriers are texture instructions but it's less work to add them
+ * as an explicitly zeroed special case, since most fields are forced to go to
+ * zero */
+
+typedef struct
+__attribute__((__packed__))
+{
+        unsigned type      : 4;
+        unsigned next_type : 4;
+
+        /* op = TEXTURE_OP_BARRIER */
+        unsigned op  : 6;
+        unsigned zero1    : 2;
+
+        /* Since helper invocations don't make any sense, these are forced to one */
+        unsigned cont  : 1;
+        unsigned last  : 1;
+        unsigned zero2 : 14;
+
+        unsigned zero3 : 24;
+        unsigned unknown4 : 1;
+        unsigned zero4 : 7;
+
+        uint64_t zero5;
+} midgard_texture_barrier_word;
 
 typedef union midgard_constants {
         double f64[2];



More information about the mesa-commit mailing list