Bug 1344433 - Require GLX 1.4 (released 2005) - r=daoshengmu draft
authorJeff Gilbert <jgilbert@mozilla.com>
Thu, 02 Mar 2017 13:55:31 -0800
changeset 493548 9ea84c5270ce98b0905c40bb5511bc29e56e28d3
parent 493547 c65bc0928bbede0a6c94cfa2a812a05d3afe8296
child 493549 99dce8a6e34bddee7b330404649832cf7d735d09
push id47799
push userbmo:jgilbert@mozilla.com
push dateSat, 04 Mar 2017 22:02:43 +0000
reviewersdaoshengmu
bugs1344433
milestone54.0a1
Bug 1344433 - Require GLX 1.4 (released 2005) - r=daoshengmu MozReview-Commit-ID: 9SJFyJqejES
gfx/gl/GLContextProviderGLX.cpp
gfx/gl/GLXLibrary.h
--- a/gfx/gl/GLContextProviderGLX.cpp
+++ b/gfx/gl/GLContextProviderGLX.cpp
@@ -45,24 +45,16 @@
 namespace mozilla {
 namespace gl {
 
 using namespace mozilla::gfx;
 using namespace mozilla::widget;
 
 GLXLibrary sGLXLibrary;
 
-// Check that we have at least version aMajor.aMinor .
-bool
-GLXLibrary::GLXVersionCheck(int aMajor, int aMinor)
-{
-    return aMajor < mGLXMajorVersion ||
-           (aMajor == mGLXMajorVersion && aMinor <= mGLXMinorVersion);
-}
-
 static inline bool
 HasExtension(const char* aExtensions, const char* aRequiredExtension)
 {
     return GLContext::ListHasExtension(
         reinterpret_cast<const GLubyte*>(aExtensions), aRequiredExtension);
 }
 
 bool
@@ -115,58 +107,30 @@ GLXLibrary::EnsureInitialized()
         { (PRFuncPtr*) &xQueryVersionInternal, { "glXQueryVersion", nullptr } },
         { (PRFuncPtr*) &xGetCurrentContextInternal, { "glXGetCurrentContext", nullptr } },
         { (PRFuncPtr*) &xWaitGLInternal, { "glXWaitGL", nullptr } },
         { (PRFuncPtr*) &xWaitXInternal, { "glXWaitX", nullptr } },
         /* functions introduced in GLX 1.1 */
         { (PRFuncPtr*) &xQueryExtensionsStringInternal, { "glXQueryExtensionsString", nullptr } },
         { (PRFuncPtr*) &xGetClientStringInternal, { "glXGetClientString", nullptr } },
         { (PRFuncPtr*) &xQueryServerStringInternal, { "glXQueryServerString", nullptr } },
-        { nullptr, { nullptr } }
-    };
-
-    GLLibraryLoader::SymLoadStruct symbols13[] = {
         /* functions introduced in GLX 1.3 */
         { (PRFuncPtr*) &xChooseFBConfigInternal, { "glXChooseFBConfig", nullptr } },
         { (PRFuncPtr*) &xGetFBConfigAttribInternal, { "glXGetFBConfigAttrib", nullptr } },
         // WARNING: xGetFBConfigs not set in symbols13_ext
         { (PRFuncPtr*) &xGetFBConfigsInternal, { "glXGetFBConfigs", nullptr } },
         // WARNING: symbols13_ext sets xCreateGLXPixmapWithConfig instead
         { (PRFuncPtr*) &xCreatePixmapInternal, { "glXCreatePixmap", nullptr } },
         { (PRFuncPtr*) &xDestroyPixmapInternal, { "glXDestroyPixmap", nullptr } },
         { (PRFuncPtr*) &xCreateNewContextInternal, { "glXCreateNewContext", nullptr } },
-        { nullptr, { nullptr } }
-    };
-
-    GLLibraryLoader::SymLoadStruct symbols13_ext[] = {
-        /* extension equivalents for functions introduced in GLX 1.3 */
-        // GLX_SGIX_fbconfig extension
-        { (PRFuncPtr*) &xChooseFBConfigInternal, { "glXChooseFBConfigSGIX", nullptr } },
-        { (PRFuncPtr*) &xGetFBConfigAttribInternal, { "glXGetFBConfigAttribSGIX", nullptr } },
-        // WARNING: no xGetFBConfigs equivalent in extensions
-        // WARNING: different from symbols13:
-        { (PRFuncPtr*) &xCreateGLXPixmapWithConfigInternal, { "glXCreateGLXPixmapWithConfigSGIX", nullptr } },
-        { (PRFuncPtr*) &xDestroyPixmapInternal, { "glXDestroyGLXPixmap", nullptr } }, // not from ext
-        { (PRFuncPtr*) &xCreateNewContextInternal, { "glXCreateContextWithConfigSGIX", nullptr } },
-        { nullptr, { nullptr } }
-    };
-
-    GLLibraryLoader::SymLoadStruct symbols14[] = {
         /* functions introduced in GLX 1.4 */
         { (PRFuncPtr*) &xGetProcAddressInternal, { "glXGetProcAddress", nullptr } },
         { nullptr, { nullptr } }
     };
 
-    GLLibraryLoader::SymLoadStruct symbols14_ext[] = {
-        /* extension equivalents for functions introduced in GLX 1.4 */
-        // GLX_ARB_get_proc_address extension
-        { (PRFuncPtr*) &xGetProcAddressInternal, { "glXGetProcAddressARB", nullptr } },
-        { nullptr, { nullptr } }
-    };
-
     GLLibraryLoader::SymLoadStruct symbols_texturefrompixmap[] = {
         { (PRFuncPtr*) &xBindTexImageInternal, { "glXBindTexImageEXT", nullptr } },
         { (PRFuncPtr*) &xReleaseTexImageInternal, { "glXReleaseTexImageEXT", nullptr } },
         { nullptr, { nullptr } }
     };
 
     GLLibraryLoader::SymLoadStruct symbols_createcontext[] = {
         { (PRFuncPtr*) &xCreateContextAttribsInternal, { "glXCreateContextAttribsARB", nullptr } },
@@ -187,62 +151,30 @@ GLXLibrary::EnsureInitialized()
     if (!GLLibraryLoader::LoadSymbols(mOGLLibrary, &symbols[0])) {
         NS_WARNING("Couldn't find required entry point in OpenGL shared library");
         return false;
     }
 
     Display* display = DefaultXDisplay();
     int screen = DefaultScreen(display);
 
-    if (!xQueryVersion(display, &mGLXMajorVersion, &mGLXMinorVersion)) {
-        mGLXMajorVersion = 0;
-        mGLXMinorVersion = 0;
-        return false;
+    {
+        int major, minor;
+        if (!xQueryVersion(display, &major, &minor) ||
+            major != 1 || minor < 4)
+        {
+            NS_ERROR("GLX version older than 1.4. (released in 2005)");
+            return false;
+        }
     }
 
-    if (!GLXVersionCheck(1, 1))
-        // Not possible to query for extensions.
-        return false;
-
     const char* clientVendor = xGetClientString(display, LOCAL_GLX_VENDOR);
     const char* serverVendor = xQueryServerString(display, screen, LOCAL_GLX_VENDOR);
     const char* extensionsStr = xQueryExtensionsString(display, screen);
 
-    GLLibraryLoader::SymLoadStruct* sym13;
-    if (!GLXVersionCheck(1, 3)) {
-        // Even if we don't have 1.3, we might have equivalent extensions
-        // (as on the Intel X server).
-        if (!HasExtension(extensionsStr, "GLX_SGIX_fbconfig")) {
-            return false;
-        }
-        sym13 = symbols13_ext;
-    } else {
-        sym13 = symbols13;
-    }
-    if (!GLLibraryLoader::LoadSymbols(mOGLLibrary, sym13)) {
-        NS_WARNING("Couldn't find required entry point in OpenGL shared library");
-        return false;
-    }
-
-    GLLibraryLoader::SymLoadStruct* sym14;
-    if (!GLXVersionCheck(1, 4)) {
-        // Even if we don't have 1.4, we might have equivalent extensions
-        // (as on the Intel X server).
-        if (!HasExtension(extensionsStr, "GLX_ARB_get_proc_address")) {
-            return false;
-        }
-        sym14 = symbols14_ext;
-    } else {
-        sym14 = symbols14;
-    }
-    if (!GLLibraryLoader::LoadSymbols(mOGLLibrary, sym14)) {
-        NS_WARNING("Couldn't find required entry point in OpenGL shared library");
-        return false;
-    }
-
     if (HasExtension(extensionsStr, "GLX_EXT_texture_from_pixmap") &&
         GLLibraryLoader::LoadSymbols(mOGLLibrary, symbols_texturefrompixmap,
                                          (GLLibraryLoader::PlatformLookupFunction)&xGetProcAddress))
     {
         mUseTextureFromPixmap = gfxPrefs::UseGLXTextureFromPixmap();
     } else {
         mUseTextureFromPixmap = false;
         NS_WARNING("Texture from pixmap disabled");
@@ -1257,56 +1189,31 @@ ChooseConfig(GLXLibrary* glx, Display* d
 bool
 GLContextGLX::FindFBConfigForWindow(Display* display, int screen, Window window,
                                     ScopedXFree<GLXFBConfig>* const out_scopedConfigArr,
                                     GLXFBConfig* const out_config, int* const out_visid,
                                     bool aWebRender)
 {
     ScopedXFree<GLXFBConfig>& cfgs = *out_scopedConfigArr;
     int numConfigs;
-    if (sGLXLibrary.IsATI() ||
-        !sGLXLibrary.GLXVersionCheck(1, 3)) {
-        const int attribs[] = {
-            LOCAL_GLX_DOUBLEBUFFER, False,
-            0
-        };
-        const int webrenderAttribs[] = {
-            LOCAL_GLX_DOUBLEBUFFER, False,
-            LOCAL_GLX_DEPTH_SIZE, 24,
-            0
-        };
+    const int webrenderAttribs[] = {
+        LOCAL_GLX_DEPTH_SIZE, 24,
+        LOCAL_GLX_DOUBLEBUFFER, True,
+        0
+    };
 
-        if (aWebRender) {
-          cfgs = sGLXLibrary.xChooseFBConfig(display,
-                                             screen,
-                                             webrenderAttribs,
-                                             &numConfigs);
-        } else {
-          cfgs = sGLXLibrary.xChooseFBConfig(display,
-                                             screen,
-                                             attribs,
-                                             &numConfigs);
-        }
+    if (aWebRender) {
+      cfgs = sGLXLibrary.xChooseFBConfig(display,
+                                         screen,
+                                         webrenderAttribs,
+                                         &numConfigs);
     } else {
-        const int webrenderAttribs[] = {
-            LOCAL_GLX_DEPTH_SIZE, 24,
-            LOCAL_GLX_DOUBLEBUFFER, True,
-            0
-        };
-
-        if (aWebRender) {
-          cfgs = sGLXLibrary.xChooseFBConfig(display,
-                                             screen,
-                                             webrenderAttribs,
-                                             &numConfigs);
-        } else {
-          cfgs = sGLXLibrary.xGetFBConfigs(display,
-                                           screen,
-                                           &numConfigs);
-        }
+      cfgs = sGLXLibrary.xGetFBConfigs(display,
+                                       screen,
+                                       &numConfigs);
     }
 
     if (!cfgs) {
         NS_WARNING("[GLX] glXGetFBConfigs() failed");
         return false;
     }
     NS_ASSERTION(numConfigs > 0, "No FBConfigs found!");
 
@@ -1394,38 +1301,30 @@ CreateOffscreenPixmapContext(CreateConte
 
     Visual* visual;
     int depth;
     FindVisualAndDepth(display, visid, &visual, &depth);
 
     OffMainThreadScopedXErrorHandler xErrorHandler;
     bool error = false;
 
-    Drawable drawable;
-    GLXPixmap pixmap = 0;
-
     gfx::IntSize dummySize(16, 16);
     RefPtr<gfxXlibSurface> surface = gfxXlibSurface::Create(DefaultScreenOfDisplay(display),
                                                             visual,
                                                             dummySize);
     if (surface->CairoStatus() != 0) {
         mozilla::Unused << xErrorHandler.SyncAndGetError(display);
         return nullptr;
     }
 
     // Handle slightly different signature between glXCreatePixmap and
     // its pre-GLX-1.3 extension equivalent (though given the ABI, we
     // might not need to).
-    drawable = surface->XDrawable();
-    if (glx->GLXVersionCheck(1, 3)) {
-        pixmap = glx->xCreatePixmap(display, config, drawable, nullptr);
-    } else {
-        pixmap = glx->xCreateGLXPixmapWithConfig(display, config, drawable);
-    }
-
+    const auto drawable = surface->XDrawable();
+    const auto pixmap = glx->xCreatePixmap(display, config, drawable, nullptr);
     if (pixmap == 0) {
         error = true;
     }
 
     bool serverError = xErrorHandler.SyncAndGetError(display);
     if (error || serverError)
         return nullptr;
 
--- a/gfx/gl/GLXLibrary.h
+++ b/gfx/gl/GLXLibrary.h
@@ -57,18 +57,17 @@ public:
     , xGetVideoSyncInternal(nullptr)
     , xWaitVideoSyncInternal(nullptr)
     , xSwapIntervalInternal(nullptr)
     , mInitialized(false), mTriedInitializing(false)
     , mUseTextureFromPixmap(false), mDebug(false)
     , mHasRobustness(false), mHasCreateContextAttribs(false)
     , mHasVideoSync(false)
     , mIsATI(false), mIsNVIDIA(false)
-    , mClientIsMesa(false), mGLXMajorVersion(0)
-    , mGLXMinorVersion(0)
+    , mClientIsMesa(false)
     , mOGLLibrary(nullptr)
     {}
 
     void xDestroyContext(Display* display, GLXContext context);
     Bool xMakeCurrent(Display* display,
                       GLXDrawable drawable,
                       GLXContext context);
 
@@ -139,17 +138,16 @@ public:
     bool UseTextureFromPixmap() { return mUseTextureFromPixmap; }
     bool HasRobustness() { return mHasRobustness; }
     bool HasCreateContextAttribs() { return mHasCreateContextAttribs; }
     bool SupportsTextureFromPixmap(gfxASurface* aSurface);
     bool SupportsVideoSync();
     bool SupportsSwapControl() const { return bool(xSwapIntervalInternal); }
     bool IsATI() { return mIsATI; }
     bool IsMesa() { return mClientIsMesa; }
-    bool GLXVersionCheck(int aMajor, int aMinor);
 
 private:
 
     typedef void (GLAPIENTRY * PFNGLXDESTROYCONTEXTPROC) (Display*,
                                                           GLXContext);
     PFNGLXDESTROYCONTEXTPROC xDestroyContextInternal;
     typedef Bool (GLAPIENTRY * PFNGLXMAKECURRENTPROC) (Display*,
                                                        GLXDrawable,
@@ -255,18 +253,16 @@ private:
     bool mUseTextureFromPixmap;
     bool mDebug;
     bool mHasRobustness;
     bool mHasCreateContextAttribs;
     bool mHasVideoSync;
     bool mIsATI;
     bool mIsNVIDIA;
     bool mClientIsMesa;
-    int mGLXMajorVersion;
-    int mGLXMinorVersion;
     PRLibrary* mOGLLibrary;
 };
 
 // a global GLXLibrary instance
 extern GLXLibrary sGLXLibrary;
 
 } /* namespace gl */
 } /* namespace mozilla */