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>
This commit is contained in:
Kenneth Graunke 2012-03-29 23:37:09 -07:00
parent 42bc0b9b9d
commit 252d3118dd
3 changed files with 41 additions and 29 deletions

View 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);

View 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);
}
}

View file

@ -139,4 +139,6 @@ intelMakeCurrent(__DRIcontext * driContextPriv,
__DRIdrawable * driDrawPriv,
__DRIdrawable * driReadPriv);
void aub_dump_bmp(struct gl_context *ctx);
#endif