[Mesa-dev] [PATCH] i965/aub: Dump a final bitmap from DestroyContext.

Kenneth Graunke kenneth at whitecape.org
Fri Mar 30 01:31:12 PDT 2012


Certain applications don't call SwapBuffers before exiting.  Yet, we'd
really like to see a bitmap containing the final rendered image even if
they choose never to present it.

In particular, Piglit tests (at least with -auto -fbo) fall into this
category.  Many of them failed to dump any images at all.

Dumping one final image at context destruction time seems to solve the
issue.

Signed-off-by: Kenneth Graunke <kenneth at whitecape.org>
---
 src/mesa/drivers/dri/intel/intel_context.c |    4 ++
 src/mesa/drivers/dri/intel/intel_screen.c  |   64 +++++++++++++++-------------
 src/mesa/drivers/dri/intel/intel_screen.h  |    2 +
 3 files changed, 41 insertions(+), 29 deletions(-)

This still seems rather finnicky, and I'm not sure it's the right place,
but without this patch it's basically impossible to debug piglit tests on
the simulator...I just get no bitmap at all.

Eric, does this seem reasonable?  Got a better idea?

diff --git a/src/mesa/drivers/dri/intel/intel_context.c b/src/mesa/drivers/dri/intel/intel_context.c
index 1aa2e9a..4a4c862 100644
--- a/src/mesa/drivers/dri/intel/intel_context.c
+++ b/src/mesa/drivers/dri/intel/intel_context.c
@@ -783,6 +783,10 @@ intelDestroyContext(__DRIcontext * driContextPriv)
    if (intel) {
       INTEL_FIREVERTICES(intel);
 
+      /* Dump a final BMP in case the application doesn't call SwapBuffers */
+      if (INTEL_DEBUG & DEBUG_AUB)
+	 aub_dump_bmp(&intel->ctx);
+
       _mesa_meta_free(&intel->ctx);
 
       intel->vtbl.destroy(intel);
diff --git a/src/mesa/drivers/dri/intel/intel_screen.c b/src/mesa/drivers/dri/intel/intel_screen.c
index 3c57c5b..49e208c 100644
--- a/src/mesa/drivers/dri/intel/intel_screen.c
+++ b/src/mesa/drivers/dri/intel/intel_screen.c
@@ -108,6 +108,40 @@ const GLuint __driNConfigOptions = 14;
 static PFNGLXCREATECONTEXTMODES create_context_modes = NULL;
 #endif /*USE_NEW_INTERFACE */
 
+void
+aub_dump_bmp(struct gl_context *ctx)
+{
+   struct gl_framebuffer *fb = ctx->DrawBuffer;
+
+   for (int i = 0; i < fb->_NumColorDrawBuffers; i++) {
+      struct intel_renderbuffer *irb =
+	 intel_renderbuffer(fb->_ColorDrawBuffers[i]);
+
+      if (irb && irb->mt) {
+	 enum aub_dump_bmp_format format;
+
+	 switch (irb->Base.Base.Format) {
+	 case MESA_FORMAT_ARGB8888:
+	 case MESA_FORMAT_XRGB8888:
+	    format = AUB_DUMP_BMP_FORMAT_ARGB_8888;
+	    break;
+	 default:
+	    continue;
+	 }
+
+	 drm_intel_gem_bo_aub_dump_bmp(irb->mt->region->bo,
+				       irb->draw_x,
+				       irb->draw_y,
+				       irb->Base.Base.Width,
+				       irb->Base.Base.Height,
+				       format,
+				       irb->mt->region->pitch *
+				       irb->mt->region->cpp,
+				       0);
+      }
+   }
+}
+
 static const __DRItexBufferExtension intelTexBufferExtension = {
     { __DRI_TEX_BUFFER, __DRI_TEX_BUFFER_VERSION },
    intelSetTexBuffer,
@@ -131,35 +165,7 @@ intelDRI2Flush(__DRIdrawable *drawable)
       intel_batchbuffer_flush(intel);
 
    if (INTEL_DEBUG & DEBUG_AUB) {
-      struct gl_framebuffer *fb = ctx->DrawBuffer;
-
-      for (int i = 0; i < fb->_NumColorDrawBuffers; i++) {
-	 struct intel_renderbuffer *irb =
-	    intel_renderbuffer(fb->_ColorDrawBuffers[i]);
-
-	 if (irb && irb->mt) {
-	    enum aub_dump_bmp_format format;
-
-	    switch (irb->Base.Base.Format) {
-	    case MESA_FORMAT_ARGB8888:
-	    case MESA_FORMAT_XRGB8888:
-	       format = AUB_DUMP_BMP_FORMAT_ARGB_8888;
-	       break;
-	    default:
-	       continue;
-	    }
-
-	    drm_intel_gem_bo_aub_dump_bmp(irb->mt->region->bo,
-					  irb->draw_x,
-					  irb->draw_y,
-					  irb->Base.Base.Width,
-					  irb->Base.Base.Height,
-					  format,
-					  irb->mt->region->pitch *
-					  irb->mt->region->cpp,
-					  0);
-	 }
-      }
+      aub_dump_bmp(ctx);
    }
 }
 
diff --git a/src/mesa/drivers/dri/intel/intel_screen.h b/src/mesa/drivers/dri/intel/intel_screen.h
index 3f03641..cbce022 100644
--- a/src/mesa/drivers/dri/intel/intel_screen.h
+++ b/src/mesa/drivers/dri/intel/intel_screen.h
@@ -139,4 +139,6 @@ intelMakeCurrent(__DRIcontext * driContextPriv,
                  __DRIdrawable * driDrawPriv,
                  __DRIdrawable * driReadPriv);
 
+void aub_dump_bmp(struct gl_context *ctx);
+
 #endif
-- 
1.7.7.6



More information about the mesa-dev mailing list