Add drm_intel_bufmgr_gem_set_aub_state_only to disable dumping of unannotated
or untyped data.  The result should still be a valid AUB dump, in that it can
be fed to the simulator.  But it will not trigger execution.

This can be used to dump states in binary form.

Signed-off-by: Chia-I Wu <olva...@gmail.com>
---
 intel/intel_bufmgr.h     |  3 +++
 intel/intel_bufmgr_gem.c | 47 +++++++++++++++++++++++++++++++++++++++++++----
 2 files changed, 46 insertions(+), 4 deletions(-)

diff --git a/intel/intel_bufmgr.h b/intel/intel_bufmgr.h
index 9383c72..46c25ce 100644
--- a/intel/intel_bufmgr.h
+++ b/intel/intel_bufmgr.h
@@ -180,6 +180,9 @@ void drm_intel_gem_bo_start_gtt_access(drm_intel_bo *bo, 
int write_enable);
 void
 drm_intel_bufmgr_gem_set_aub_filename(drm_intel_bufmgr *bufmgr,
                                      const char *filename);
+void
+drm_intel_bufmgr_gem_set_aub_state_only(drm_intel_bufmgr *bufmgr,
+                                       int enable);
 void drm_intel_bufmgr_gem_set_aub_dump(drm_intel_bufmgr *bufmgr, int enable);
 void drm_intel_gem_bo_aub_dump_bmp(drm_intel_bo *bo,
                                   int x1, int y1, int width, int height,
diff --git a/intel/intel_bufmgr_gem.c b/intel/intel_bufmgr_gem.c
index 007a6d8..c91cc3f 100644
--- a/intel/intel_bufmgr_gem.c
+++ b/intel/intel_bufmgr_gem.c
@@ -129,6 +129,7 @@ typedef struct _drm_intel_bufmgr_gem {
        bool fenced_relocs;
 
        char *aub_filename;
+       int aub_state_only;
        FILE *aub_file;
        uint32_t aub_offset;
 } drm_intel_bufmgr_gem;
@@ -2018,6 +2019,7 @@ aub_write_large_trace_block(drm_intel_bo *bo, uint32_t 
type, uint32_t subtype,
 static void
 aub_write_bo(drm_intel_bo *bo)
 {
+       drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *) bo->bufmgr;
        drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo;
        uint32_t offset = 0;
        unsigned i;
@@ -2029,19 +2031,42 @@ aub_write_bo(drm_intel_bo *bo)
                drm_intel_aub_annotation *annotation =
                        &bo_gem->aub_annotations[i];
                uint32_t ending_offset = annotation->ending_offset;
+               bool write;
+
+               if (ending_offset <= offset)
+                  continue;
+
                if (ending_offset > bo->size)
                        ending_offset = bo->size;
-               if (ending_offset > offset) {
+
+               if (bufmgr_gem->aub_state_only) {
+                       switch (annotation->type) {
+                       case AUB_TRACE_TYPE_BATCH:
+                       case AUB_TRACE_TYPE_CONSTANT_BUFFER:
+                       case AUB_TRACE_TYPE_GENERAL:
+                       case AUB_TRACE_TYPE_SURFACE:
+                               write = true;
+                               break;
+                       default:
+                               write = false;
+                               break;
+                       }
+               } else {
+                       write = true;
+               }
+
+               if (write) {
                        aub_write_large_trace_block(bo, annotation->type,
                                                    annotation->subtype,
                                                    offset,
                                                    ending_offset - offset);
-                       offset = ending_offset;
                }
+
+               offset = ending_offset;
        }
 
        /* Write out any remaining unannotated data */
-       if (offset < bo->size) {
+       if (offset < bo->size && !bufmgr_gem->aub_state_only) {
                aub_write_large_trace_block(bo, AUB_TRACE_TYPE_NOTYPE, 0,
                                            offset, bo->size - offset);
        }
@@ -2170,7 +2195,8 @@ aub_exec(drm_intel_bo *bo, int ring_flag, int used)
                drm_intel_bufmgr_gem_set_aub_annotations(bo, NULL, 0);
 
        /* Dump ring buffer */
-       aub_build_dump_ringbuffer(bufmgr_gem, bo_gem->aub_offset, ring_flag);
+       if (!bufmgr_gem->aub_state_only)
+               aub_build_dump_ringbuffer(bufmgr_gem, bo_gem->aub_offset, 
ring_flag);
 
        fflush(bufmgr_gem->aub_file);
 
@@ -2974,6 +3000,19 @@ drm_intel_bufmgr_gem_set_aub_filename(drm_intel_bufmgr 
*bufmgr,
 }
 
 /**
+ * Sets the AUB dumping rule.
+ *
+ * When true, only states are dumped.
+ */
+void
+drm_intel_bufmgr_gem_set_aub_state_only(drm_intel_bufmgr *bufmgr,
+                                       int enable)
+{
+       drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *)bufmgr;
+       bufmgr_gem->aub_state_only = enable;
+}
+
+/**
  * Sets up AUB dumping.
  *
  * This is a trace file format that can be used with the simulator.
-- 
1.8.5.3

_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx

Reply via email to