Replace BlueGL with epoxy
authorTimo Röhling <roehling@debian.org>
Wed, 26 Jan 2022 16:40:16 +0000 (17:40 +0100)
committerTimo Röhling <roehling@debian.org>
Sat, 12 Nov 2022 12:20:14 +0000 (12:20 +0000)
Gbp-Pq: Name 0011-Replace-BlueGL-with-epoxy.patch

CMakeLists.txt
filament/backend/CMakeLists.txt
filament/backend/src/opengl/OpenGLContext.cpp
filament/backend/src/opengl/OpenGLDriver.cpp
filament/backend/src/opengl/PlatformGLX.cpp
filament/backend/src/opengl/PlatformGLX.h
filament/backend/src/opengl/gl_headers.h

index a95c557b2eeac949dcd0da270ecf9b6bf74a5f7a..5c117c3e9cca33cb9e44864984dd4f2d5f4c902e 100644 (file)
@@ -650,7 +650,6 @@ if (WEBGL)
 endif()
 
 if (IS_HOST_PLATFORM)
-    add_subdirectory(${LIBRARIES}/bluegl)
     add_subdirectory(${LIBRARIES}/filamentapp)
     add_subdirectory(${LIBRARIES}/imageio)
 
index f61faee41cd058d9dc10c6aad113270310b16d03..360471fd50de7fe8afc6e9a8002a5f4fe7a91c08 100644 (file)
@@ -285,11 +285,6 @@ endif()
 target_link_libraries(${TARGET} PUBLIC filament::math)
 target_link_libraries(${TARGET} PUBLIC filament::utils)
 
-# Android, iOS, and WebGL do not use bluegl.
-if(NOT IOS AND NOT ANDROID AND NOT WEBGL)
-    target_link_libraries(${TARGET} PRIVATE bluegl)
-endif()
-
 if (FILAMENT_SUPPORTS_VULKAN)
     target_link_libraries(${TARGET} PRIVATE bluevk vkmemalloc vkshaders smol-v)
 endif()
@@ -299,8 +294,11 @@ if (FILAMENT_SUPPORTS_METAL)
 endif()
 
 if (LINUX)
+    find_package(X11 REQUIRED)
     target_link_libraries(${TARGET} PUBLIC Threads::Threads)
     target_link_libraries(${TARGET} PRIVATE dl)
+    target_link_libraries(${TARGET} PRIVATE ${X11_X11_LIB})
+    target_link_libraries(${TARGET} PRIVATE epoxy)
 endif()
 
 # ==================================================================================================
index 62aa98f80172bab12cf5926bbbb1df5e999cae0e..01a4e247e91ea29b72130f9537c2ca3dd4a5ec65 100644 (file)
@@ -57,7 +57,7 @@ OpenGLContext::OpenGLContext() noexcept {
         }
     }
     ShaderModel shaderModel = ShaderModel::UNKNOWN;
-    if (GLES30_HEADERS) {
+    if (!epoxy_is_desktop_gl()) {
         if (major == 3 && minor >= 0) {
             shaderModel = ShaderModel::GL_ES_30;
         }
@@ -65,7 +65,7 @@ OpenGLContext::OpenGLContext() noexcept {
             features.multisample_texture = true;
         }
         initExtensionsGLES(major, minor, exts);
-    } else if (GL41_HEADERS) {
+    } else {
         if (major == 4 && minor >= 1) {
             shaderModel = ShaderModel::GL_CORE_41;
         }
index 9b7135f5bad704295f1515227da83f906777f38b..5ccf07470af74727c0ec351f47043f83daebe9fa 100644 (file)
@@ -974,7 +974,7 @@ void OpenGLDriver::framebufferTexture(backend::TargetBufferInfo const& binfo,
         // This extension only exists on OpenGL ES.
         gl.bindFramebuffer(GL_FRAMEBUFFER, rt->gl.fbo);
         if (any(t->usage & TextureUsage::SAMPLEABLE)) {
-            glext::glFramebufferTexture2DMultisampleEXT(GL_FRAMEBUFFER,
+            glFramebufferTexture2DMultisampleEXT(GL_FRAMEBUFFER,
                     attachment, target, t->gl.id, binfo.level, rt->gl.samples);
         } else {
             glFramebufferRenderbuffer(GL_FRAMEBUFFER, attachment,
@@ -1073,7 +1073,7 @@ void OpenGLDriver::renderBufferStorage(GLuint rbo, GLenum internalformat, uint32
         auto& gl = mContext;
         if (gl.ext.EXT_multisampled_render_to_texture ||
             gl.ext.EXT_multisampled_render_to_texture2) {
-            glext::glRenderbufferStorageMultisampleEXT(GL_RENDERBUFFER, samples, internalformat, width, height);
+            glRenderbufferStorageMultisampleEXT(GL_RENDERBUFFER, samples, internalformat, width, height);
         } else
 #endif
         {
index b5cb484efa1ca997430670d6004cb86a71a975c9..32c16d81624e1511429b24b50213d1880437e997 100644 (file)
 #include <utils/Panic.h>
 
 #include <X11/Xlib.h>
-#include <GL/glx.h>
-#include <GL/glxext.h>
+#include <epoxy/gl.h>
+#include <epoxy/glx.h>
 
 #include "OpenGLDriverFactory.h"
 
-#include <dlfcn.h>
-
-#define LIBRARY_GLX "libGL.so.1"
-#define LIBRARY_X11 "libX11.so.6"
-
-// Function pointer types for X11 functions
-typedef Display* (* X11_OPEN_DISPLAY)(const char*);
-typedef Display* (* X11_CLOSE_DISPLAY)(Display*);
-
-// Function pointer types for GLX functions
-typedef void (* GLX_DESTROY_CONTEXT)(Display*, GLXContext);
-typedef void (* GLX_SWAP_BUFFERS)(Display* dpy, GLXDrawable drawable);
-// Stores GLX function pointers and a handle to the system's GLX library
-struct GLXFunctions {
-    PFNGLXCHOOSEFBCONFIGPROC chooseFbConfig;
-    PFNGLXCREATECONTEXTATTRIBSARBPROC createContext;
-    PFNGLXCREATEPBUFFERPROC createPbuffer;
-    PFNGLXDESTROYPBUFFERPROC destroyPbuffer;
-    PFNGLXMAKECONTEXTCURRENTPROC setCurrentContext;
-
-    /* 
-       When creating a shared GL context, we query the used
-       GLX_FBCONFIG_ID to make sure our display framebuffer
-       attributes match; otherwise making our context current
-       results in a BadMatch
-       https://gist.github.com/roxlu/c282d642c353ce96ef19b6359c741bcb
-    */
-    PFNGLXQUERYCONTEXTPROC queryContext;
-
-    /* 
-       When creating a shared GL context, we select the matching
-       GLXFBConfig that is used by the shared GL context. `getFBConfigs`
-       will return all the available GLXFBConfigs.
-    */
-    PFNGLXGETFBCONFIGSPROC getFbConfigs;
-
-    /*
-      When creating a shared GL contect, we iterate over the
-      available GLXFBConfigs that are returned by `getFBConfigs`,
-      we use `getFbConfigAttrib` to find the matching
-      `GLX_FBCONFIG_ID`.
-    */
-    PFNGLXGETFBCONFIGATTRIBPROC getFbConfigAttrib;
-
-    GLX_DESTROY_CONTEXT destroyContext;
-    GLX_SWAP_BUFFERS swapBuffers;
-    void* library;
-} g_glx;
-
-// Stores X11 function pointers and a handle to the system's X11 library
-struct X11Functions {
-    X11_OPEN_DISPLAY openDisplay;
-    X11_CLOSE_DISPLAY closeDisplay;
-    void* library;
-} g_x11;
-
-static PFNGLXGETPROCADDRESSPROC getProcAddress;
-
-static bool loadLibraries() {
-    g_glx.library = dlopen(LIBRARY_GLX, RTLD_LOCAL | RTLD_NOW);
-    if (!g_glx.library) {
-        utils::slog.e << "Could not find library " << LIBRARY_GLX << utils::io::endl;
-        return false;
-    }
-
-    getProcAddress =
-            (PFNGLXGETPROCADDRESSPROC)dlsym(g_glx.library, "glXGetProcAddressARB");
-
-    g_glx.chooseFbConfig = (PFNGLXCHOOSEFBCONFIGPROC)
-            getProcAddress((const GLubyte*)"glXChooseFBConfig");
-    g_glx.createContext = (PFNGLXCREATECONTEXTATTRIBSARBPROC)
-            getProcAddress((const GLubyte*)"glXCreateContextAttribsARB");
-    g_glx.createPbuffer = (PFNGLXCREATEPBUFFERPROC)
-            getProcAddress((const GLubyte*)"glXCreatePbuffer");
-    g_glx.destroyPbuffer = (PFNGLXDESTROYPBUFFERPROC)
-            getProcAddress((const GLubyte*)"glXDestroyPbuffer");
-    g_glx.setCurrentContext = (PFNGLXMAKECONTEXTCURRENTPROC)
-            getProcAddress((const GLubyte*)"glXMakeContextCurrent");
-    g_glx.destroyContext = (GLX_DESTROY_CONTEXT)
-            getProcAddress((const GLubyte*)"glXDestroyContext");
-    g_glx.swapBuffers = (GLX_SWAP_BUFFERS)
-            getProcAddress((const GLubyte*)"glXSwapBuffers");
-
-    g_glx.queryContext = (PFNGLXQUERYCONTEXTPROC)
-            getProcAddress((const GLubyte*)"glXQueryContext");
-    g_glx.getFbConfigs = (PFNGLXGETFBCONFIGSPROC)
-            getProcAddress((const GLubyte*)"glXGetFBConfigs");
-    g_glx.getFbConfigAttrib = (PFNGLXGETFBCONFIGATTRIBPROC)
-            getProcAddress((const GLubyte*)"glXGetFBConfigAttrib");
-
-    g_x11.library = dlopen(LIBRARY_X11, RTLD_LOCAL | RTLD_NOW);
-    if (!g_x11.library) {
-        utils::slog.e << "Could not find library " << LIBRARY_X11 << utils::io::endl;
-        return false;
-    }
-
-    g_x11.openDisplay = (X11_OPEN_DISPLAY)dlsym(g_x11.library, "XOpenDisplay");
-    g_x11.closeDisplay = (X11_CLOSE_DISPLAY)dlsym(g_x11.library, "XCloseDisplay");
-    return true;
-}
-
 namespace filament {
 
 using namespace backend;
 
 Driver* PlatformGLX::createDriver(void* const sharedGLContext) noexcept {
-    loadLibraries();
     // Get the display device
-    mGLXDisplay = g_x11.openDisplay(NULL);
+    mGLXDisplay = XOpenDisplay(NULL);
     if (mGLXDisplay == nullptr) {
         utils::slog.e << "Failed to open X display. (exiting)." << utils::io::endl;
         exit(1);
@@ -144,7 +42,7 @@ Driver* PlatformGLX::createDriver(void* const sharedGLContext) noexcept {
         int usedFbId = -1;
         GLXContext sharedCtx = (GLXContext)((void*)sharedGLContext);
 
-        r = g_glx.queryContext(mGLXDisplay, sharedCtx, GLX_FBCONFIG_ID, &usedFbId);
+        r = glXQueryContext(mGLXDisplay, sharedCtx, GLX_FBCONFIG_ID, &usedFbId);
         if (r != 0) {
             utils::slog.e << "Failed to get GLX_FBCONFIG_ID from shared GL context."
                           << utils::io::endl;
@@ -152,7 +50,7 @@ Driver* PlatformGLX::createDriver(void* const sharedGLContext) noexcept {
         }
 
         int numConfigs = 0;
-        GLXFBConfig* fbConfigs = g_glx.getFbConfigs(mGLXDisplay, 0, &numConfigs);
+        GLXFBConfig* fbConfigs = glXGetFBConfigs(mGLXDisplay, 0, &numConfigs);
 
         if (fbConfigs == nullptr) {
             utils::slog.e << "Failed to get the available GLXFBConfigs." << utils::io::endl;
@@ -163,7 +61,7 @@ Driver* PlatformGLX::createDriver(void* const sharedGLContext) noexcept {
         int fbIndex = -1;
 
         for (int i = 0; i < numConfigs; ++i) {
-            r = g_glx.getFbConfigAttrib(mGLXDisplay, fbConfigs[i], GLX_FBCONFIG_ID, &fbId);
+            r = glXGetFBConfigAttrib(mGLXDisplay, fbConfigs[i], GLX_FBCONFIG_ID, &fbId);
             if (r != 0) {
                 utils::slog.e << "Failed to get GLX_FBCONFIG_ID for entry " << i << "."
                               << utils::io::endl;
@@ -190,31 +88,21 @@ Driver* PlatformGLX::createDriver(void* const sharedGLContext) noexcept {
                 GLX_DEPTH_SIZE, 24,
                 None
         };
-
         int configCount = 0;
-        mGLXConfig = g_glx.chooseFbConfig(mGLXDisplay, DefaultScreen(mGLXDisplay),
+        mGLXConfig = glXChooseFBConfig(mGLXDisplay, DefaultScreen(mGLXDisplay),
                 attribs, &configCount);
         if (mGLXConfig == nullptr || configCount == 0) {
             return nullptr;
         }
     }
 
-    PFNGLXCREATECONTEXTATTRIBSARBPROC glXCreateContextAttribs = (PFNGLXCREATECONTEXTATTRIBSARBPROC)
-            getProcAddress((GLubyte*)"glXCreateContextAttribsARB");
-
-    if (glXCreateContextAttribs == nullptr) {
-        utils::slog.i << "Unable to retrieve function pointer for `glXCreateContextAttribs()`."
-                      << utils::io::endl;
-        return nullptr;
-    }
-
     int contextAttribs[] = {
             GLX_CONTEXT_MAJOR_VERSION_ARB, 4,
             GLX_CONTEXT_MINOR_VERSION_ARB, 1,
             GL_NONE
     };
 
-    mGLXContext = g_glx.createContext(mGLXDisplay, mGLXConfig[0],
+    mGLXContext = glXCreateContextAttribsARB(mGLXDisplay, mGLXConfig[0],
             (GLXContext)sharedGLContext, True, contextAttribs);
 
     int pbufferAttribs[] = {
@@ -223,21 +111,18 @@ Driver* PlatformGLX::createDriver(void* const sharedGLContext) noexcept {
             GL_NONE
     };
 
-    mDummySurface = g_glx.createPbuffer(mGLXDisplay, mGLXConfig[0], pbufferAttribs);
-    g_glx.setCurrentContext(mGLXDisplay, mDummySurface, mDummySurface, mGLXContext);
+    mDummySurface = glXCreatePbuffer(mGLXDisplay, mGLXConfig[0], pbufferAttribs);
+    glXMakeContextCurrent(mGLXDisplay, mDummySurface, mDummySurface, mGLXContext);
 
-    int result = bluegl::bind();
-    ASSERT_POSTCONDITION(!result, "Unable to load OpenGL entry points.");
 
     return OpenGLDriverFactory::create(this, sharedGLContext);
 }
 
 void PlatformGLX::terminate() noexcept {
-    g_glx.setCurrentContext(mGLXDisplay, None, None, nullptr);
-    g_glx.destroyPbuffer(mGLXDisplay, mDummySurface);
-    g_glx.destroyContext(mGLXDisplay, mGLXContext);
-    g_x11.closeDisplay(mGLXDisplay);
-    bluegl::unbind();
+    glXMakeContextCurrent(mGLXDisplay, None, None, nullptr);
+    glXDestroyPbuffer(mGLXDisplay, mDummySurface);
+    glXDestroyContext(mGLXDisplay, mGLXContext);
+    XCloseDisplay(mGLXDisplay);
 }
 
 Platform::SwapChain* PlatformGLX::createSwapChain(void* nativeWindow, uint64_t& flags) noexcept {
@@ -255,7 +140,7 @@ Platform::SwapChain* PlatformGLX::createSwapChain(
             GLX_PBUFFER_HEIGHT, int(height),
             GL_NONE
     };
-    GLXPbuffer sur = g_glx.createPbuffer(mGLXDisplay, mGLXConfig[0], pbufferAttribs);
+    GLXPbuffer sur = glXCreatePbuffer(mGLXDisplay, mGLXConfig[0], pbufferAttribs);
     if (sur) {
         mPBuffers.push_back(sur);
     }
@@ -265,19 +150,19 @@ Platform::SwapChain* PlatformGLX::createSwapChain(
 void PlatformGLX::destroySwapChain(Platform::SwapChain* swapChain) noexcept {
     auto it = std::find(mPBuffers.begin(), mPBuffers.end(), (GLXPbuffer)swapChain);
     if (it != mPBuffers.end()) {
-        g_glx.destroyPbuffer(mGLXDisplay, (GLXPbuffer)swapChain);
+        glXDestroyPbuffer(mGLXDisplay, (GLXPbuffer)swapChain);
         mPBuffers.erase(it);
     }
 }
 
 void PlatformGLX::makeCurrent(
         Platform::SwapChain* drawSwapChain, Platform::SwapChain* readSwapChain) noexcept {
-    g_glx.setCurrentContext(mGLXDisplay,
+    glXMakeContextCurrent(mGLXDisplay,
             (GLXDrawable)drawSwapChain, (GLXDrawable)readSwapChain, mGLXContext);
 }
 
 void PlatformGLX::commit(Platform::SwapChain* swapChain) noexcept {
-    g_glx.swapBuffers(mGLXDisplay, (GLXDrawable)swapChain);
+    glXSwapBuffers(mGLXDisplay, (GLXDrawable)swapChain);
 }
 
 // TODO Implement GLX fences
index 45c3abf1fae24793273991889a984ab797222660..8cebb0e1d11147fb5036bb28d692d48b362339d2 100644 (file)
@@ -19,8 +19,8 @@
 
 #include <stdint.h>
 
-#include <bluegl/BlueGL.h>
-#include <GL/glx.h>
+#include <epoxy/gl.h>
+#include <epoxy/glx.h>
 
 #include <backend/DriverEnums.h>
 
index 32ca1222be51073e5933993a762a93fd62e1702e..a734a09729a1cf2f22dd26e7a5c6b4f24a319f79 100644 (file)
 #endif
 
 #else
-    #include <bluegl/BlueGL.h>
+    #include <epoxy/gl.h>
 #endif
 
 // This is just to simplify the implementation (i.e. so we don't have to have #ifdefs everywhere)