pan/midgard: Disassemble barrier instructions
authorAlyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
Fri, 24 Jan 2020 02:17:07 +0000 (21:17 -0500)
committerMarge Bot <eric+marge@anholt.net>
Mon, 27 Jan 2020 13:38:41 +0000 (13:38 +0000)
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@collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/merge_requests/3580>

src/panfrost/midgard/disassemble.c
src/panfrost/midgard/midgard.h

index bfa42b17278a172b85da50904df97390a88d4d69..a3eddaa514ac0fb7cc3ace3fe3ab7316aff6c3d8 100644 (file)
@@ -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);
 
index e2ca42a0e1cc8d0b6657b24ce8436df68dd82125..0f6ec698d8ae8ad988d6ee94bb80d8d99d54d84b 100644 (file)
@@ -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];