From d163922d618c0627a8b47540681024d7c3c5b0b8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C4=B0lkecan=20Bozdo=C4=9Fan?= Date: Thu, 16 Jul 2026 00:50:06 +0300 Subject: [PATCH 1/2] glew: restore EGL+GLX compatibility patch Restore the downstream patch allowing a single GLEW build to support both EGL and GLX. The patch originated in the AUR glew-egl-glx package and was later adopted by Arch Linux. It was subsequently removed from the Arch packaging repository, and later dropped from nixpkgs as we no longer had an upstream copy to fetch. Vendor an updated version of the patch into nixpkgs. Without it, applications built with GLEW_EGL cannot initialize GLX, requiring package-specific workarounds and leaving some applications broken. --- pkgs/by-name/gl/glew/package.nix | 9 ++ pkgs/by-name/gl/glew/patches/egl+glx.patch | 172 +++++++++++++++++++++ 2 files changed, 181 insertions(+) create mode 100644 pkgs/by-name/gl/glew/patches/egl+glx.patch diff --git a/pkgs/by-name/gl/glew/package.nix b/pkgs/by-name/gl/glew/package.nix index db1e2c5f1b55..cff1bbb2067a 100644 --- a/pkgs/by-name/gl/glew/package.nix +++ b/pkgs/by-name/gl/glew/package.nix @@ -21,6 +21,15 @@ stdenv.mkDerivation (finalAttrs: { hash = "sha256-tkeQ+UuSas1+j4TF1gAKhstDlnvR5oiwMIkHl5nJ6Ik="; }; + patches = [ + # Allow a single GLEW build to support both EGL and GLX. + # + # Originally developed for the AUR glew-egl-glx package and later adopted by + # Arch Linux. Carry an updated copy in-tree after it was removed from Arch's + # packaging repository. + ./patches/egl+glx.patch + ]; + outputs = [ "bin" "out" diff --git a/pkgs/by-name/gl/glew/patches/egl+glx.patch b/pkgs/by-name/gl/glew/patches/egl+glx.patch new file mode 100644 index 000000000000..9853f8e53236 --- /dev/null +++ b/pkgs/by-name/gl/glew/patches/egl+glx.patch @@ -0,0 +1,172 @@ +--- a/src/glew.c ++++ b/src/glew.c +@@ -36,6 +36,10 @@ + # include GLEW_INCLUDE + #endif + ++#if defined(GLEW_EGL) ++# include ++#endif ++ + #if defined(GLEW_OSMESA) + # define GLAPI extern + # ifndef APIENTRY +@@ -47,8 +51,6 @@ + # undef APIENTRY + # undef GLEW_APIENTRY_DEFINED + # endif +-#elif defined(GLEW_EGL) +-# include + #elif defined(_WIN32) + /* + * If NOGDI is defined, wingdi.h won't be included by windows.h, and thus +@@ -65,8 +67,7 @@ + + #include /* For size_t */ + +-#if defined(GLEW_EGL) +-#elif defined(GLEW_REGAL) ++#if defined(GLEW_REGAL) + + /* In GLEW_REGAL mode we call directly into the linked + libRegal.so glGetProcAddressREGAL for looking up +@@ -167,23 +168,37 @@ void* NSGLGetProcAddress (const GLubyte *name) + * Define glewGetProcAddress. + */ + #if defined(GLEW_REGAL) +-# define glewGetProcAddress(name) regalGetProcAddress((const GLchar *)name) ++# define _glewGetProcAddress(name) regalGetProcAddress((const GLchar *)name) + #elif defined(GLEW_OSMESA) +-# define glewGetProcAddress(name) OSMesaGetProcAddress((const char *)name) +-#elif defined(GLEW_EGL) +-# define glewGetProcAddress(name) eglGetProcAddress((const char *)name) ++# define _glewGetProcAddress(name) OSMesaGetProcAddress((const char *)name) + #elif defined(_WIN32) +-# define glewGetProcAddress(name) wglGetProcAddress((LPCSTR)name) ++# define _glewGetProcAddress(name) wglGetProcAddress((LPCSTR)name) + #elif defined(__APPLE__) && !defined(GLEW_APPLE_GLX) +-# define glewGetProcAddress(name) NSGLGetProcAddress(name) ++# define _glewGetProcAddress(name) NSGLGetProcAddress(name) + #elif defined(__sgi) || defined(__sun) || defined(__HAIKU__) +-# define glewGetProcAddress(name) dlGetProcAddress(name) ++# define _glewGetProcAddress(name) dlGetProcAddress(name) + #elif defined(__ANDROID__) +-# define glewGetProcAddress(name) NULL /* TODO */ ++# define _glewGetProcAddress(name) NULL /* TODO */ + #elif defined(__native_client__) +-# define glewGetProcAddress(name) NULL /* TODO */ ++# define _glewGetProcAddress(name) NULL /* TODO */ + #else /* __linux */ +-# define glewGetProcAddress(name) (*glXGetProcAddressARB)(name) ++# define _glewGetProcAddress(name) (*glXGetProcAddressARB)(name) ++#endif ++ ++#if defined(GLEW_EGL) ++static GLboolean _EGL_available = GL_FALSE; ++static void (*glewGetProcAddress (const GLubyte *name)) (void) ++{ ++ void (*addr)(void); ++ if (_EGL_available) ++ { ++ addr = eglGetProcAddress((const char *)name); ++ if (addr) return addr; ++ } ++ return _glewGetProcAddress(name); ++} ++#else ++# define glewGetProcAddress(name) _glewGetProcAddress(name) + #endif + + /* +@@ -19783,9 +19798,7 @@ GLenum GLEWAPIENTRY glewContextInit (void) + } + + +-#if defined(GLEW_OSMESA) +- +-#elif defined(GLEW_EGL) ++#if defined(GLEW_EGL) + + PFNEGLCHOOSECONFIGPROC __eglewChooseConfig = NULL; + PFNEGLCOPYBUFFERSPROC __eglewCopyBuffers = NULL; +@@ -21074,8 +21087,8 @@ GLenum eglewInit (EGLDisplay display) + PFNEGLQUERYSTRINGPROC queryString = NULL; + + /* Load necessary entry points */ +- initialize = (PFNEGLINITIALIZEPROC) glewGetProcAddress("eglInitialize"); +- queryString = (PFNEGLQUERYSTRINGPROC) glewGetProcAddress("eglQueryString"); ++ initialize = (PFNEGLINITIALIZEPROC) eglGetProcAddress("eglInitialize"); ++ queryString = (PFNEGLQUERYSTRINGPROC) eglGetProcAddress("eglQueryString"); + if (!initialize || !queryString) + return 1; + +@@ -21669,7 +21682,9 @@ GLenum eglewInit (EGLDisplay display) + return GLEW_OK; + } + +-#elif defined(_WIN32) ++#endif ++ ++#if defined(_WIN32) + + PFNWGLSETSTEREOEMITTERSTATE3DLPROC __wglewSetStereoEmitterState3DL = NULL; + +@@ -23750,13 +23765,26 @@ GLenum GLEWAPIENTRY glewInit (void) + GLenum r; + #if defined(GLEW_EGL) + PFNEGLGETCURRENTDISPLAYPROC getCurrentDisplay = NULL; ++ EGLDisplay display; + #endif + r = glewContextInit(); + if ( r != 0 ) return r; + #if defined(GLEW_EGL) +- getCurrentDisplay = (PFNEGLGETCURRENTDISPLAYPROC) glewGetProcAddress("eglGetCurrentDisplay"); +- return eglewInit(getCurrentDisplay()); +-#elif defined(GLEW_OSMESA) || defined(__ANDROID__) || defined(__native_client__) || defined(__HAIKU__) ++ getCurrentDisplay = (PFNEGLGETCURRENTDISPLAYPROC) eglGetProcAddress("eglGetCurrentDisplay"); ++ if (getCurrentDisplay) ++ display = getCurrentDisplay(); ++ else ++ display = EGL_NO_DISPLAY; ++ if (display != EGL_NO_DISPLAY) ++ { ++ r = eglewInit(display); ++ if ( r == 0 ) { ++ _EGL_available = GL_TRUE; ++ return r; ++ } ++ } ++#endif ++#if defined(GLEW_OSMESA) || defined(__ANDROID__) || defined(__native_client__) || defined(__HAIKU__) + return r; + #elif defined(_WIN32) + return wglewInit(); +@@ -30675,7 +30703,7 @@ GLboolean GLEWAPIENTRY glewIsSupported (const char* name) + return ret; + } + +-#if defined(_WIN32) && !defined(GLEW_EGL) && !defined(GLEW_OSMESA) ++#if defined(_WIN32) && !defined(GLEW_OSMESA) + + GLboolean GLEWAPIENTRY wglewIsSupported (const char* name) + { +@@ -31118,7 +31146,7 @@ GLboolean GLEWAPIENTRY wglewIsSupported (const char* name) + return ret; + } + +-#elif !defined(GLEW_OSMESA) && !defined(GLEW_EGL) && !defined(__ANDROID__) && !defined(__native_client__) && !defined(__HAIKU__) && !defined(__APPLE__) || defined(GLEW_APPLE_GLX) ++#elif !defined(GLEW_OSMESA) && !defined(__ANDROID__) && !defined(__native_client__) && !defined(__HAIKU__) && !defined(__APPLE__) || defined(GLEW_APPLE_GLX) + + GLboolean glxewIsSupported (const char* name) + { +@@ -31702,7 +31730,9 @@ GLboolean glxewIsSupported (const char* name) + return ret; + } + +-#elif defined(GLEW_EGL) ++#endif ++ ++#if defined(GLEW_EGL) + + GLboolean eglewIsSupported (const char* name) + { From 11dbafea9e033d7a4ad2a06c8d2175184b08a60a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C4=B0lkecan=20Bozdo=C4=9Fan?= Date: Thu, 16 Jul 2026 01:00:43 +0300 Subject: [PATCH 2/2] various: remove GLEW compatibility workarounds The restored EGL+GLX compatibility patch allows the default GLEW build to support both EGL and GLX again. Remove package specific overrides that forced `enableEGL = false`. --- pkgs/by-name/me/meshlab/package.nix | 7 +------ pkgs/by-name/op/openscad/package.nix | 4 +--- pkgs/by-name/rp/rpcs3/package.nix | 4 +--- 3 files changed, 3 insertions(+), 12 deletions(-) diff --git a/pkgs/by-name/me/meshlab/package.nix b/pkgs/by-name/me/meshlab/package.nix index ed277bf0733b..104fbc3a03d2 100644 --- a/pkgs/by-name/me/meshlab/package.nix +++ b/pkgs/by-name/me/meshlab/package.nix @@ -76,12 +76,7 @@ stdenv.mkDerivation (finalAttrs: { bzip2 muparser eigen - # MeshLab renders through Qt's xcb platform, which creates a GLX context, - # and calls glewInit() against it. The default EGL-enabled glew is built - # EGL-only (no GLX dispatch table), so glewInit can't read GL_VERSION and - # the app fails to launch with "GLEW initialization failed: Missing GL - # version". See https://github.com/NixOS/nixpkgs/issues/531470 - (glew.override { enableEGL = false; }) + glew gmp levmar qhull diff --git a/pkgs/by-name/op/openscad/package.nix b/pkgs/by-name/op/openscad/package.nix index 7cf1da9371b2..ede0cdbd0c8c 100644 --- a/pkgs/by-name/op/openscad/package.nix +++ b/pkgs/by-name/op/openscad/package.nix @@ -127,9 +127,7 @@ stdenv.mkDerivation (finalAttrs: { buildInputs = [ eigen boost - # OpenSCAD's GLX offscreen renderer needs GLEW's GLXEW symbols (`__GLXEW_SGIX_pbuffer`, `__GLXEW_SGIX_fbconfig`) - # which are not found in the default EGL-enabled glew and causes the build failure in https://github.com/NixOS/nixpkgs/issues/530529 - (glew.override { enableEGL = false; }) + glew opencsg cgal_5 mpfr diff --git a/pkgs/by-name/rp/rpcs3/package.nix b/pkgs/by-name/rp/rpcs3/package.nix index bc9d8f9bbde1..b4518e0a27b6 100644 --- a/pkgs/by-name/rp/rpcs3/package.nix +++ b/pkgs/by-name/rp/rpcs3/package.nix @@ -117,9 +117,7 @@ stdenv.mkDerivation (finalAttrs: { qtbase qtmultimedia openal - # RPCS3's X11 swap-interval path uses GLEW's GLXEW symbols, which - # are not provided in the default EGL-enabled GLEW build. - (glew.override { enableEGL = false; }) + glew vulkan-headers vulkan-loader libpng