From bf59fe458f647d19cef3bb41b5ab55b64dc86f00 Mon Sep 17 00:00:00 2001 From: Matthias Blaicher Date: Sun, 15 Feb 2026 08:26:16 +0000 Subject: [PATCH] Fix EGL/GLX mismatch causing blank 3D preview on Linux (#12308) - Add configurable GLEW_USE_EGL option (default OFF) to match wxWidgets - Explicitly set wxUSE_GLCANVAS_EGL=OFF for vendored wxWidgets build - Add compile-time check to detect EGL/GLX backend mismatch between GLEW and wxWidgets, preventing silent rendering failures The bug occurred when GLEW was compiled with EGL support (using eglGetProcAddress) but wxWidgets created GLX contexts. This mismatch caused OpenGL function pointers to fail loading, resulting in blank 3D model preview. Co-authored-by: SoftFever --- deps/GLEW/GLEW.cmake | 2 ++ deps/GLEW/glew/CMakeLists.txt | 12 ++++++++++-- deps/wxWidgets/wxWidgets.cmake | 1 + src/slic3r/GUI/OpenGLManager.cpp | 12 ++++++++++++ 4 files changed, 25 insertions(+), 2 deletions(-) diff --git a/deps/GLEW/GLEW.cmake b/deps/GLEW/GLEW.cmake index cef56e72e2..82bfc0bb84 100644 --- a/deps/GLEW/GLEW.cmake +++ b/deps/GLEW/GLEW.cmake @@ -5,6 +5,8 @@ find_package(OpenGL QUIET REQUIRED) orcaslicer_add_cmake_project( GLEW SOURCE_DIR ${CMAKE_CURRENT_LIST_DIR}/glew + CMAKE_ARGS + -DGLEW_USE_EGL=OFF ) if (MSVC) diff --git a/deps/GLEW/glew/CMakeLists.txt b/deps/GLEW/glew/CMakeLists.txt index 4aa10c9188..7f1687c4e2 100644 --- a/deps/GLEW/glew/CMakeLists.txt +++ b/deps/GLEW/glew/CMakeLists.txt @@ -3,9 +3,17 @@ project(GLEW) find_package(OpenGL REQUIRED) -if(OpenGL_EGL_FOUND) - message(STATUS "building GLEW for EGL (hope that wxWidgets agrees, otherwise you won't have any output!)") +# Allow parent project to control EGL usage. +# Default to OFF since OrcaSlicer forces GDK_BACKEND=x11 (using GLX contexts). +# GLEW must use glXGetProcAddressARB (GLX) to match wxWidgets GL canvas. +# Using EGL function loading with GLX contexts causes rendering failures. +option(GLEW_USE_EGL "Use EGL instead of GLX for OpenGL function loading" OFF) + +if(GLEW_USE_EGL) + message(STATUS "Building GLEW with EGL support") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DGLEW_EGL") +else() + message(STATUS "Building GLEW with GLX support") endif() add_library(GLEW src/glew.c) diff --git a/deps/wxWidgets/wxWidgets.cmake b/deps/wxWidgets/wxWidgets.cmake index 3a52d14198..cb25f0eb45 100644 --- a/deps/wxWidgets/wxWidgets.cmake +++ b/deps/wxWidgets/wxWidgets.cmake @@ -51,6 +51,7 @@ orcaslicer_add_cmake_project( -DwxUSE_UNICODE=ON -DwxUSE_PRIVATE_FONTS=ON -DwxUSE_OPENGL=ON + -DwxUSE_GLCANVAS_EGL=OFF -DwxUSE_WEBREQUEST=ON -DwxUSE_WEBVIEW=ON ${_wx_edge} diff --git a/src/slic3r/GUI/OpenGLManager.cpp b/src/slic3r/GUI/OpenGLManager.cpp index 39860ab9a8..17c372a59f 100644 --- a/src/slic3r/GUI/OpenGLManager.cpp +++ b/src/slic3r/GUI/OpenGLManager.cpp @@ -25,6 +25,18 @@ #include "../Utils/MacDarkMode.hpp" #endif // __APPLE__ +// Verify GLEW and wxWidgets use the same OpenGL backend (EGL vs GLX). +// A mismatch causes rendering failures: GLEW's function loading must match +// the context type created by wxWidgets. +#if defined(__linux__) + #if defined(GLEW_EGL) && (!defined(wxUSE_GLCANVAS_EGL) || !wxUSE_GLCANVAS_EGL) + #error "OpenGL backend mismatch: GLEW has EGL support enabled but wxWidgets does not. Ensure GLEW_USE_EGL and wxUSE_GLCANVAS_EGL are both ON or both OFF." + #endif + #if !defined(GLEW_EGL) && defined(wxUSE_GLCANVAS_EGL) && wxUSE_GLCANVAS_EGL + #error "OpenGL backend mismatch: wxWidgets has EGL support enabled but GLEW does not. Ensure GLEW_USE_EGL and wxUSE_GLCANVAS_EGL are both ON or both OFF." + #endif +#endif + namespace Slic3r { namespace GUI {