diff mbox

[RFC-PATCH,libdrm] intel/aub: allow to dump only states

Message ID 1397547426-2654-1-git-send-email-olvaffe@gmail.com (mailing list archive)
State New, archived
Headers show

Commit Message

Chia-I Wu April 15, 2014, 7:37 a.m. UTC
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 <olvaffe@gmail.com>
---
 intel/intel_bufmgr.h     |  3 +++
 intel/intel_bufmgr_gem.c | 47 +++++++++++++++++++++++++++++++++++++++++++----
 2 files changed, 46 insertions(+), 4 deletions(-)

Comments

Chia-I Wu April 15, 2014, 7:57 a.m. UTC | #1
On Tue, Apr 15, 2014 at 3:37 PM, Chia-I Wu <olvaffe@gmail.com> wrote:
> 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.
The intended use is to create a binary and offline alternative of
Mesa's INTEL_DEBUG=batch.  Right now the binary output can only be
decoded with deaub from https://github.com/olvaffe/envytools.  But I
can update test_decode to accept AUB files if this change is welcomed.

deaub is an XML-based (rules-ng-ng based) command/state decoder for
GEN6+.  I am also curious if there is any interest in it outside deaub
(and ilo).

>
> Signed-off-by: Chia-I Wu <olvaffe@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
>
diff mbox

Patch

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.