From a73e9207da188a65af50da279f1436566c4a8418 Mon Sep 17 00:00:00 2001 From: Brian Paul Date: Wed, 25 Jul 2012 16:23:42 -0600 Subject: [PATCH] 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 --- src/mesa/drivers/x11/xm_buffer.c | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) 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; -- 2.30.2