diff options
author | Brian Paul <[email protected]> | 2012-07-25 16:23:42 -0600 |
---|---|---|
committer | Brian Paul <[email protected]> | 2012-07-26 13:59:44 -0600 |
commit | a73e9207da188a65af50da279f1436566c4a8418 (patch) | |
tree | f8a7538f3f38094edb69d266bf46a3b60a9a692f /src/mesa/drivers/x11 | |
parent | 66adc807c496c0329bf298a59991565fa4bfb0e3 (diff) |
xlib: add X error handler around XGetImage() call
XGetImage() will generate a BadMatch error if the source window isn't
visible. When that happens, create a new XImage. Fixes piglit 'select'
test failures with swrast/xlib driver.
NOTE: This is a candidate for the 8.0 branch.
Reviewed-by: Ian Romanick <[email protected]>
Diffstat (limited to 'src/mesa/drivers/x11')
-rw-r--r-- | src/mesa/drivers/x11/xm_buffer.c | 29 |
1 files changed, 29 insertions, 0 deletions
diff --git a/src/mesa/drivers/x11/xm_buffer.c b/src/mesa/drivers/x11/xm_buffer.c index a7395a317b0..eb68f940f89 100644 --- a/src/mesa/drivers/x11/xm_buffer.c +++ b/src/mesa/drivers/x11/xm_buffer.c @@ -446,14 +446,43 @@ xmesa_MapRenderbuffer(struct gl_context *ctx, } else { /* this must be a pixmap/window renderbuffer */ + int (*old_handler)(XMesaDisplay *, XErrorEvent *); int y2 = rb->Height - y - h; assert(xrb->pixmap); + /* Install error handler for XGetImage() in case the the window + * isn't mapped. If we fail we'll create a temporary XImage. + */ + mesaXErrorFlag = 0; + old_handler = XSetErrorHandler(mesaHandleXError); + /* read pixel data out of the pixmap/window into an XImage */ ximage = XGetImage(xrb->Parent->display, xrb->pixmap, x, y2, w, h, AllPlanes, ZPixmap); + + XSetErrorHandler(old_handler); + + if (mesaXErrorFlag) { + /* create new, temporary XImage */ + int bytes_per_line = + _mesa_format_row_stride(xrb->Base.Base.Format, + xrb->Base.Base.Width); + char *image = (char *) malloc(bytes_per_line * + xrb->Base.Base.Height); + ximage = XCreateImage(xrb->Parent->display, + xrb->Parent->xm_visual->visinfo->visual, + xrb->Parent->xm_visual->visinfo->depth, + ZPixmap, /* format */ + 0, /* offset */ + image, /* data */ + xrb->Base.Base.Width, + xrb->Base.Base.Height, + 8, /* pad */ + bytes_per_line); + } + if (!ximage) { *mapOut = NULL; *rowStrideOut = 0; |