Fix OpenGL initialization when OpenGL and OpenGLES are both available.
authorSam Lantinga <slouken@libsdl.org>
Wed, 18 Jul 2012 15:02:48 -0700
changeset 6369 a92fbd27127b
parent 6368 fcbbd0e2da5e
child 6370 93187f7f7d5d
Fix OpenGL initialization when OpenGL and OpenGLES are both available. Both options default to "yes" via configure, and having libs/headers for both installed is not unusual. We default to OpenGL on this compile time combination, but can enforce OpenGLES via setting the envvar SDL_VIDEO_X11_GLES. This will be further refined based on community feedback. Contributed by Andre Heider
src/video/x11/SDL_x11video.c
src/video/x11/SDL_x11video.h
src/video/x11/SDL_x11window.c
--- a/src/video/x11/SDL_x11video.c	Wed Jul 18 15:01:41 2012 -0700
+++ b/src/video/x11/SDL_x11video.c	Wed Jul 18 15:02:48 2012 -0700
@@ -144,13 +144,26 @@
     }
     device->driverdata = data;
 
+    /* In case GL and GLES/GLES2 is compiled in, we default to GL, but use
+     * GLES if SDL_VIDEO_X11_GLES is set.
+     */
 #if SDL_VIDEO_OPENGL_ES || SDL_VIDEO_OPENGL_ES2
-    device->gles_data = (struct SDL_PrivateGLESData *) SDL_calloc(1, sizeof(SDL_PrivateGLESData));
-    if (!device->gles_data) {
-        SDL_OutOfMemory();
-        SDL_free(device->driverdata);
-        SDL_free(device);
-        return NULL;
+#if SDL_VIDEO_OPENGL_GLX
+    data->gles = SDL_getenv("SDL_VIDEO_X11_GLES") != NULL;
+#else
+    data->gles = SDL_TRUE;
+#endif
+#endif
+
+#if SDL_VIDEO_OPENGL_ES || SDL_VIDEO_OPENGL_ES2
+    if (data->gles) {
+        device->gles_data = (struct SDL_PrivateGLESData *) SDL_calloc(1, sizeof(SDL_PrivateGLESData));
+        if (!device->gles_data) {
+            SDL_OutOfMemory();
+            SDL_free(device->driverdata);
+            SDL_free(device);
+            return NULL;
+        }
     }
 #endif
 
@@ -224,26 +237,30 @@
     device->shape_driver.ResizeWindowShape = X11_ResizeWindowShape;
 
 #if SDL_VIDEO_OPENGL_GLX
-    device->GL_LoadLibrary = X11_GL_LoadLibrary;
-    device->GL_GetProcAddress = X11_GL_GetProcAddress;
-    device->GL_UnloadLibrary = X11_GL_UnloadLibrary;
-    device->GL_CreateContext = X11_GL_CreateContext;
-    device->GL_MakeCurrent = X11_GL_MakeCurrent;
-    device->GL_SetSwapInterval = X11_GL_SetSwapInterval;
-    device->GL_GetSwapInterval = X11_GL_GetSwapInterval;
-    device->GL_SwapWindow = X11_GL_SwapWindow;
-    device->GL_DeleteContext = X11_GL_DeleteContext;
+    if (!data->gles) {
+        device->GL_LoadLibrary = X11_GL_LoadLibrary;
+        device->GL_GetProcAddress = X11_GL_GetProcAddress;
+        device->GL_UnloadLibrary = X11_GL_UnloadLibrary;
+        device->GL_CreateContext = X11_GL_CreateContext;
+        device->GL_MakeCurrent = X11_GL_MakeCurrent;
+        device->GL_SetSwapInterval = X11_GL_SetSwapInterval;
+        device->GL_GetSwapInterval = X11_GL_GetSwapInterval;
+        device->GL_SwapWindow = X11_GL_SwapWindow;
+        device->GL_DeleteContext = X11_GL_DeleteContext;
+    }
 #endif
 #if SDL_VIDEO_OPENGL_ES || SDL_VIDEO_OPENGL_ES2
-    device->GL_LoadLibrary = X11_GLES_LoadLibrary;
-    device->GL_GetProcAddress = X11_GLES_GetProcAddress;
-    device->GL_UnloadLibrary = X11_GLES_UnloadLibrary;
-    device->GL_CreateContext = X11_GLES_CreateContext;
-    device->GL_MakeCurrent = X11_GLES_MakeCurrent;
-    device->GL_SetSwapInterval = X11_GLES_SetSwapInterval;
-    device->GL_GetSwapInterval = X11_GLES_GetSwapInterval;
-    device->GL_SwapWindow = X11_GLES_SwapWindow;
-    device->GL_DeleteContext = X11_GLES_DeleteContext;
+    if (data->gles) {
+        device->GL_LoadLibrary = X11_GLES_LoadLibrary;
+        device->GL_GetProcAddress = X11_GLES_GetProcAddress;
+        device->GL_UnloadLibrary = X11_GLES_UnloadLibrary;
+        device->GL_CreateContext = X11_GLES_CreateContext;
+        device->GL_MakeCurrent = X11_GLES_MakeCurrent;
+        device->GL_SetSwapInterval = X11_GLES_SetSwapInterval;
+        device->GL_GetSwapInterval = X11_GLES_GetSwapInterval;
+        device->GL_SwapWindow = X11_GLES_SwapWindow;
+        device->GL_DeleteContext = X11_GLES_DeleteContext;
+    }
 #endif
 
     device->SetClipboardText = X11_SetClipboardText;
--- a/src/video/x11/SDL_x11video.h	Wed Jul 18 15:01:41 2012 -0700
+++ b/src/video/x11/SDL_x11video.h	Wed Jul 18 15:02:48 2012 -0700
@@ -92,7 +92,9 @@
     Atom UTF8_STRING;
 
     SDL_Scancode key_layout[256];
-    SDL_bool selection_waiting;    
+    SDL_bool selection_waiting;
+
+    SDL_bool gles;
 } SDL_VideoData;
 
 extern SDL_bool X11_UseDirectColorVisuals(void);
--- a/src/video/x11/SDL_x11window.c	Wed Jul 18 15:01:41 2012 -0700
+++ b/src/video/x11/SDL_x11window.c	Wed Jul 18 15:02:48 2012 -0700
@@ -269,24 +269,19 @@
     Atom wmstate_atoms[3];
     Uint32 fevent = 0;
 
-#if SDL_VIDEO_OPENGL_GLX
+#if SDL_VIDEO_OPENGL_GLX || SDL_VIDEO_OPENGL_ES || SDL_VIDEO_OPENGL_ES2
     if (window->flags & SDL_WINDOW_OPENGL) {
         XVisualInfo *vinfo;
 
-        vinfo = X11_GL_GetVisual(_this, display, screen);
-        if (!vinfo) {
-            return -1;
+#if SDL_VIDEO_OPENGL_ES || SDL_VIDEO_OPENGL_ES2
+        if (data->gles) {
+            vinfo = X11_GLES_GetVisual(_this, display, screen);
+        } else
+#endif
+        {
+            vinfo = X11_GL_GetVisual(_this, display, screen);
         }
-        visual = vinfo->visual;
-        depth = vinfo->depth;
-        XFree(vinfo);
-    } else
-#endif
-#if SDL_VIDEO_OPENGL_ES || SDL_VIDEO_OPENGL_ES2
-    if (window->flags & SDL_WINDOW_OPENGL) {
-        XVisualInfo *vinfo;
 
-        vinfo = X11_GLES_GetVisual(_this, display, screen);
         if (!vinfo) {
             return -1;
         }
@@ -395,7 +390,7 @@
         return -1;
     }
 #if SDL_VIDEO_OPENGL_ES || SDL_VIDEO_OPENGL_ES2
-    if (window->flags & SDL_WINDOW_OPENGL) {
+    if (data->gles && window->flags & SDL_WINDOW_OPENGL) {
         /* Create the GLES window surface */
         _this->gles_data->egl_surface =
             _this->gles_data->eglCreateWindowSurface(_this->gles_data->