xlib: fix glXGetCurrentDisplay() failure
authorBrian Paul <brianp@vmware.com>
Mon, 22 May 2017 17:46:27 +0000 (11:46 -0600)
committerBrian Paul <brianp@vmware.com>
Fri, 2 Jun 2017 14:22:55 +0000 (08:22 -0600)
glXGetCurrentDisplay() has been broken for years and nobody noticed until
recently.  This change adds a new XMesaGetCurrentDisplay() that the GLX
emulation API can call, just as we did for glXGetCurrentContext().

Tested by hacking glxgears to call glXGetCurrentContext() before and
after glXMakeCurrent() to verify the return value is NULL beforehand and
the same as the opened display afterward.

Also tested by Tom Hudson with his tests programs.

Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=100988
Cc: mesa-stable@lists.freedesktop.org
Tested-by: Tom Hudson <tom.hudson.phd@gmail.com>
Signed-off-by: Brian Paul <brianp@vmware.com>
src/mesa/drivers/x11/glxapi.c
src/mesa/drivers/x11/glxapi.h
src/mesa/drivers/x11/xm_api.c
src/mesa/drivers/x11/xmesa.h

index a807074a86385fe04e716c95bdf7d6645bb0d832..52e6026569752d43bf4da1f1f895785245767858 100644 (file)
@@ -379,13 +379,13 @@ glXQueryServerString(Display *dpy, int screen, int name)
 
 /*** GLX_VERSION_1_2 ***/
 
+/* declare here to avoid including xmesa.h */
+extern Display *XMesaGetCurrentDisplay(void);
+
 Display PUBLIC *
 glXGetCurrentDisplay(void)
 {
-   /* Same code as in libGL's glxext.c */
-   __GLXcontext *gc = (__GLXcontext *) glXGetCurrentContext();
-   if (NULL == gc) return NULL;
-   return gc->currentDpy;
+   return XMesaGetCurrentDisplay();
 }
 
 
index aff38f7531de29bb4fc0bfb328f87df95443d404..cc4f902925b652a57792c3e7833999da1cb22256 100644 (file)
@@ -37,7 +37,6 @@
  * work properly.
  */
 typedef struct __GLXcontextRec {
-   Display *currentDpy;
    GLboolean isDirect;
    GLXDrawable currentDrawable;
    GLXDrawable currentReadable;
index b54900b2aeb425d0fdc772fd6912e2a63f362861..a0695c3d87c9d97e3a570598be9ae1b172ba1a70 100644 (file)
@@ -1304,6 +1304,14 @@ XMesaBuffer XMesaGetCurrentReadBuffer( void )
 }
 
 
+Display *XMesaGetCurrentDisplay(void)
+{
+   GET_CURRENT_CONTEXT(ctx);
+   XMesaContext xmctx = XMESA_CONTEXT(ctx);
+   return xmctx ? xmctx->display : NULL;
+}
+
+
 
 GLboolean XMesaSetFXmode( GLint mode )
 {
index cc878e7402eb570044126f1f17259f88858c8b18..84b2b27006d4d2f2a853c9ab3a179227fa1e2fc0 100644 (file)
@@ -240,6 +240,12 @@ extern XMesaBuffer XMesaGetCurrentBuffer( void );
 extern XMesaBuffer XMesaGetCurrentReadBuffer( void );
 
 
+/*
+ * Return display of current context.
+ */
+extern Display *XMesaGetCurrentDisplay( void );
+
+
 /*
  * Swap the front and back buffers for the given buffer.  No action is
  * taken if the buffer is not double buffered.