aboutsummaryrefslogtreecommitdiffstats
path: root/src/mesa/drivers/x11
diff options
context:
space:
mode:
authorBrian Paul <[email protected]>2012-07-25 16:23:42 -0600
committerBrian Paul <[email protected]>2012-07-26 13:59:44 -0600
commita73e9207da188a65af50da279f1436566c4a8418 (patch)
treef8a7538f3f38094edb69d266bf46a3b60a9a692f /src/mesa/drivers/x11
parent66adc807c496c0329bf298a59991565fa4bfb0e3 (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.c29
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;