Fix T46431: Init glew before glx-context crashes
authorCampbell Barton <ideasman42@gmail.com>
Mon, 12 Oct 2015 04:04:59 +0000 (15:04 +1100)
committerCampbell Barton <ideasman42@gmail.com>
Mon, 12 Oct 2015 04:08:20 +0000 (15:08 +1100)
Initialize glxew before glew,
so we can check whats supported before creating the context.

This also removes need for mxIgnoreNoVersion.

intern/ghost/intern/GHOST_ContextGLX.cpp
intern/glew-mx/glew-mx.h
intern/glew-mx/intern/glew-mx.c

index 4d45d493aa218c02f3b49db5b857f8e2cacd4e69..c431e7e2a019d0a2569ab520373344239b8a0b51 100644 (file)
@@ -40,9 +40,6 @@
 #include <cstdio>
 #include <cstring>
 
-/* this should eventually be enabled, but causes T46431 */
-// #define USE_CONTEXT_FLAGS
-
 #ifdef WITH_GLEW_MX
 GLXEWContext *glxewContext = NULL;
 #endif
@@ -156,19 +153,11 @@ GHOST_TSuccess GHOST_ContextGLX::initializeDrawingContext()
        XIOErrorHandler old_handler_io = XSetIOErrorHandler(GHOST_X11_ApplicationIOErrorHandler);
 #endif
 
-#ifdef USE_CONTEXT_FLAGS
-       /* needed so 'GLXEW_ARB_create_context' is valid */
-       mxIgnoreNoVersion(1);
-       initContextGLXEW();
-       mxIgnoreNoVersion(0);
-#endif
+       /* important to initialize only glxew (_not_ glew),
+        * since this breaks w/ Mesa's `swrast`, see: T46431 */
+       glxewInit();
 
-#ifdef USE_CONTEXT_FLAGS
-       if (GLXEW_ARB_create_context)
-#else
-       if (0)
-#endif
-       {
+       if (GLXEW_ARB_create_context) {
                int profileBitCore   = m_contextProfileMask & GLX_CONTEXT_CORE_PROFILE_BIT_ARB;
                int profileBitCompat = m_contextProfileMask & GLX_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB;
 
@@ -273,11 +262,9 @@ GHOST_TSuccess GHOST_ContextGLX::initializeDrawingContext()
 
                glXMakeCurrent(m_display, m_window, m_context);
 
-#ifndef USE_CONTEXT_FLAGS
                // Seems that this has to be called after MakeCurrent,
                // which means we cannot use glX extensions until after we create a context
                initContextGLXEW();
-#endif
 
                initClearGL();
                ::glXSwapBuffers(m_display, m_window);
index 92450d6781241219cb632c8f1d48beeac62e2f66..ed17ea4a0e690c53fe09853eaacb1ce9c1bd53b8 100644 (file)
@@ -95,8 +95,6 @@ MXContext *mxGetCurrentContext (void);
 void       mxMakeCurrentContext(MXContext *ctx);
 void       mxDestroyContext    (MXContext *ctx);
 
-void       mxIgnoreNoVersion(int ignore);
-
 GLenum glew_chk(GLenum error, const char *file, int line, const char *text);
 
 #ifndef NDEBUG
index 78920670f68aecf635771beacf6594b08314eedf..6fbb1a7a2e28f100c36ab0c75711ab0b37d98e39 100644 (file)
@@ -34,8 +34,6 @@
 #include <stdio.h>
 #include <stdlib.h>
 
-static int ignore_version = 0;
-
 #define CASE_CODE_RETURN_STR(code) case code: return #code;
 
 static const char *get_glew_error_enum_string(GLenum error)
@@ -63,7 +61,7 @@ GLenum glew_chk(GLenum error, const char *file, int line, const char *text)
                const char *code = get_glew_error_enum_string(error);
                const char *msg  = (const char *)glewGetErrorString(error);
 
-               if (error == GLEW_ERROR_NO_GL_VERSION && ignore_version)
+               if (error == GLEW_ERROR_NO_GL_VERSION)
                        return GLEW_OK;
 
 #ifndef NDEBUG
@@ -144,8 +142,3 @@ void mxDestroyContext(MXContext *ctx)
        (void)ctx;
 #endif
 }
-
-void mxIgnoreNoVersion(int ignore)
-{
-       ignore_version = ignore;
-}