[Mesa-dev] [PATCH v2 3/5] i965: Use aubinator/genxml for INTEL_DEBUG=bat commands.

Kenneth Graunke kenneth at whitecape.org
Mon Mar 20 22:04:18 UTC 2017


This should give substantially better decoding, as the public libdrm
decoder hasn't been properly maintained in years.

For now, we reuse the existing state dumping mechanism.  We'll improve
that in the next patch.

To avoid increasing the size of the driver, we restrict this feature
to debug builds of Mesa.  There's probably very little use for it in
release builds anyway.

Reviewed-by: Lionel Landwerlin <lionel.g.landwerlin at intel.com>
---
 src/mesa/drivers/dri/i965/intel_batchbuffer.c | 60 +++++++++++++++++----------
 1 file changed, 39 insertions(+), 21 deletions(-)

Less build system nuttiness, and now we #ifdef DEBUG to avoid
bloating the driver with a lot of stuff that nobody's going to care
about in release mode.

diff --git a/src/mesa/drivers/dri/i965/intel_batchbuffer.c b/src/mesa/drivers/dri/i965/intel_batchbuffer.c
index 887504273ab..522114ec23c 100644
--- a/src/mesa/drivers/dri/i965/intel_batchbuffer.c
+++ b/src/mesa/drivers/dri/i965/intel_batchbuffer.c
@@ -31,6 +31,7 @@
 #include "brw_context.h"
 #include "brw_defines.h"
 #include "brw_state.h"
+#include "common/gen_decoder.h"
 
 #include <xf86drm.h>
 #include <i915_drm.h>
@@ -135,45 +136,62 @@ intel_batchbuffer_require_space(struct brw_context *brw, GLuint sz,
    brw->batch.ring = ring;
 }
 
+#ifdef DEBUG
+#define CSI "\e["
+#define BLUE_HEADER  CSI "0;44m"
+#define NORMAL       CSI "0m"
+
 static void
 do_batch_dump(struct brw_context *brw)
 {
-   struct drm_intel_decode *decode;
    struct intel_batchbuffer *batch = &brw->batch;
-   int ret;
+   struct gen_spec *spec = gen_spec_load(&brw->screen->devinfo);
 
-   decode = drm_intel_decode_context_alloc(brw->screen->deviceID);
-   if (!decode)
+   if (batch->ring != RENDER_RING)
       return;
 
-   ret = drm_intel_bo_map(batch->bo, false);
-   if (ret == 0) {
-      drm_intel_decode_set_batch_pointer(decode,
-					 batch->bo->virtual,
-					 batch->bo->offset64,
-                                         USED_BATCH(*batch));
-   } else {
+   int ret = drm_intel_bo_map(batch->bo, false);
+   if (ret != 0) {
       fprintf(stderr,
 	      "WARNING: failed to map batchbuffer (%s), "
 	      "dumping uploaded data instead.\n", strerror(ret));
-
-      drm_intel_decode_set_batch_pointer(decode,
-					 batch->map,
-					 batch->bo->offset64,
-                                         USED_BATCH(*batch));
    }
 
-   drm_intel_decode_set_output_file(decode, stderr);
-   drm_intel_decode(decode);
+   uint32_t *data = batch->bo->virtual ? batch->bo->virtual : batch->map;
+   uint32_t *end = data + USED_BATCH(*batch);
+   uint32_t gtt_offset = batch->bo->virtual ? batch->bo->offset64 : 0;
+   unsigned int length;
+
+   bool color = INTEL_DEBUG & DEBUG_COLOR;
+   const char *header_color = color ? BLUE_HEADER : "";
+   const char *reset_color  = color ? NORMAL : "";
+
+   for (uint32_t *p = data; p < end; p += length) {
+      struct gen_group *inst = gen_spec_find_instruction(spec, p);
+      if (inst == NULL) {
+         fprintf(stderr, "unknown instruction %08x\n", p[0]);
+         length = (p[0] & 0xff) + 2;
+         continue;
+      }
+
+      uint64_t offset = gtt_offset + 4 * (p - data);
 
-   drm_intel_decode_context_free(decode);
+      fprintf(stderr, "%s0x%08"PRIx64":  0x%08x:  %-80s%s\n", header_color,
+              offset, p[0], gen_group_get_name(inst), reset_color);
+
+      gen_print_group(stderr, inst, offset, p, 1, color);
+      length = gen_group_get_length(inst, p);
+   }
 
    if (ret == 0) {
       drm_intel_bo_unmap(batch->bo);
-
-      brw_debug_batch(brw);
    }
+
+   brw_debug_batch(brw);
 }
+#else
+static void do_batch_dump(struct brw_context *brw) { }
+#endif
 
 /**
  * Called when starting a new batch buffer.
-- 
2.12.0



More information about the mesa-dev mailing list