Mesa (mesa_7_6_branch): gallium/xlib: fix glXQueryDrawable() bugs, see bug 24320

Brian Paul brianp at kemper.freedesktop.org
Wed Oct 7 15:42:59 UTC 2009


Module: Mesa
Branch: mesa_7_6_branch
Commit: 0526100a5cbd928fa28d38abdafd6beb024b0828
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=0526100a5cbd928fa28d38abdafd6beb024b0828

Author: Brian Paul <brianp at vmware.com>
Date:   Wed Oct  7 09:40:04 2009 -0600

gallium/xlib: fix glXQueryDrawable() bugs, see bug 24320

---

 src/gallium/state_trackers/glx/xlib/glx_api.c |   38 +++++++++++++++++--------
 src/gallium/state_trackers/glx/xlib/xm_api.c  |    2 +-
 src/gallium/state_trackers/glx/xlib/xm_api.h  |    7 ++++
 3 files changed, 34 insertions(+), 13 deletions(-)

diff --git a/src/gallium/state_trackers/glx/xlib/glx_api.c b/src/gallium/state_trackers/glx/xlib/glx_api.c
index 3277ff5..556eefb 100644
--- a/src/gallium/state_trackers/glx/xlib/glx_api.c
+++ b/src/gallium/state_trackers/glx/xlib/glx_api.c
@@ -1992,32 +1992,42 @@ glXCreatePbuffer( Display *dpy, GLXFBConfig config,
             break;
          case GLX_PRESERVED_CONTENTS:
             attrib++;
-            preserveContents = *attrib; /* ignored */
+            preserveContents = *attrib;
             break;
          case GLX_LARGEST_PBUFFER:
             attrib++;
-            useLargest = *attrib; /* ignored */
+            useLargest = *attrib;
             break;
          default:
             return 0;
       }
    }
 
-   /* not used at this time */
-   (void) useLargest;
-   (void) preserveContents;
-
    if (width == 0 || height == 0)
       return 0;
 
+   if (width > MAX_WIDTH || height > MAX_HEIGHT) {
+      /* If allocation would have failed and GLX_LARGEST_PBUFFER is set,
+       * allocate the largest possible buffer.
+       */
+      if (useLargest) {
+         width = MAX_WIDTH;
+         height = MAX_HEIGHT;
+      }
+   }
+
    xmbuf = XMesaCreatePBuffer( xmvis, 0, width, height);
    /* A GLXPbuffer handle must be an X Drawable because that's what
     * glXMakeCurrent takes.
     */
-   if (xmbuf)
+   if (xmbuf) {
+      xmbuf->largestPbuffer = useLargest;
+      xmbuf->preservedContents = preserveContents;
       return (GLXPbuffer) xmbuf->drawable;
-   else
+   }
+   else {
       return 0;
+   }
 }
 
 
@@ -2035,22 +2045,26 @@ void
 glXQueryDrawable( Display *dpy, GLXDrawable draw, int attribute,
                        unsigned int *value )
 {
+   GLuint width, height;
    XMesaBuffer xmbuf = XMesaFindBuffer(dpy, draw);
    if (!xmbuf)
       return;
 
+   /* make sure buffer's dimensions are up to date */
+   xmesa_get_window_size(dpy, xmbuf, &width, &height);
+
    switch (attribute) {
       case GLX_WIDTH:
-         *value = xmesa_buffer_width(xmbuf);
+         *value = width;
          break;
       case GLX_HEIGHT:
-         *value = xmesa_buffer_width(xmbuf);
+         *value = height;
          break;
       case GLX_PRESERVED_CONTENTS:
-         *value = True;
+         *value = xmbuf->preservedContents;
          break;
       case GLX_LARGEST_PBUFFER:
-         *value = xmesa_buffer_width(xmbuf) * xmesa_buffer_height(xmbuf);
+         *value = xmbuf->largestPbuffer;
          break;
       case GLX_FBCONFIG_ID:
          *value = xmbuf->xm_visual->visinfo->visualid;
diff --git a/src/gallium/state_trackers/glx/xlib/xm_api.c b/src/gallium/state_trackers/glx/xlib/xm_api.c
index 957002d..c76dfb3 100644
--- a/src/gallium/state_trackers/glx/xlib/xm_api.c
+++ b/src/gallium/state_trackers/glx/xlib/xm_api.c
@@ -228,7 +228,7 @@ get_drawable_size( Display *dpy, Drawable d, uint *width, uint *height )
  * \param width  returns width in pixels
  * \param height  returns height in pixels
  */
-static void
+void
 xmesa_get_window_size(Display *dpy, XMesaBuffer b,
                       GLuint *width, GLuint *height)
 {
diff --git a/src/gallium/state_trackers/glx/xlib/xm_api.h b/src/gallium/state_trackers/glx/xlib/xm_api.h
index ce97a3e..d24971c 100644
--- a/src/gallium/state_trackers/glx/xlib/xm_api.h
+++ b/src/gallium/state_trackers/glx/xlib/xm_api.h
@@ -323,6 +323,9 @@ struct xmesa_buffer {
    Colormap cmap;		/* the X colormap */
    BufferType type;             /* window, pixmap, pbuffer or glxwindow */
 
+   GLboolean largestPbuffer;    /**< for pbuffers */
+   GLboolean preservedContents; /**< for pbuffers */
+
    XImage *tempImage;
    unsigned long selectedEvents;/* for pbuffers only */
 
@@ -370,6 +373,10 @@ extern XMesaBuffer
 xmesa_find_buffer(Display *dpy, Colormap cmap, XMesaBuffer notThis);
 
 extern void
+xmesa_get_window_size(Display *dpy, XMesaBuffer b,
+                      GLuint *width, GLuint *height);
+
+extern void
 xmesa_check_and_update_buffer_size(XMesaContext xmctx, XMesaBuffer drawBuffer);
 
 extern void




More information about the mesa-commit mailing list