i965/aub: Dump a final bitmap from DestroyContext.

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>
diff --git a/src/mesa/drivers/dri/intel/intel_context.c b/src/mesa/drivers/dri/intel/intel_context.c
index 0a813a4..16a9887 100644
--- a/src/mesa/drivers/dri/intel/intel_context.c
+++ b/src/mesa/drivers/dri/intel/intel_context.c
@@ -793,6 +793,10 @@
    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 @@
 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 @@
       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 @@
                  __DRIdrawable * driDrawPriv,
                  __DRIdrawable * driReadPriv);
 
+void aub_dump_bmp(struct gl_context *ctx);
+
 #endif