xserver: Branch 'master' - 13 commits

Adam Jackson ajax at kemper.freedesktop.org
Wed Mar 30 15:21:03 UTC 2016


 glx/extension_string.c       |    5 +
 glx/extension_string.h       |    1 
 glx/glxcmds.c                |   22 +++++---
 glx/glxdri2.c                |   81 +++++++++++++-------------------
 glx/glxdriswrast.c           |   39 +++++----------
 glx/glxext.c                 |    2 
 glx/glxscreens.c             |   44 +++++------------
 glx/glxscreens.h             |   16 +-----
 hw/xfree86/man/xorg.conf.man |    6 ++
 hw/xquartz/GL/indirect.c     |   40 +--------------
 hw/xwin/glx/indirect.c       |  108 ++++++++++---------------------------------
 11 files changed, 118 insertions(+), 246 deletions(-)

New commits:
commit b08526eecf1e165ed9ec2e6b571a5a616a9b696e
Author: Adam Jackson <ajax at redhat.com>
Date:   Wed Mar 16 11:38:13 2016 -0400

    glx: Implement GLX_EXT_libglvnd (v2)
    
    For the dri2 backend, we depend on xfree86 already, so we can walk the
    options for the screen looking for a vendor string from xorg.conf.  For
    the swrast backend we don't have that luxury, so just say mesa.  This
    extension isn't really meaningful on Windows or OSX yet (since libglvnd
    isn't really functional there yet), so on those platforms we don't say
    anything and return BadValue for the token from QueryServerString.
    
    v2: Use xnf* allocators when parsing options (Eric and Emil)
    
    Reviewed-by: Eric Anholt <eric at anholt.net>
    Reviewed-by: Emil Velikov <emil.velikov at collabora.com>
    Signed-off-by: Adam Jackson <ajax at redhat.com>

diff --git a/glx/extension_string.c b/glx/extension_string.c
index 7e74090..d1da481 100644
--- a/glx/extension_string.c
+++ b/glx/extension_string.c
@@ -85,6 +85,7 @@ static const struct extension_info known_glx_extensions[] = {
     { GLX(EXT_fbconfig_packed_float),   VER(0,0), N, },
     { GLX(EXT_framebuffer_sRGB),        VER(0,0), N, },
     { GLX(EXT_import_context),          VER(0,0), Y, },
+    { GLX(EXT_libglvnd),                VER(0,0), N, },
     { GLX(EXT_stereo_tree),             VER(0,0), N, },
     { GLX(EXT_texture_from_pixmap),     VER(0,0), N, },
     { GLX(EXT_visual_info),             VER(0,0), Y, },
diff --git a/glx/extension_string.h b/glx/extension_string.h
index 425a805..a10d710 100644
--- a/glx/extension_string.h
+++ b/glx/extension_string.h
@@ -47,6 +47,7 @@ enum {
     EXT_create_context_es2_profile_bit,
     EXT_fbconfig_packed_float_bit,
     EXT_import_context_bit,
+    EXT_libglvnd_bit,
     EXT_stereo_tree_bit,
     EXT_texture_from_pixmap_bit,
     EXT_visual_info_bit,
diff --git a/glx/glxcmds.c b/glx/glxcmds.c
index 4693e68..0f0b714 100644
--- a/glx/glxcmds.c
+++ b/glx/glxcmds.c
@@ -2444,6 +2444,10 @@ __glXDisp_QueryExtensionsString(__GLXclientState * cl, GLbyte * pc)
     return Success;
 }
 
+#ifndef GLX_VENDOR_NAMES_EXT
+#define GLX_VENDOR_NAMES_EXT 0x20F6
+#endif
+
 int
 __glXDisp_QueryServerString(__GLXclientState * cl, GLbyte * pc)
 {
@@ -2471,6 +2475,12 @@ __glXDisp_QueryServerString(__GLXclientState * cl, GLbyte * pc)
     case GLX_EXTENSIONS:
         ptr = pGlxScreen->GLXextensions;
         break;
+    case GLX_VENDOR_NAMES_EXT:
+        if (pGlxScreen->glvnd) {
+            ptr = pGlxScreen->glvnd;
+            break;
+        }
+        /* else fall through */
     default:
         return BadValue;
     }
diff --git a/glx/glxdri2.c b/glx/glxdri2.c
index 15253d1..d1fc3f9 100644
--- a/glx/glxdri2.c
+++ b/glx/glxdri2.c
@@ -934,12 +934,23 @@ initializeExtensions(__GLXscreen * screen)
 /* white lie */
 extern glx_func_ptr glXGetProcAddressARB(const char *);
 
+enum {
+    GLXOPT_VENDOR_LIBRARY,
+};
+
+static const OptionInfoRec GLXOptions[] = {
+    { GLXOPT_VENDOR_LIBRARY, "GlxVendorLibrary", OPTV_STRING, {0}, FALSE },
+    { -1, NULL, OPTV_NONE, {0}, FALSE },
+};
+
 static __GLXscreen *
 __glXDRIscreenProbe(ScreenPtr pScreen)
 {
     const char *driverName, *deviceName;
     __GLXDRIscreen *screen;
     ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen);
+    const char *glvnd = NULL;
+    OptionInfoPtr options;
 
     screen = calloc(1, sizeof *screen);
     if (screen == NULL)
@@ -985,6 +996,17 @@ __glXDRIscreenProbe(ScreenPtr pScreen)
                                                GLX_PIXMAP_BIT |
                                                GLX_PBUFFER_BIT);
 
+    options = xnfalloc(sizeof(GLXOptions));
+    memcpy(options, GLXOptions, sizeof(GLXOptions));
+    xf86ProcessOptions(pScrn->scrnIndex, pScrn->options, options);
+    glvnd = xf86GetOptValString(options, GLXOPT_VENDOR_LIBRARY);
+    if (glvnd)
+        screen->base.glvnd = xnfstrdup(glvnd);
+    free(options);
+
+    if (!screen->base.glvnd)
+        screen->base.glvnd = strdup("mesa");
+
     __glXScreenInit(&screen->base, pScreen);
 
     screen->enterVT = pScrn->EnterVT;
diff --git a/glx/glxdriswrast.c b/glx/glxdriswrast.c
index 0b5122f..1e46d97 100644
--- a/glx/glxdriswrast.c
+++ b/glx/glxdriswrast.c
@@ -487,6 +487,9 @@ __glXDRIscreenProbe(ScreenPtr pScreen)
                                                GLX_PIXMAP_BIT |
                                                GLX_PBUFFER_BIT);
 
+#if !defined(XQUARTZ) && !defined(WIN32)
+    screen->base.glvnd = strdup("mesa");
+#endif
     __glXScreenInit(&screen->base, pScreen);
 
     __glXsetGetProcAddress(glXGetProcAddressARB);
diff --git a/glx/glxscreens.c b/glx/glxscreens.c
index 7e083cf..536c0c4 100644
--- a/glx/glxscreens.c
+++ b/glx/glxscreens.c
@@ -384,6 +384,9 @@ __glXScreenInit(__GLXscreen * pGlxScreen, ScreenPtr pScreen)
 
     dixSetPrivate(&pScreen->devPrivates, glxScreenPrivateKey, pGlxScreen);
 
+    if (pGlxScreen->glvnd)
+        __glXEnableExtension(pGlxScreen->glx_enable_bits, "GLX_EXT_libglvnd");
+
     i = __glXGetExtensionString(pGlxScreen->glx_enable_bits, NULL);
     if (i > 0) {
         pGlxScreen->GLXextensions = xnfalloc(i);
@@ -396,6 +399,7 @@ __glXScreenInit(__GLXscreen * pGlxScreen, ScreenPtr pScreen)
 void
 __glXScreenDestroy(__GLXscreen * screen)
 {
+    free(screen->glvnd);
     free(screen->GLXextensions);
     free(screen->GLextensions);
     free(screen->visuals);
diff --git a/glx/glxscreens.h b/glx/glxscreens.h
index c63fb56..15196fa 100644
--- a/glx/glxscreens.h
+++ b/glx/glxscreens.h
@@ -143,6 +143,7 @@ struct __GLXscreen {
 
     char *GLextensions;
     char *GLXextensions;
+    char *glvnd;
     unsigned char glx_enable_bits[__GLX_EXT_BYTES];
 
     Bool (*CloseScreen) (ScreenPtr pScreen);
diff --git a/hw/xfree86/man/xorg.conf.man b/hw/xfree86/man/xorg.conf.man
index d794df4..8c4aeb5 100644
--- a/hw/xfree86/man/xorg.conf.man
+++ b/hw/xfree86/man/xorg.conf.man
@@ -2039,6 +2039,12 @@ Note that disabling an operation will have no effect if the operation is
 not accelerated (whether due to lack of support in the hardware or in the
 driver).
 .TP 7
+.BI "Option \*qGlxVendorLibrary\*q \*q" string \*q
+This option specifies a space-separated list of OpenGL vendor libraries to
+use for the screen. This may be used to select an alternate implementation
+for development, debugging, or alternate feature sets.
+Default: mesa.
+.TP 7
 .BI "Option \*qInitPrimary\*q \*q" boolean \*q
 Use the Int10 module to initialize the primary graphics card.
 Normally, only secondary cards are soft-booted using the Int10 module, as the
commit 2e8781ead3067b195baec2e76a28091575679383
Author: Adam Jackson <ajax at redhat.com>
Date:   Wed Mar 23 15:41:24 2016 -0400

    glx: Compute the GLX extension string from __glXScreenInit
    
    Now that the enable bits are in the screen base class we can compute
    this in one place, rather than making every backend do it.
    
    Reviewed-by: Eric Anholt <eric at anholt.net>
    Reviewed-by: Emil Velikov <emil.velikov at collabora.com>
    Signed-off-by: Adam Jackson <ajax at redhat.com>

diff --git a/glx/glxdri2.c b/glx/glxdri2.c
index fa93da1..15253d1 100644
--- a/glx/glxdri2.c
+++ b/glx/glxdri2.c
@@ -939,7 +939,6 @@ __glXDRIscreenProbe(ScreenPtr pScreen)
 {
     const char *driverName, *deviceName;
     __GLXDRIscreen *screen;
-    size_t buffer_size;
     ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen);
 
     screen = calloc(1, sizeof *screen);
@@ -988,17 +987,6 @@ __glXDRIscreenProbe(ScreenPtr pScreen)
 
     __glXScreenInit(&screen->base, pScreen);
 
-    /* The first call simply determines the length of the extension string.
-     * This allows us to allocate some memory to hold the extension string,
-     * but it requires that we call __glXGetExtensionString a second time.
-     */
-    buffer_size = __glXGetExtensionString(screen->base.glx_enable_bits, NULL);
-    if (buffer_size > 0) {
-        screen->base.GLXextensions = xnfalloc(buffer_size);
-        (void) __glXGetExtensionString(screen->base.glx_enable_bits,
-                                       screen->base.GLXextensions);
-    }
-
     screen->enterVT = pScrn->EnterVT;
     pScrn->EnterVT = glxDRIEnterVT;
     screen->leaveVT = pScrn->LeaveVT;
diff --git a/glx/glxdriswrast.c b/glx/glxdriswrast.c
index 27c98ed..0b5122f 100644
--- a/glx/glxdriswrast.c
+++ b/glx/glxdriswrast.c
@@ -448,7 +448,6 @@ __glXDRIscreenProbe(ScreenPtr pScreen)
 {
     const char *driverName = "swrast";
     __GLXDRIscreen *screen;
-    size_t buffer_size;
 
     screen = calloc(1, sizeof *screen);
     if (screen == NULL)
@@ -490,17 +489,6 @@ __glXDRIscreenProbe(ScreenPtr pScreen)
 
     __glXScreenInit(&screen->base, pScreen);
 
-    /* The first call simply determines the length of the extension string.
-     * This allows us to allocate some memory to hold the extension string,
-     * but it requires that we call __glXGetExtensionString a second time.
-     */
-    buffer_size = __glXGetExtensionString(screen->base.glx_enable_bits, NULL);
-    if (buffer_size > 0) {
-        screen->base.GLXextensions = xnfalloc(buffer_size);
-        (void) __glXGetExtensionString(screen->base.glx_enable_bits,
-                                       screen->base.GLXextensions);
-    }
-
     __glXsetGetProcAddress(glXGetProcAddressARB);
 
     LogMessage(X_INFO, "AIGLX: Loaded and initialized %s\n", driverName);
diff --git a/glx/glxscreens.c b/glx/glxscreens.c
index 61b8a52..7e083cf 100644
--- a/glx/glxscreens.c
+++ b/glx/glxscreens.c
@@ -383,6 +383,14 @@ __glXScreenInit(__GLXscreen * pGlxScreen, ScreenPtr pScreen)
     }
 
     dixSetPrivate(&pScreen->devPrivates, glxScreenPrivateKey, pGlxScreen);
+
+    i = __glXGetExtensionString(pGlxScreen->glx_enable_bits, NULL);
+    if (i > 0) {
+        pGlxScreen->GLXextensions = xnfalloc(i);
+        (void) __glXGetExtensionString(pGlxScreen->glx_enable_bits,
+                                       pGlxScreen->GLXextensions);
+    }
+
 }
 
 void
diff --git a/hw/xquartz/GL/indirect.c b/hw/xquartz/GL/indirect.c
index 9eaeb94..2d88ef2 100644
--- a/hw/xquartz/GL/indirect.c
+++ b/hw/xquartz/GL/indirect.c
@@ -542,20 +542,6 @@ __glXAquaScreenProbe(ScreenPtr pScreen)
     __glXInitExtensionEnableBits(screen->base.glx_enable_bits);
     __glXScreenInit(&screen->base, pScreen);
 
-    //__glXEnableExtension(screen->base.glx_enable_bits, "GLX_ARB_create_context");
-    //__glXEnableExtension(screen->base.glx_enable_bits, "GLX_ARB_create_context_profile");
-
-    // Generate the GLX extensions string (overrides that set by __glXScreenInit())
-    {
-        unsigned int buffer_size =
-            __glXGetExtensionString(screen->base.glx_enable_bits, NULL);
-        if (buffer_size > 0) {
-            screen->base.GLXextensions = xnfalloc(buffer_size);
-            __glXGetExtensionString(screen->base.glx_enable_bits,
-                                    screen->base.GLXextensions);
-        }
-    }
-
     return &screen->base;
 }
 
diff --git a/hw/xwin/glx/indirect.c b/hw/xwin/glx/indirect.c
index 3b8210f..5d7ebf5 100644
--- a/hw/xwin/glx/indirect.c
+++ b/hw/xwin/glx/indirect.c
@@ -706,17 +706,6 @@ glxWinScreenProbe(ScreenPtr pScreen)
         screen->base.numVisuals = 0;
 
         __glXScreenInit(&screen->base, pScreen);
-
-        // Generate the GLX extensions string (overrides that set by __glXScreenInit())
-        {
-            unsigned int buffer_size =
-                __glXGetExtensionString(screen->base.glx_enable_bits, NULL);
-            if (buffer_size > 0) {
-                screen->base.GLXextensions = xnfalloc(buffer_size);
-                __glXGetExtensionString(screen->base.glx_enable_bits,
-                                        screen->base.GLXextensions);
-            }
-        }
     }
 
     wglMakeCurrent(NULL, NULL);
commit e21de4bf3c5ff8cbb9c5ea023d04162e5e56b3df
Author: Adam Jackson <ajax at redhat.com>
Date:   Wed Mar 23 15:36:52 2016 -0400

    glx: Move glx_enable_bits up to the GLX screen base class
    
    Reviewed-by: Eric Anholt <eric at anholt.net>
    Reviewed-by: Emil Velikov <emil.velikov at collabora.com>
    Signed-off-by: Adam Jackson <ajax at redhat.com>

diff --git a/glx/glxdri2.c b/glx/glxdri2.c
index ad97eb5..fa93da1 100644
--- a/glx/glxdri2.c
+++ b/glx/glxdri2.c
@@ -75,8 +75,6 @@ struct __GLXDRIscreen {
     const __DRIswapControlExtension *swapControl;
     const __DRItexBufferExtension *texBuffer;
     const __DRIconfig **driConfigs;
-
-    unsigned char glx_enable_bits[__GLX_EXT_BYTES];
 };
 
 struct __GLXDRIcontext {
@@ -847,18 +845,19 @@ glxDRILeaveVT(ScrnInfoPtr scrn)
  * @param screen The screen where glx_enable_bits are to be set.
  */
 static void
-initializeExtensions(__GLXDRIscreen * screen)
+initializeExtensions(__GLXscreen * screen)
 {
-    ScreenPtr pScreen = screen->base.pScreen;
+    ScreenPtr pScreen = screen->pScreen;
+    __GLXDRIscreen *dri = (__GLXDRIscreen *)screen;
     const __DRIextension **extensions;
     int i;
 
-    extensions = screen->core->getExtensions(screen->driScreen);
+    extensions = dri->core->getExtensions(dri->driScreen);
 
     __glXEnableExtension(screen->glx_enable_bits, "GLX_MESA_copy_sub_buffer");
     LogMessage(X_INFO, "AIGLX: enabled GLX_MESA_copy_sub_buffer\n");
 
-    if (screen->dri2->base.version >= 3) {
+    if (dri->dri2->base.version >= 3) {
         __glXEnableExtension(screen->glx_enable_bits,
                              "GLX_ARB_create_context");
         __glXEnableExtension(screen->glx_enable_bits,
@@ -901,7 +900,7 @@ initializeExtensions(__GLXDRIscreen * screen)
 
     for (i = 0; extensions[i]; i++) {
         if (strcmp(extensions[i]->name, __DRI_TEX_BUFFER) == 0) {
-            screen->texBuffer = (const __DRItexBufferExtension *) extensions[i];
+            dri->texBuffer = (const __DRItexBufferExtension *) extensions[i];
             __glXEnableExtension(screen->glx_enable_bits,
                                  "GLX_EXT_texture_from_pixmap");
             LogMessage(X_INFO,
@@ -910,11 +909,11 @@ initializeExtensions(__GLXDRIscreen * screen)
 
         if (strcmp(extensions[i]->name, __DRI2_FLUSH) == 0 &&
             extensions[i]->version >= 3) {
-            screen->flush = (__DRI2flushExtension *) extensions[i];
+            dri->flush = (__DRI2flushExtension *) extensions[i];
         }
 
         if (strcmp(extensions[i]->name, __DRI2_ROBUSTNESS) == 0 &&
-            screen->dri2->base.version >= 3) {
+            dri->dri2->base.version >= 3) {
             __glXEnableExtension(screen->glx_enable_bits,
                                  "GLX_ARB_create_context_robustness");
             LogMessage(X_INFO,
@@ -960,7 +959,7 @@ __glXDRIscreenProbe(ScreenPtr pScreen)
     screen->base.swapInterval = __glXDRIdrawableSwapInterval;
     screen->base.pScreen = pScreen;
 
-    __glXInitExtensionEnableBits(screen->glx_enable_bits);
+    __glXInitExtensionEnableBits(screen->base.glx_enable_bits);
 
     screen->driver =
         glxProbeDriver(driverName, (void **) &screen->core, __DRI_CORE, 1,
@@ -980,7 +979,7 @@ __glXDRIscreenProbe(ScreenPtr pScreen)
         goto handle_error;
     }
 
-    initializeExtensions(screen);
+    initializeExtensions(&screen->base);
 
     screen->base.fbconfigs = glxConvertConfigs(screen->core, screen->driConfigs,
                                                GLX_WINDOW_BIT |
@@ -993,10 +992,10 @@ __glXDRIscreenProbe(ScreenPtr pScreen)
      * This allows us to allocate some memory to hold the extension string,
      * but it requires that we call __glXGetExtensionString a second time.
      */
-    buffer_size = __glXGetExtensionString(screen->glx_enable_bits, NULL);
+    buffer_size = __glXGetExtensionString(screen->base.glx_enable_bits, NULL);
     if (buffer_size > 0) {
         screen->base.GLXextensions = xnfalloc(buffer_size);
-        (void) __glXGetExtensionString(screen->glx_enable_bits,
+        (void) __glXGetExtensionString(screen->base.glx_enable_bits,
                                        screen->base.GLXextensions);
     }
 
diff --git a/glx/glxdriswrast.c b/glx/glxdriswrast.c
index 65abdff..27c98ed 100644
--- a/glx/glxdriswrast.c
+++ b/glx/glxdriswrast.c
@@ -391,15 +391,16 @@ static const __DRIextension *loader_extensions[] = {
 };
 
 static void
-initializeExtensions(__GLXDRIscreen * screen)
+initializeExtensions(__GLXscreen * screen)
 {
     const __DRIextension **extensions;
+    __GLXDRIscreen *dri = (__GLXDRIscreen *)screen;
     int i;
 
     __glXEnableExtension(screen->glx_enable_bits, "GLX_MESA_copy_sub_buffer");
     LogMessage(X_INFO, "AIGLX: enabled GLX_MESA_copy_sub_buffer\n");
 
-    if (screen->swrast->base.version >= 3) {
+    if (dri->swrast->base.version >= 3) {
         __glXEnableExtension(screen->glx_enable_bits,
                              "GLX_ARB_create_context");
         __glXEnableExtension(screen->glx_enable_bits,
@@ -415,16 +416,16 @@ initializeExtensions(__GLXDRIscreen * screen)
     __glXEnableExtension(screen->glx_enable_bits, "GLX_ARB_fbconfig_float");
     __glXEnableExtension(screen->glx_enable_bits, "GLX_EXT_fbconfig_packed_float");
 
-    extensions = screen->core->getExtensions(screen->driScreen);
+    extensions = dri->core->getExtensions(dri->driScreen);
 
     for (i = 0; extensions[i]; i++) {
         if (strcmp(extensions[i]->name, __DRI_COPY_SUB_BUFFER) == 0) {
-            screen->copySubBuffer =
+            dri->copySubBuffer =
                 (const __DRIcopySubBufferExtension *) extensions[i];
         }
 
         if (strcmp(extensions[i]->name, __DRI_TEX_BUFFER) == 0) {
-            screen->texBuffer = (const __DRItexBufferExtension *) extensions[i];
+            dri->texBuffer = (const __DRItexBufferExtension *) extensions[i];
             __glXEnableExtension(screen->glx_enable_bits,
                                  "GLX_EXT_texture_from_pixmap\n");
         }
@@ -459,7 +460,7 @@ __glXDRIscreenProbe(ScreenPtr pScreen)
     screen->base.swapInterval = NULL;
     screen->base.pScreen = pScreen;
 
-    __glXInitExtensionEnableBits(screen->glx_enable_bits);
+    __glXInitExtensionEnableBits(screen->base.glx_enable_bits);
 
     screen->driver = glxProbeDriver(driverName,
                                     (void **) &screen->core,
@@ -480,7 +481,7 @@ __glXDRIscreenProbe(ScreenPtr pScreen)
         goto handle_error;
     }
 
-    initializeExtensions(screen);
+    initializeExtensions(&screen->base);
 
     screen->base.fbconfigs = glxConvertConfigs(screen->core, screen->driConfigs,
                                                GLX_WINDOW_BIT |
@@ -493,10 +494,10 @@ __glXDRIscreenProbe(ScreenPtr pScreen)
      * This allows us to allocate some memory to hold the extension string,
      * but it requires that we call __glXGetExtensionString a second time.
      */
-    buffer_size = __glXGetExtensionString(screen->glx_enable_bits, NULL);
+    buffer_size = __glXGetExtensionString(screen->base.glx_enable_bits, NULL);
     if (buffer_size > 0) {
         screen->base.GLXextensions = xnfalloc(buffer_size);
-        (void) __glXGetExtensionString(screen->glx_enable_bits,
+        (void) __glXGetExtensionString(screen->base.glx_enable_bits,
                                        screen->base.GLXextensions);
     }
 
diff --git a/glx/glxscreens.h b/glx/glxscreens.h
index 0fe85e6..c63fb56 100644
--- a/glx/glxscreens.h
+++ b/glx/glxscreens.h
@@ -35,6 +35,8 @@
  * Silicon Graphics, Inc.
  */
 
+#include "extension_string.h"
+
 typedef struct __GLXconfig __GLXconfig;
 struct __GLXconfig {
     __GLXconfig *next;
@@ -141,6 +143,7 @@ struct __GLXscreen {
 
     char *GLextensions;
     char *GLXextensions;
+    unsigned char glx_enable_bits[__GLX_EXT_BYTES];
 
     Bool (*CloseScreen) (ScreenPtr pScreen);
 };
diff --git a/hw/xquartz/GL/indirect.c b/hw/xquartz/GL/indirect.c
index f857325..9eaeb94 100644
--- a/hw/xquartz/GL/indirect.c
+++ b/hw/xquartz/GL/indirect.c
@@ -112,9 +112,6 @@ typedef struct __GLXAquaDrawable __GLXAquaDrawable;
  */
 struct __GLXAquaScreen {
     __GLXscreen base;
-
-    /* Supported GLX extensions */
-    unsigned char glx_enable_bits[__GLX_EXT_BYTES];
 };
 
 struct __GLXAquaContext {
@@ -542,19 +539,19 @@ __glXAquaScreenProbe(ScreenPtr pScreen)
     screen->base.fbconfigs = __glXAquaCreateVisualConfigs(
         &screen->base.numFBConfigs, pScreen->myNum);
 
-    __glXInitExtensionEnableBits(screen->glx_enable_bits);
+    __glXInitExtensionEnableBits(screen->base.glx_enable_bits);
     __glXScreenInit(&screen->base, pScreen);
 
-    //__glXEnableExtension(screen->glx_enable_bits, "GLX_ARB_create_context");
-    //__glXEnableExtension(screen->glx_enable_bits, "GLX_ARB_create_context_profile");
+    //__glXEnableExtension(screen->base.glx_enable_bits, "GLX_ARB_create_context");
+    //__glXEnableExtension(screen->base.glx_enable_bits, "GLX_ARB_create_context_profile");
 
     // Generate the GLX extensions string (overrides that set by __glXScreenInit())
     {
         unsigned int buffer_size =
-            __glXGetExtensionString(screen->glx_enable_bits, NULL);
+            __glXGetExtensionString(screen->base.glx_enable_bits, NULL);
         if (buffer_size > 0) {
             screen->base.GLXextensions = xnfalloc(buffer_size);
-            __glXGetExtensionString(screen->glx_enable_bits,
+            __glXGetExtensionString(screen->base.glx_enable_bits,
                                     screen->base.GLXextensions);
         }
     }
diff --git a/hw/xwin/glx/indirect.c b/hw/xwin/glx/indirect.c
index 70d88d7..3b8210f 100644
--- a/hw/xwin/glx/indirect.c
+++ b/hw/xwin/glx/indirect.c
@@ -136,9 +136,6 @@ struct __GLXWinDrawable {
 struct __GLXWinScreen {
     __GLXscreen base;
 
-    /* Supported GLX extensions */
-    unsigned char glx_enable_bits[__GLX_EXT_BYTES];
-
     Bool has_WGL_ARB_multisample;
     Bool has_WGL_ARB_pixel_format;
     Bool has_WGL_ARB_pbuffer;
@@ -632,7 +629,7 @@ glxWinScreenProbe(ScreenPtr pScreen)
         // Based on the WGL extensions available, enable various GLX extensions
         // XXX: make this table-driven ?
         //
-        __glXInitExtensionEnableBits(screen->glx_enable_bits);
+        __glXInitExtensionEnableBits(screen->base.glx_enable_bits);
 
         if (strstr(wgl_extensions, "WGL_ARB_make_current_read"))
             screen->has_WGL_ARB_make_current_read = TRUE;
@@ -640,13 +637,13 @@ glxWinScreenProbe(ScreenPtr pScreen)
             LogMessage(X_WARNING, "AIGLX: missing WGL_ARB_make_current_read\n")
 
         if (strstr(gl_extensions, "GL_WIN_swap_hint")) {
-            __glXEnableExtension(screen->glx_enable_bits,
+            __glXEnableExtension(screen->base.glx_enable_bits,
                                  "GLX_MESA_copy_sub_buffer");
             LogMessage(X_INFO, "AIGLX: enabled GLX_MESA_copy_sub_buffer\n");
         }
 
         if (strstr(wgl_extensions, "WGL_EXT_swap_control")) {
-            __glXEnableExtension(screen->glx_enable_bits,
+            __glXEnableExtension(screen->base.glx_enable_bits,
                                  "GLX_SGI_swap_control");
             LogMessage(X_INFO, "AIGLX: enabled GLX_SGI_swap_control\n");
         }
@@ -654,7 +651,7 @@ glxWinScreenProbe(ScreenPtr pScreen)
 /*       // Hmm?  screen->texOffset */
 /*       if (strstr(wgl_extensions, "WGL_ARB_render_texture")) */
 /*         { */
-/*           __glXEnableExtension(screen->glx_enable_bits, "GLX_EXT_texture_from_pixmap"); */
+/*           __glXEnableExtension(screen->base.glx_enable_bits, "GLX_EXT_texture_from_pixmap"); */
 /*           LogMessage(X_INFO, "AIGLX: GLX_EXT_texture_from_pixmap backed by buffer objects\n"); */
 /*           screen->has_WGL_ARB_render_texture = TRUE; */
 /*         } */
@@ -713,10 +710,10 @@ glxWinScreenProbe(ScreenPtr pScreen)
         // Generate the GLX extensions string (overrides that set by __glXScreenInit())
         {
             unsigned int buffer_size =
-                __glXGetExtensionString(screen->glx_enable_bits, NULL);
+                __glXGetExtensionString(screen->base.glx_enable_bits, NULL);
             if (buffer_size > 0) {
                 screen->base.GLXextensions = xnfalloc(buffer_size);
-                __glXGetExtensionString(screen->glx_enable_bits,
+                __glXGetExtensionString(screen->base.glx_enable_bits,
                                         screen->base.GLXextensions);
             }
         }
commit 23cce73221c0b96e7778da34616f8c3f4d6aa819
Author: Adam Jackson <ajax at redhat.com>
Date:   Wed Mar 23 15:13:51 2016 -0400

    xquartz/glx: Remove unused fields from the glx screen subclass
    
    dmt:~/git/xserver% git grep -E '\<(index|num_vis)\>' hw/xquartz/GL
    hw/xquartz/GL/indirect.c:    int index;
    hw/xquartz/GL/indirect.c:    int num_vis;
    
    Reviewed-by: Eric Anholt <eric at anholt.net>
    Reviewed-by: Emil Velikov <emil.velikov at collabora.com>
    Signed-off-by: Adam Jackson <ajax at redhat.com>

diff --git a/hw/xquartz/GL/indirect.c b/hw/xquartz/GL/indirect.c
index 8233608..f857325 100644
--- a/hw/xquartz/GL/indirect.c
+++ b/hw/xquartz/GL/indirect.c
@@ -115,9 +115,6 @@ struct __GLXAquaScreen {
 
     /* Supported GLX extensions */
     unsigned char glx_enable_bits[__GLX_EXT_BYTES];
-
-    int index;
-    int num_vis;
 };
 
 struct __GLXAquaContext {
commit 36bcbf76dcc7e88cac093f8fb656c525bfeaf65d
Author: Adam Jackson <ajax at redhat.com>
Date:   Wed Mar 23 15:26:23 2016 -0400

    glx: Enable GLX 1.4 unconditionally
    
    Reviewed-by: Eric Anholt <eric at anholt.net>
    Reviewed-by: Emil Velikov <emil.velikov at collabora.com>
    Signed-off-by: Adam Jackson <ajax at redhat.com>

diff --git a/glx/glxcmds.c b/glx/glxcmds.c
index 561faeb..4693e68 100644
--- a/glx/glxcmds.c
+++ b/glx/glxcmds.c
@@ -45,6 +45,7 @@
 #include "indirect_dispatch.h"
 #include "indirect_table.h"
 #include "indirect_util.h"
+#include "protocol-versions.h"
 
 static char GLXServerVendorName[] = "SGI";
 
@@ -797,8 +798,8 @@ __glXDisp_QueryVersion(__GLXclientState * cl, GLbyte * pc)
         .type = X_Reply,
         .sequenceNumber = client->sequence,
         .length = 0,
-        .majorVersion = glxMajorVersion,
-        .minorVersion = glxMinorVersion
+        .majorVersion = SERVER_GLX_MAJOR_VERSION,
+        .minorVersion = SERVER_GLX_MINOR_VERSION
     };
 
     if (client->swapped) {
@@ -2454,7 +2455,6 @@ __glXDisp_QueryServerString(__GLXclientState * cl, GLbyte * pc)
     char *buf;
     __GLXscreen *pGlxScreen;
     int err;
-    char ver_str[16];
 
     REQUEST_SIZE_MATCH(xGLXQueryServerStringReq);
 
@@ -2466,11 +2466,7 @@ __glXDisp_QueryServerString(__GLXclientState * cl, GLbyte * pc)
         ptr = GLXServerVendorName;
         break;
     case GLX_VERSION:
-        /* Return to the server version rather than the screen version
-         * to prevent confusion when they do not match.
-         */
-        snprintf(ver_str, 16, "%d.%d", glxMajorVersion, glxMinorVersion);
-        ptr = ver_str;
+        ptr = "1.4";
         break;
     case GLX_EXTENSIONS:
         ptr = pGlxScreen->GLXextensions;
diff --git a/glx/glxdri2.c b/glx/glxdri2.c
index 71dab2a..ad97eb5 100644
--- a/glx/glxdri2.c
+++ b/glx/glxdri2.c
@@ -1000,18 +1000,6 @@ __glXDRIscreenProbe(ScreenPtr pScreen)
                                        screen->base.GLXextensions);
     }
 
-    /* We're going to assume (perhaps incorrectly?) that all DRI2-enabled
-     * drivers support the required extensions for GLX 1.4.  The extensions
-     * we're assuming are:
-     *
-     *    - GLX_SGI_make_current_read (1.3)
-     *    - GLX_SGIX_fbconfig (1.3)
-     *    - GLX_SGIX_pbuffer (1.3)
-     *    - GLX_ARB_multisample (1.4)
-     */
-    screen->base.GLXmajor = 1;
-    screen->base.GLXminor = 4;
-
     screen->enterVT = pScrn->EnterVT;
     pScrn->EnterVT = glxDRIEnterVT;
     screen->leaveVT = pScrn->LeaveVT;
diff --git a/glx/glxdriswrast.c b/glx/glxdriswrast.c
index aaf55ca..65abdff 100644
--- a/glx/glxdriswrast.c
+++ b/glx/glxdriswrast.c
@@ -500,9 +500,6 @@ __glXDRIscreenProbe(ScreenPtr pScreen)
                                        screen->base.GLXextensions);
     }
 
-    screen->base.GLXmajor = 1;
-    screen->base.GLXminor = 4;
-
     __glXsetGetProcAddress(glXGetProcAddressARB);
 
     LogMessage(X_INFO, "AIGLX: Loaded and initialized %s\n", driverName);
diff --git a/glx/glxext.c b/glx/glxext.c
index e41b881..f3d8fdd 100644
--- a/glx/glxext.c
+++ b/glx/glxext.c
@@ -380,8 +380,6 @@ GlxExtensionInit(void)
 
             glxScreen = p->screenProbe(pScreen);
             if (glxScreen != NULL) {
-                if (glxScreen->GLXminor < glxMinorVersion)
-                    glxMinorVersion = glxScreen->GLXminor;
                 LogMessage(X_INFO,
                            "GLX: Initialized %s GL provider for screen %d\n",
                            p->name, i);
diff --git a/glx/glxscreens.c b/glx/glxscreens.c
index 6a17016..61b8a52 100644
--- a/glx/glxscreens.c
+++ b/glx/glxscreens.c
@@ -154,9 +154,6 @@ static const char GLServerExtensions[] =
     "GL_SGIX_shadow_ambient "
     "GL_SUN_slice_accum ";
 
-unsigned glxMajorVersion = SERVER_GLX_MAJOR_VERSION;
-unsigned glxMinorVersion = SERVER_GLX_MINOR_VERSION;
-
 static Bool
 glxCloseScreen(ScreenPtr pScreen)
 {
@@ -313,15 +310,6 @@ __glXScreenInit(__GLXscreen * pGlxScreen, ScreenPtr pScreen)
     pGlxScreen->GLextensions = strdup(GLServerExtensions);
     pGlxScreen->GLXextensions = NULL;
 
-    /* All GLX providers must support all of the functionality required for at
-     * least GLX 1.2.  If the provider supports a higher version, the GLXminor
-     * version can be changed in the provider's screen-probe routine.  For
-     * most providers, the screen-probe routine is the caller of this
-     * function.
-     */
-    pGlxScreen->GLXmajor = 1;
-    pGlxScreen->GLXminor = 2;
-
     pGlxScreen->CloseScreen = pScreen->CloseScreen;
     pScreen->CloseScreen = glxCloseScreen;
 
diff --git a/glx/glxscreens.h b/glx/glxscreens.h
index a905877..0fe85e6 100644
--- a/glx/glxscreens.h
+++ b/glx/glxscreens.h
@@ -140,20 +140,8 @@ struct __GLXscreen {
     GLint numVisuals;
 
     char *GLextensions;
-
     char *GLXextensions;
 
-    /**
-     * \name GLX version supported by this screen.
-     *
-     * Since the GLX version advertised by the server is for the whole server,
-     * the GLX protocol code uses the minimum version supported on all screens.
-     */
-    /*@{ */
-    unsigned GLXmajor;
-    unsigned GLXminor;
-    /*@} */
-
     Bool (*CloseScreen) (ScreenPtr pScreen);
 };
 
diff --git a/hw/xquartz/GL/indirect.c b/hw/xquartz/GL/indirect.c
index 398cdf1..8233608 100644
--- a/hw/xquartz/GL/indirect.c
+++ b/hw/xquartz/GL/indirect.c
@@ -548,9 +548,6 @@ __glXAquaScreenProbe(ScreenPtr pScreen)
     __glXInitExtensionEnableBits(screen->glx_enable_bits);
     __glXScreenInit(&screen->base, pScreen);
 
-    screen->base.GLXmajor = 1;
-    screen->base.GLXminor = 4;
-
     //__glXEnableExtension(screen->glx_enable_bits, "GLX_ARB_create_context");
     //__glXEnableExtension(screen->glx_enable_bits, "GLX_ARB_create_context_profile");
 
diff --git a/hw/xwin/glx/indirect.c b/hw/xwin/glx/indirect.c
index 2df014e..70d88d7 100644
--- a/hw/xwin/glx/indirect.c
+++ b/hw/xwin/glx/indirect.c
@@ -720,27 +720,7 @@ glxWinScreenProbe(ScreenPtr pScreen)
                                         screen->base.GLXextensions);
             }
         }
-
-        //
-        // Override the GLX version (__glXScreenInit() sets it to "1.2")
-        // if we have all the needed extensions to operate as a higher version
-        //
-        // SGIX_fbconfig && SGIX_pbuffer && SGI_make_current_read -> 1.3
-        // ARB_multisample -> 1.4
-        //
-        if (screen->has_WGL_ARB_pbuffer) {
-            if (screen->has_WGL_ARB_multisample) {
-                screen->base.GLXmajor = 1;
-                screen->base.GLXminor = 4;
-            }
-            else {
-                screen->base.GLXmajor = 1;
-                screen->base.GLXminor = 3;
-            }
-        }
     }
-    LogMessage(X_INFO, "AIGLX: Set GLX version to %d.%d\n",
-               screen->base.GLXmajor, screen->base.GLXminor);
 
     wglMakeCurrent(NULL, NULL);
     wglDeleteContext(hglrc);
commit 2a72789ee8e88f612dff48ebe2ebe9fecda7a95d
Author: Adam Jackson <ajax at redhat.com>
Date:   Wed Mar 16 16:28:13 2016 -0400

    xwin/glx: Drop GLWIN_NO_WGL_EXTENSIONS hack
    
    This doesn't seem very useful, and we're about to implement 1.4 across
    the board, so some WGL extensions will become required.
    
    Reviewed-by: Eric Anholt <eric at anholt.net>
    Reviewed-by: Emil Velikov <emil.velikov at collabora.com>
    Signed-off-by: Adam Jackson <ajax at redhat.com>

diff --git a/hw/xwin/glx/indirect.c b/hw/xwin/glx/indirect.c
index cbbc113..2df014e 100644
--- a/hw/xwin/glx/indirect.c
+++ b/hw/xwin/glx/indirect.c
@@ -628,16 +628,6 @@ glxWinScreenProbe(ScreenPtr pScreen)
     // those screens to be accelerated in XP and earlier...
 
     {
-        // testing facility to not use any WGL extensions
-        char *envptr = getenv("GLWIN_NO_WGL_EXTENSIONS");
-
-        if ((envptr != NULL) && (atoi(envptr) != 0)) {
-            ErrorF("GLWIN_NO_WGL_EXTENSIONS is set, ignoring WGL_EXTENSIONS\n");
-            wgl_extensions = "";
-        }
-    }
-
-    {
         //
         // Based on the WGL extensions available, enable various GLX extensions
         // XXX: make this table-driven ?
commit 77bdaa1313aa55191b49ec73c1e377928ca294fe
Author: Adam Jackson <ajax at redhat.com>
Date:   Tue Mar 22 14:40:37 2016 -0400

    glx: Use __glXInitExtensionEnableBits in all backends (v2)
    
    On xquartz this enables SGI_make_current_read, which is a mostly
    harmless lie as CGL doesn't implement it, as well as SGIX_pbuffer, which
    is fine because no pbuffer-enabled configs are created.
    
    On xwin this enables SGIX_pbuffer and ARB_multisample in all cases.
    Again this is harmless if the backend doesn't support the features,
    since no fbconfigs will be created to expose them.
    
    It also adds SGIX_visual_select_group to both xquartz and xwin.
    Amusingly, both were filling in the appropriate field in the fbconfig
    already.
    
    v2: Warn about missing WGL extensions (Emil)
    
    Reviewed-by: Eric Anholt <eric at anholt.net>
    Reviewed-by: Emil Velikov <emil.velikov at collabora.com>
    Signed-off-by: Adam Jackson <ajax at redhat.com>

diff --git a/hw/xquartz/GL/indirect.c b/hw/xquartz/GL/indirect.c
index 544cb78..398cdf1 100644
--- a/hw/xquartz/GL/indirect.c
+++ b/hw/xquartz/GL/indirect.c
@@ -545,22 +545,12 @@ __glXAquaScreenProbe(ScreenPtr pScreen)
     screen->base.fbconfigs = __glXAquaCreateVisualConfigs(
         &screen->base.numFBConfigs, pScreen->myNum);
 
+    __glXInitExtensionEnableBits(screen->glx_enable_bits);
     __glXScreenInit(&screen->base, pScreen);
 
     screen->base.GLXmajor = 1;
     screen->base.GLXminor = 4;
 
-    memset(screen->glx_enable_bits, 0, __GLX_EXT_BYTES);
-
-    __glXEnableExtension(screen->glx_enable_bits, "GLX_EXT_visual_info");
-    __glXEnableExtension(screen->glx_enable_bits, "GLX_EXT_visual_rating");
-    __glXEnableExtension(screen->glx_enable_bits, "GLX_EXT_import_context");
-    __glXEnableExtension(screen->glx_enable_bits, "GLX_OML_swap_method");
-    __glXEnableExtension(screen->glx_enable_bits, "GLX_SGIX_fbconfig");
-
-    __glXEnableExtension(screen->glx_enable_bits, "GLX_SGIS_multisample");
-    __glXEnableExtension(screen->glx_enable_bits, "GLX_ARB_multisample");
-
     //__glXEnableExtension(screen->glx_enable_bits, "GLX_ARB_create_context");
     //__glXEnableExtension(screen->glx_enable_bits, "GLX_ARB_create_context_profile");
 
diff --git a/hw/xwin/glx/indirect.c b/hw/xwin/glx/indirect.c
index 7828b6c..cbbc113 100644
--- a/hw/xwin/glx/indirect.c
+++ b/hw/xwin/glx/indirect.c
@@ -642,17 +642,12 @@ glxWinScreenProbe(ScreenPtr pScreen)
         // Based on the WGL extensions available, enable various GLX extensions
         // XXX: make this table-driven ?
         //
-        memset(screen->glx_enable_bits, 0, __GLX_EXT_BYTES);
-
-        __glXEnableExtension(screen->glx_enable_bits, "GLX_EXT_visual_info");
-        __glXEnableExtension(screen->glx_enable_bits, "GLX_EXT_visual_rating");
-        __glXEnableExtension(screen->glx_enable_bits, "GLX_EXT_import_context");
-        __glXEnableExtension(screen->glx_enable_bits, "GLX_OML_swap_method");
-        __glXEnableExtension(screen->glx_enable_bits, "GLX_SGIX_fbconfig");
-        __glXEnableExtension(screen->glx_enable_bits, "GLX_SGI_make_current_read");
+        __glXInitExtensionEnableBits(screen->glx_enable_bits);
 
         if (strstr(wgl_extensions, "WGL_ARB_make_current_read"))
             screen->has_WGL_ARB_make_current_read = TRUE;
+        else
+            LogMessage(X_WARNING, "AIGLX: missing WGL_ARB_make_current_read\n")
 
         if (strstr(gl_extensions, "GL_WIN_swap_hint")) {
             __glXEnableExtension(screen->glx_enable_bits,
@@ -674,21 +669,15 @@ glxWinScreenProbe(ScreenPtr pScreen)
 /*           screen->has_WGL_ARB_render_texture = TRUE; */
 /*         } */
 
-        if (strstr(wgl_extensions, "WGL_ARB_pbuffer")) {
-            __glXEnableExtension(screen->glx_enable_bits, "GLX_SGIX_pbuffer");
-            LogMessage(X_INFO, "AIGLX: enabled GLX_SGIX_pbuffer\n");
+        if (strstr(wgl_extensions, "WGL_ARB_pbuffer"))
             screen->has_WGL_ARB_pbuffer = TRUE;
-        }
+        else
+            LogMessage(X_WARNING, "AIGLX: missing WGL_ARB_pbuffer\n")
 
-        if (strstr(wgl_extensions, "WGL_ARB_multisample")) {
-            __glXEnableExtension(screen->glx_enable_bits,
-                                 "GLX_ARB_multisample");
-            __glXEnableExtension(screen->glx_enable_bits,
-                                 "GLX_SGIS_multisample");
-            LogMessage(X_INFO,
-                       "AIGLX: enabled GLX_ARB_multisample and GLX_SGIS_multisample\n");
+        if (strstr(wgl_extensions, "WGL_ARB_multisample"))
             screen->has_WGL_ARB_multisample = TRUE;
-        }
+        else
+            LogMessage(X_WARNING, "AIGLX: missing WGL_ARB_multisample\n")
 
         screen->base.destroy = glxWinScreenDestroy;
         screen->base.createContext = glxWinCreateContext;
commit 15af78fc56569dc3b6a7f2c5a6a49edb602111b7
Author: Adam Jackson <ajax at redhat.com>
Date:   Wed Mar 23 15:19:15 2016 -0400

    glx: Enable GLX_SGI_make_current_read in the core
    
    GLX 1.3 implies equivalent functionality, so this is safe to enable
    unconditionally, and bindContext always takes both drawable and readable
    arguments in any case. Mesa stopped exporting the __DRI_READ_DRAWABLE
    extension in 8.0 (when the DRI1 drivers were removed) so this will
    restore the extension string.
    
    Reviewed-by: Eric Anholt <eric at anholt.net>
    Reviewed-by: Emil Velikov <emil.velikov at collabora.com>
    Signed-off-by: Adam Jackson <ajax at redhat.com>

diff --git a/glx/extension_string.c b/glx/extension_string.c
index 30c3416..7e74090 100644
--- a/glx/extension_string.c
+++ b/glx/extension_string.c
@@ -92,7 +92,7 @@ static const struct extension_info known_glx_extensions[] = {
 
     { GLX(MESA_copy_sub_buffer),        VER(0,0), N, },
     { GLX(OML_swap_method),             VER(0,0), Y, },
-    { GLX(SGI_make_current_read),       VER(1,3), N, },
+    { GLX(SGI_make_current_read),       VER(1,3), Y, },
     { GLX(SGI_swap_control),            VER(0,0), N, },
     { GLX(SGIS_multisample),            VER(0,0), Y, },
     { GLX(SGIX_fbconfig),               VER(1,3), Y, },
diff --git a/glx/glxdri2.c b/glx/glxdri2.c
index c56a376..71dab2a 100644
--- a/glx/glxdri2.c
+++ b/glx/glxdri2.c
@@ -900,13 +900,6 @@ initializeExtensions(__GLXDRIscreen * screen)
     }
 
     for (i = 0; extensions[i]; i++) {
-        if (strcmp(extensions[i]->name, __DRI_READ_DRAWABLE) == 0) {
-            __glXEnableExtension(screen->glx_enable_bits,
-                                 "GLX_SGI_make_current_read");
-
-            LogMessage(X_INFO, "AIGLX: enabled GLX_SGI_make_current_read\n");
-        }
-
         if (strcmp(extensions[i]->name, __DRI_TEX_BUFFER) == 0) {
             screen->texBuffer = (const __DRItexBufferExtension *) extensions[i];
             __glXEnableExtension(screen->glx_enable_bits,
diff --git a/glx/glxdriswrast.c b/glx/glxdriswrast.c
index 84fd3a1..aaf55ca 100644
--- a/glx/glxdriswrast.c
+++ b/glx/glxdriswrast.c
@@ -414,7 +414,6 @@ initializeExtensions(__GLXDRIscreen * screen)
     __glXEnableExtension(screen->glx_enable_bits, "GLX_EXT_framebuffer_sRGB");
     __glXEnableExtension(screen->glx_enable_bits, "GLX_ARB_fbconfig_float");
     __glXEnableExtension(screen->glx_enable_bits, "GLX_EXT_fbconfig_packed_float");
-    __glXEnableExtension(screen->glx_enable_bits, "GLX_SGI_make_current_read");
 
     extensions = screen->core->getExtensions(screen->driScreen);
 
commit 9b2fc6d98691966f1c9186edad956f78c31f3698
Author: Adam Jackson <ajax at redhat.com>
Date:   Wed Mar 23 14:57:25 2016 -0400

    xwin/glx: Enable GLX_SGI_make_current_read unconditionally (v2)
    
    This seems to be fairly universal these days, and if it doesn't exist
    the only thing you break is separate drawable and readable, which is a
    rare feature to use. So pretend it's always there and just throw an
    error on MakeCurrent if it isn't, and don't consider it when computing
    the GLX version number.
    
    v2: Fix type-o for glxWinScreen (Jon Turney)
    
    Reviewed-by: Eric Anholt <eric at anholt.net>
    Reviewed-by: Emil Velikov <emil.velikov at collabora.com>
    Signed-off-by: Adam Jackson <ajax at redhat.com>

diff --git a/hw/xwin/glx/indirect.c b/hw/xwin/glx/indirect.c
index c4be791..7828b6c 100644
--- a/hw/xwin/glx/indirect.c
+++ b/hw/xwin/glx/indirect.c
@@ -143,6 +143,7 @@ struct __GLXWinScreen {
     Bool has_WGL_ARB_pixel_format;
     Bool has_WGL_ARB_pbuffer;
     Bool has_WGL_ARB_render_texture;
+    Bool has_WGL_ARB_make_current_read;
 
     /* wrapped screen functions */
     RealizeWindowProcPtr RealizeWindow;
@@ -637,8 +638,6 @@ glxWinScreenProbe(ScreenPtr pScreen)
     }
 
     {
-        Bool glx_sgi_make_current_read = FALSE;
-
         //
         // Based on the WGL extensions available, enable various GLX extensions
         // XXX: make this table-driven ?
@@ -650,13 +649,10 @@ glxWinScreenProbe(ScreenPtr pScreen)
         __glXEnableExtension(screen->glx_enable_bits, "GLX_EXT_import_context");
         __glXEnableExtension(screen->glx_enable_bits, "GLX_OML_swap_method");
         __glXEnableExtension(screen->glx_enable_bits, "GLX_SGIX_fbconfig");
+        __glXEnableExtension(screen->glx_enable_bits, "GLX_SGI_make_current_read");
 
-        if (strstr(wgl_extensions, "WGL_ARB_make_current_read")) {
-            __glXEnableExtension(screen->glx_enable_bits,
-                                 "GLX_SGI_make_current_read");
-            LogMessage(X_INFO, "AIGLX: enabled GLX_SGI_make_current_read\n");
-            glx_sgi_make_current_read = TRUE;
-        }
+        if (strstr(wgl_extensions, "WGL_ARB_make_current_read"))
+            screen->has_WGL_ARB_make_current_read = TRUE;
 
         if (strstr(gl_extensions, "GL_WIN_swap_hint")) {
             __glXEnableExtension(screen->glx_enable_bits,
@@ -753,7 +749,7 @@ glxWinScreenProbe(ScreenPtr pScreen)
         // SGIX_fbconfig && SGIX_pbuffer && SGI_make_current_read -> 1.3
         // ARB_multisample -> 1.4
         //
-        if (screen->has_WGL_ARB_pbuffer && glx_sgi_make_current_read) {
+        if (screen->has_WGL_ARB_pbuffer) {
             if (screen->has_WGL_ARB_multisample) {
                 screen->base.GLXmajor = 1;
                 screen->base.GLXminor = 4;
@@ -1429,6 +1425,7 @@ static int
 glxWinContextMakeCurrent(__GLXcontext * base)
 {
     __GLXWinContext *gc = (__GLXWinContext *) base;
+    glxWinScreen *scr = (glxWinScreen *)base->pGlxScreen;
     BOOL ret;
     HDC drawDC;
     HDC readDC = NULL;
@@ -1461,7 +1458,14 @@ glxWinContextMakeCurrent(__GLXcontext * base)
     }
 
     if ((gc->base.readPriv != NULL) && (gc->base.readPriv != gc->base.drawPriv)) {
-        // XXX: should only occur with WGL_ARB_make_current_read
+        /*
+         * We enable GLX_SGI_make_current_read unconditionally, but the
+         * renderer might not support it. It's fairly rare to use this
+         * feature so just error out if it can't work.
+         */
+        if (!scr->has_WGL_ARB_make_current_read)
+            return False;
+
         /*
            If there is a separate read drawable, create a separate read DC, and
            use the wglMakeContextCurrent extension to make the context current drawing
commit b2ef7df476af619903ef7f6b6962b371ae14306c
Author: Adam Jackson <ajax at redhat.com>
Date:   Sat Mar 19 13:44:10 2016 -0400

    xquartz/glx: Error out for MakeContextCurrent(draw != read)
    
    CGL doesn't have a way to express this directly, unlike EGL WGL and GLX.
    It might be implementable, but it's never actually worked, and it's a
    fairly niche feature so we're better off throwing an error if someone
    attempts it.
    
    Reviewed-by: Eric Anholt <eric at anholt.net>
    Reviewed-by: Emil Velikov <emil.velikov at collabora.com>
    Reviewed-by: Jeremy Huddleston Sequoia <jeremyhu at apple.com>
    Signed-off-by: Adam Jackson <ajax at redhat.com>

diff --git a/hw/xquartz/GL/indirect.c b/hw/xquartz/GL/indirect.c
index 4f3e2e4..544cb78 100644
--- a/hw/xquartz/GL/indirect.c
+++ b/hw/xquartz/GL/indirect.c
@@ -387,6 +387,9 @@ __glXAquaContextMakeCurrent(__GLXcontext *baseContext)
 
     GLAQUA_DEBUG_MSG("glAquaMakeCurrent (ctx 0x%p)\n", baseContext);
 
+    if (context->base.drawPriv != context->base.readPriv)
+        return 0;
+
     if (attach(context, drawPriv))
         return /*error*/ 0;
 
commit f95645c6f70019316f8ad77b7beb84530fc0505f
Author: Adam Jackson <ajax at redhat.com>
Date:   Tue Mar 22 14:37:19 2016 -0400

    glx: Don't enable EXT_texture_from_pixmap unconditionally
    
    Not all backend servers implement this.  Those that don't happen to not
    use __glXInitExtensionEnableBits, but we'd like that to change, so fix
    it up before we switch them over.
    
    Reviewed-by: Eric Anholt <eric at anholt.net>
    Reviewed-by: Emil Velikov <emil.velikov at collabora.com>
    Signed-off-by: Adam Jackson <ajax at redhat.com>

diff --git a/glx/extension_string.c b/glx/extension_string.c
index 616c793..30c3416 100644
--- a/glx/extension_string.c
+++ b/glx/extension_string.c
@@ -86,7 +86,7 @@ static const struct extension_info known_glx_extensions[] = {
     { GLX(EXT_framebuffer_sRGB),        VER(0,0), N, },
     { GLX(EXT_import_context),          VER(0,0), Y, },
     { GLX(EXT_stereo_tree),             VER(0,0), N, },
-    { GLX(EXT_texture_from_pixmap),     VER(0,0), Y, },
+    { GLX(EXT_texture_from_pixmap),     VER(0,0), N, },
     { GLX(EXT_visual_info),             VER(0,0), Y, },
     { GLX(EXT_visual_rating),           VER(0,0), Y, },
 
diff --git a/glx/glxdri2.c b/glx/glxdri2.c
index 2a7c1e3..c56a376 100644
--- a/glx/glxdri2.c
+++ b/glx/glxdri2.c
@@ -909,7 +909,8 @@ initializeExtensions(__GLXDRIscreen * screen)
 
         if (strcmp(extensions[i]->name, __DRI_TEX_BUFFER) == 0) {
             screen->texBuffer = (const __DRItexBufferExtension *) extensions[i];
-            /* GLX_EXT_texture_from_pixmap is always enabled. */
+            __glXEnableExtension(screen->glx_enable_bits,
+                                 "GLX_EXT_texture_from_pixmap");
             LogMessage(X_INFO,
                        "AIGLX: GLX_EXT_texture_from_pixmap backed by buffer objects\n");
         }
diff --git a/glx/glxdriswrast.c b/glx/glxdriswrast.c
index cb57e9a..84fd3a1 100644
--- a/glx/glxdriswrast.c
+++ b/glx/glxdriswrast.c
@@ -426,7 +426,8 @@ initializeExtensions(__GLXDRIscreen * screen)
 
         if (strcmp(extensions[i]->name, __DRI_TEX_BUFFER) == 0) {
             screen->texBuffer = (const __DRItexBufferExtension *) extensions[i];
-            /* GLX_EXT_texture_from_pixmap is always enabled. */
+            __glXEnableExtension(screen->glx_enable_bits,
+                                 "GLX_EXT_texture_from_pixmap\n");
         }
 
 #ifdef __DRI2_FLUSH_CONTROL
commit 410aec82556def5395f51299bcefbeb7d0bda604
Author: Adam Jackson <ajax at redhat.com>
Date:   Tue Mar 22 14:29:06 2016 -0400

    glx: Remove server-side mention of GLX_MESA_swap_control
    
    This extension is direct-only and has no GLX protocol. We don't even
    track an enable bit for it, trying to turn it on is pointless.
    
    Reviewed-by: Eric Anholt <eric at anholt.net>
    Reviewed-by: Emil Velikov <emil.velikov at collabora.com>
    Signed-off-by: Adam Jackson <ajax at redhat.com>

diff --git a/glx/glxdri2.c b/glx/glxdri2.c
index 948d653..2a7c1e3 100644
--- a/glx/glxdri2.c
+++ b/glx/glxdri2.c
@@ -876,10 +876,8 @@ initializeExtensions(__GLXDRIscreen * screen)
     if (DRI2HasSwapControl(pScreen)) {
         __glXEnableExtension(screen->glx_enable_bits, "GLX_INTEL_swap_event");
         __glXEnableExtension(screen->glx_enable_bits, "GLX_SGI_swap_control");
-        __glXEnableExtension(screen->glx_enable_bits, "GLX_MESA_swap_control");
         LogMessage(X_INFO, "AIGLX: enabled GLX_INTEL_swap_event\n");
-        LogMessage(X_INFO,
-                   "AIGLX: enabled GLX_SGI_swap_control and GLX_MESA_swap_control\n");
+        LogMessage(X_INFO, "AIGLX: enabled GLX_SGI_swap_control\n");
     }
 
     /* enable EXT_framebuffer_sRGB extension (even if there are no sRGB capable fbconfigs) */
diff --git a/hw/xwin/glx/indirect.c b/hw/xwin/glx/indirect.c
index e515d18..c4be791 100644
--- a/hw/xwin/glx/indirect.c
+++ b/hw/xwin/glx/indirect.c
@@ -667,10 +667,7 @@ glxWinScreenProbe(ScreenPtr pScreen)
         if (strstr(wgl_extensions, "WGL_EXT_swap_control")) {
             __glXEnableExtension(screen->glx_enable_bits,
                                  "GLX_SGI_swap_control");
-            __glXEnableExtension(screen->glx_enable_bits,
-                                 "GLX_MESA_swap_control");
-            LogMessage(X_INFO,
-                       "AIGLX: enabled GLX_SGI_swap_control and GLX_MESA_swap_control\n");
+            LogMessage(X_INFO, "AIGLX: enabled GLX_SGI_swap_control\n");
         }
 
 /*       // Hmm?  screen->texOffset */
commit 3a21da59e59cf11a9113d71e3431c4bd394ff1e8
Author: Adam Jackson <ajax at redhat.com>
Date:   Wed Mar 16 19:05:17 2016 -0400

    glx: Remove default server glx extension string
    
    This existed only to be strdup'd and then immediately freed.
    
    Reviewed-by: Eric Anholt <eric at anholt.net>
    Reviewed-by: Emil Velikov <emil.velikov at collabora.com>
    Signed-off-by: Adam Jackson <ajax at redhat.com>

diff --git a/glx/glxdri2.c b/glx/glxdri2.c
index 58e60b9..948d653 100644
--- a/glx/glxdri2.c
+++ b/glx/glxdri2.c
@@ -1003,8 +1003,6 @@ __glXDRIscreenProbe(ScreenPtr pScreen)
      */
     buffer_size = __glXGetExtensionString(screen->glx_enable_bits, NULL);
     if (buffer_size > 0) {
-        free(screen->base.GLXextensions);
-
         screen->base.GLXextensions = xnfalloc(buffer_size);
         (void) __glXGetExtensionString(screen->glx_enable_bits,
                                        screen->base.GLXextensions);
diff --git a/glx/glxdriswrast.c b/glx/glxdriswrast.c
index 924067c..cb57e9a 100644
--- a/glx/glxdriswrast.c
+++ b/glx/glxdriswrast.c
@@ -495,8 +495,6 @@ __glXDRIscreenProbe(ScreenPtr pScreen)
      */
     buffer_size = __glXGetExtensionString(screen->glx_enable_bits, NULL);
     if (buffer_size > 0) {
-        free(screen->base.GLXextensions);
-
         screen->base.GLXextensions = xnfalloc(buffer_size);
         (void) __glXGetExtensionString(screen->glx_enable_bits,
                                        screen->base.GLXextensions);
diff --git a/glx/glxscreens.c b/glx/glxscreens.c
index b0ad3b7..6a17016 100644
--- a/glx/glxscreens.c
+++ b/glx/glxscreens.c
@@ -154,26 +154,8 @@ static const char GLServerExtensions[] =
     "GL_SGIX_shadow_ambient "
     "GL_SUN_slice_accum ";
 
-/*
-** We have made the simplifying assuption that the same extensions are
-** supported across all screens in a multi-screen system.
-*/
 unsigned glxMajorVersion = SERVER_GLX_MAJOR_VERSION;
 unsigned glxMinorVersion = SERVER_GLX_MINOR_VERSION;
-static char GLXServerExtensions[] =
-    "GLX_ARB_multisample "
-    "GLX_EXT_visual_info "
-    "GLX_EXT_visual_rating "
-    "GLX_EXT_import_context "
-    "GLX_EXT_texture_from_pixmap "
-    "GLX_OML_swap_method "
-    "GLX_SGI_make_current_read "
-#ifndef __APPLE__
-    "GLX_SGIS_multisample "
-#endif
-    "GLX_SGIX_fbconfig "
-    "GLX_SGIX_pbuffer "
-    "GLX_MESA_copy_sub_buffer ";
 
 static Bool
 glxCloseScreen(ScreenPtr pScreen)
@@ -329,7 +311,7 @@ __glXScreenInit(__GLXscreen * pGlxScreen, ScreenPtr pScreen)
 
     pGlxScreen->pScreen = pScreen;
     pGlxScreen->GLextensions = strdup(GLServerExtensions);
-    pGlxScreen->GLXextensions = strdup(GLXServerExtensions);
+    pGlxScreen->GLXextensions = NULL;
 
     /* All GLX providers must support all of the functionality required for at
      * least GLX 1.2.  If the provider supports a higher version, the GLXminor
diff --git a/hw/xquartz/GL/indirect.c b/hw/xquartz/GL/indirect.c
index 4e6ab3d..4f3e2e4 100644
--- a/hw/xquartz/GL/indirect.c
+++ b/hw/xquartz/GL/indirect.c
@@ -566,8 +566,6 @@ __glXAquaScreenProbe(ScreenPtr pScreen)
         unsigned int buffer_size =
             __glXGetExtensionString(screen->glx_enable_bits, NULL);
         if (buffer_size > 0) {
-            free(screen->base.GLXextensions);
-
             screen->base.GLXextensions = xnfalloc(buffer_size);
             __glXGetExtensionString(screen->glx_enable_bits,
                                     screen->base.GLXextensions);
diff --git a/hw/xwin/glx/indirect.c b/hw/xwin/glx/indirect.c
index e4be642..e515d18 100644
--- a/hw/xwin/glx/indirect.c
+++ b/hw/xwin/glx/indirect.c
@@ -743,8 +743,6 @@ glxWinScreenProbe(ScreenPtr pScreen)
             unsigned int buffer_size =
                 __glXGetExtensionString(screen->glx_enable_bits, NULL);
             if (buffer_size > 0) {
-                free(screen->base.GLXextensions);
-
                 screen->base.GLXextensions = xnfalloc(buffer_size);
                 __glXGetExtensionString(screen->glx_enable_bits,
                                         screen->base.GLXextensions);


More information about the xorg-commit mailing list