Re: [Mesa-dev] [PATCH] xlib: add X error handler around XGetImage() call

2012-07-26 Thread Ian Romanick

On 07/25/2012 03:23 PM, Brian Paul wrote:

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 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 a7395a3..eb68f94 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;




___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev


[Mesa-dev] [PATCH] xlib: add X error handler around XGetImage() call

2012-07-25 Thread Brian Paul
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.
---
 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 a7395a3..eb68f94 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;
-- 
1.7.3.4

___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev