vc4: Add a little bit more packet parsing to make dump reading easier.
authorEric Anholt <eric@anholt.net>
Fri, 17 Oct 2014 14:04:27 +0000 (15:04 +0100)
committerEric Anholt <eric@anholt.net>
Sat, 18 Oct 2014 09:08:59 +0000 (10:08 +0100)
Probably should have done this *before* staring at all those render lists
today.

src/gallium/drivers/vc4/vc4_cl_dump.c

index a55c04fc144538954ecc98d10e34c059d9fd67b7..6c380219ce18876004ca5919099da240d9fedd36 100644 (file)
 #include "util/macros.h"
 #include "vc4_context.h"
 
-#define PACKET(name, size) [name] = { #name, size }
+#define dump_VC4_PACKET_LINE_WIDTH dump_float
+#define dump_VC4_PACKET_POINT_SIZE dump_float
+
+static void
+dump_float(void *cl, uint32_t offset, uint32_t hw_offset)
+{
+        void *f = cl + offset;
+
+        fprintf(stderr, "0x%08x 0x%08x:      %f (0x%08x)\n",
+                offset, hw_offset, *(float *)f, *(uint32_t *)f);
+}
+
+static void
+dump_VC4_PACKET_BRANCH_TO_SUB_LIST(void *cl, uint32_t offset, uint32_t hw_offset)
+{
+        uint32_t *addr = cl + offset;
+
+        fprintf(stderr, "0x%08x 0x%08x:      addr 0x%08x\n",
+                offset, hw_offset, *addr);
+}
+
+static void
+dump_VC4_PACKET_FLAT_SHADE_FLAGS(void *cl, uint32_t offset, uint32_t hw_offset)
+{
+        uint32_t *bits = cl + offset;
+
+        fprintf(stderr, "0x%08x 0x%08x:      bits 0x%08x\n",
+                offset, hw_offset, *bits);
+}
+
+static void
+dump_VC4_PACKET_VIEWPORT_OFFSET(void *cl, uint32_t offset, uint32_t hw_offset)
+{
+        uint16_t *o = cl + offset;
+
+        fprintf(stderr, "0x%08x 0x%08x:      %f, %f (0x%04x, 0x%04x)\n",
+                offset, hw_offset,
+                o[0] / 16.0, o[1] / 16.0,
+                o[0], o[1]);
+}
+
+static void
+dump_VC4_PACKET_CLIPPER_XY_SCALING(void *cl, uint32_t offset, uint32_t hw_offset)
+{
+        uint32_t *scale = cl + offset;
+
+        fprintf(stderr, "0x%08x 0x%08x:      %f, %f (%f, %f, 0x%08x, 0x%08x)\n",
+                offset, hw_offset,
+                uif(scale[0]) / 16.0, uif(scale[1]) / 16.0,
+                uif(scale[0]), uif(scale[1]),
+                scale[0], scale[1]);
+}
+
+static void
+dump_VC4_PACKET_CLIPPER_Z_SCALING(void *cl, uint32_t offset, uint32_t hw_offset)
+{
+        uint32_t *translate = cl + offset;
+        uint32_t *scale = cl + offset + 8;
+
+        fprintf(stderr, "0x%08x 0x%08x:      %f, %f (0x%08x, 0x%08x)\n",
+                offset, hw_offset,
+                uif(translate[0]), uif(translate[1]),
+                translate[0], translate[1]);
+
+        fprintf(stderr, "0x%08x 0x%08x:      %f, %f (0x%08x, 0x%08x)\n",
+                offset + 8, hw_offset + 8,
+                uif(scale[0]), uif(scale[1]),
+                scale[0], scale[1]);
+}
+
+static void
+dump_VC4_PACKET_TILE_COORDINATES(void *cl, uint32_t offset, uint32_t hw_offset)
+{
+        uint8_t *tilecoords = cl + offset;
+
+        fprintf(stderr, "0x%08x 0x%08x:      %d, %d\n",
+                offset, hw_offset, tilecoords[0], tilecoords[1]);
+}
+
+static void
+dump_VC4_PACKET_GEM_HANDLES(void *cl, uint32_t offset, uint32_t hw_offset)
+{
+        uint32_t *handles = cl + offset;
+
+        fprintf(stderr, "0x%08x 0x%08x:      handle 0: %d, handle 1: %d\n",
+                offset, hw_offset, handles[0], handles[1]);
+}
+
+#define PACKET_DUMP(name, size) [name] = { #name, size, dump_##name }
+#define PACKET(name, size) [name] = { #name, size, NULL }
 
 static const struct packet_info {
         const char *name;
         uint8_t size;
+        void (*dump_func)(void *cl, uint32_t offset, uint32_t hw_offset);
 } packet_info[] = {
         PACKET(VC4_PACKET_HALT, 1),
         PACKET(VC4_PACKET_NOP, 1),
@@ -41,7 +131,7 @@ static const struct packet_info {
         PACKET(VC4_PACKET_WAIT_ON_SEMAPHORE, 1),
 
         PACKET(VC4_PACKET_BRANCH, 5),
-        PACKET(VC4_PACKET_BRANCH_TO_SUB_LIST, 5),
+        PACKET_DUMP(VC4_PACKET_BRANCH_TO_SUB_LIST, 5),
 
         PACKET(VC4_PACKET_STORE_MS_TILE_BUFFER, 1),
         PACKET(VC4_PACKET_STORE_MS_TILE_BUFFER_AND_EOF, 1),
@@ -63,23 +153,23 @@ static const struct packet_info {
         PACKET(VC4_PACKET_VG_SHADER_STATE, 5),
 
         PACKET(VC4_PACKET_CONFIGURATION_BITS, 4),
-        PACKET(VC4_PACKET_FLAT_SHADE_FLAGS, 5),
-        PACKET(VC4_PACKET_POINT_SIZE, 5),
-        PACKET(VC4_PACKET_LINE_WIDTH, 5),
+        PACKET_DUMP(VC4_PACKET_FLAT_SHADE_FLAGS, 5),
+        PACKET_DUMP(VC4_PACKET_POINT_SIZE, 5),
+        PACKET_DUMP(VC4_PACKET_LINE_WIDTH, 5),
         PACKET(VC4_PACKET_RHT_X_BOUNDARY, 3),
         PACKET(VC4_PACKET_DEPTH_OFFSET, 5),
         PACKET(VC4_PACKET_CLIP_WINDOW, 9),
-        PACKET(VC4_PACKET_VIEWPORT_OFFSET, 5),
+        PACKET_DUMP(VC4_PACKET_VIEWPORT_OFFSET, 5),
         PACKET(VC4_PACKET_Z_CLIPPING, 9),
-        PACKET(VC4_PACKET_CLIPPER_XY_SCALING, 9),
-        PACKET(VC4_PACKET_CLIPPER_Z_SCALING, 9),
+        PACKET_DUMP(VC4_PACKET_CLIPPER_XY_SCALING, 9),
+        PACKET_DUMP(VC4_PACKET_CLIPPER_Z_SCALING, 9),
 
         PACKET(VC4_PACKET_TILE_BINNING_MODE_CONFIG, 16),
         PACKET(VC4_PACKET_TILE_RENDERING_MODE_CONFIG, 11),
         PACKET(VC4_PACKET_CLEAR_COLORS, 14),
-        PACKET(VC4_PACKET_TILE_COORDINATES, 3),
+        PACKET_DUMP(VC4_PACKET_TILE_COORDINATES, 3),
 
-        PACKET(VC4_PACKET_GEM_HANDLES, 9),
+        PACKET_DUMP(VC4_PACKET_GEM_HANDLES, 9),
 };
 
 void
@@ -104,16 +194,21 @@ vc4_dump_cl(void *cl, uint32_t size, bool is_render)
                         header != VC4_PACKET_GEM_HANDLES ? hw_offset : 0,
                         header, p->name);
 
-                for (uint32_t i = 1; i < p->size; i++) {
-                        if (offset + i >= size) {
-                                fprintf(stderr, "0x%08x 0x%08x: CL overflow!\n",
-                                        offset + i, hw_offset + i);
-                                return;
+                if (offset + p->size <= size &&
+                    p->dump_func) {
+                        p->dump_func(cmds, offset + 1, hw_offset + 1);
+                } else {
+                        for (uint32_t i = 1; i < p->size; i++) {
+                                if (offset + i >= size) {
+                                        fprintf(stderr, "0x%08x 0x%08x: CL overflow!\n",
+                                                offset + i, hw_offset + i);
+                                        return;
+                                }
+                                fprintf(stderr, "0x%08x 0x%08x: 0x%02x\n",
+                                        offset + i,
+                                        header != VC4_PACKET_GEM_HANDLES ? hw_offset + i : 0,
+                                        cmds[offset + i]);
                         }
-                        fprintf(stderr, "0x%08x 0x%08x: 0x%02x\n",
-                                offset + i,
-                                header != VC4_PACKET_GEM_HANDLES ? hw_offset + i : 0,
-                                cmds[offset + i]);
                 }
 
                 switch (header) {