i965/aub: Dump a final bitmap from DestroyContext.
authorKenneth Graunke <kenneth@whitecape.org>
Fri, 30 Mar 2012 06:37:09 +0000 (23:37 -0700)
committerKenneth Graunke <kenneth@whitecape.org>
Mon, 2 Apr 2012 20:47:53 +0000 (13:47 -0700)
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 work.
We may wish to pursue a more elegant solution later.

Signed-off-by: Kenneth Graunke <kenneth@whitecape.org>
Reviewed-by: Eric Anholt <eric@anholt.net>
src/mesa/drivers/dri/intel/intel_context.c
src/mesa/drivers/dri/intel/intel_screen.c
src/mesa/drivers/dri/intel/intel_screen.h

index 0a813a4..16a9887 100644 (file)
@@ -793,6 +793,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);
index 3c57c5b..49e208c 100644 (file)
@@ -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);
    }
 }
 
index 3f03641..cbce022 100644 (file)
@@ -139,4 +139,6 @@ intelMakeCurrent(__DRIcontext * driContextPriv,
                  __DRIdrawable * driDrawPriv,
                  __DRIdrawable * driReadPriv);
 
+void aub_dump_bmp(struct gl_context *ctx);
+
 #endif