Bug 1344433 - Allow GLX 1.3+glXGetProcAddressARB. - r=jrmuizel draft
authorJeff Gilbert <jgilbert@mozilla.com>
Mon, 06 Mar 2017 13:27:38 -0800
changeset 494229 6144f7e245a7407e5fa41081b8daad60d081b239
parent 493551 584d81639d7375fef0db66811c610e60b78d6879
child 548048 14565653c3d9ca8c9c56dcf6bc3052758d1e356b
push id47977
push userbmo:jgilbert@mozilla.com
push dateMon, 06 Mar 2017 21:31:27 +0000
reviewersjrmuizel
bugs1344433
milestone54.0a1
Bug 1344433 - Allow GLX 1.3+glXGetProcAddressARB. - r=jrmuizel MozReview-Commit-ID: IpjF3HXgcLy
gfx/gl/GLContextProviderGLX.cpp
--- a/gfx/gl/GLContextProviderGLX.cpp
+++ b/gfx/gl/GLContextProviderGLX.cpp
@@ -106,33 +106,53 @@ GLXLibrary::EnsureInitialized()
         /* functions that were in GLX 1.0 */
         SYMBOL(DestroyContext),
         SYMBOL(MakeCurrent),
         SYMBOL(SwapBuffers),
         SYMBOL(QueryVersion),
         SYMBOL(GetCurrentContext),
         SYMBOL(WaitGL),
         SYMBOL(WaitX),
+
         /* functions introduced in GLX 1.1 */
         SYMBOL(QueryExtensionsString),
         SYMBOL(GetClientString),
         SYMBOL(QueryServerString),
+
         /* functions introduced in GLX 1.3 */
         SYMBOL(ChooseFBConfig),
         SYMBOL(GetFBConfigAttrib),
-        // WARNING: xGetFBConfigs not set in symbols13_ext
         SYMBOL(GetFBConfigs),
-        // WARNING: symbols13_ext sets xCreateGLXPixmapWithConfig instead
         SYMBOL(CreatePixmap),
         SYMBOL(DestroyPixmap),
         SYMBOL(CreateNewContext),
-        /* functions introduced in GLX 1.4 */
-        SYMBOL(GetProcAddress),
+
+        // Core in GLX 1.4, ARB extension before.
+        { (PRFuncPtr*)&mSymbols.fGetProcAddress, { "glXGetProcAddress",
+                                                   "glXGetProcAddressARB",
+                                                   nullptr } },
         END_OF_SYMBOLS
     };
+    if (!GLLibraryLoader::LoadSymbols(mOGLLibrary, symbols)) {
+        NS_WARNING("Couldn't load required GLX symbols.");
+        return false;
+    }
+
+    Display* display = DefaultXDisplay();
+    int screen = DefaultScreen(display);
+
+    {
+        int major, minor;
+        if (!fQueryVersion(display, &major, &minor) ||
+            major != 1 || minor < 3)
+        {
+            NS_ERROR("GLX version older than 1.3. (released in 1998)");
+            return false;
+        }
+    }
 
     const GLLibraryLoader::SymLoadStruct symbols_texturefrompixmap[] = {
         SYMBOL(BindTexImageEXT),
         SYMBOL(ReleaseTexImageEXT),
         END_OF_SYMBOLS
     };
 
     const GLLibraryLoader::SymLoadStruct symbols_createcontext[] = {
@@ -146,34 +166,16 @@ GLXLibrary::EnsureInitialized()
         END_OF_SYMBOLS
     };
 
     const GLLibraryLoader::SymLoadStruct symbols_swapcontrol[] = {
         SYMBOL(SwapIntervalEXT),
         END_OF_SYMBOLS
     };
 
-    if (!GLLibraryLoader::LoadSymbols(mOGLLibrary, symbols)) {
-        NS_WARNING("Couldn't find required entry point in OpenGL shared library");
-        return false;
-    }
-
-    Display* display = DefaultXDisplay();
-    int screen = DefaultScreen(display);
-
-    {
-        int major, minor;
-        if (!fQueryVersion(display, &major, &minor) ||
-            major != 1 || minor < 4)
-        {
-            NS_ERROR("GLX version older than 1.4. (released in 2005)");
-            return false;
-        }
-    }
-
     const auto lookupFunction =
         (GLLibraryLoader::PlatformLookupFunction)mSymbols.fGetProcAddress;
 
     const auto fnLoadSymbols = [&](const GLLibraryLoader::SymLoadStruct* symbols) {
         if (GLLibraryLoader::LoadSymbols(mOGLLibrary, symbols, lookupFunction))
             return true;
 
         GLLibraryLoader::ClearSymbols(symbols);