Skip to content
This repository has been archived by the owner on Feb 11, 2021. It is now read-only.

Commit

Permalink
Fix OpenGL initialization when OpenGL and OpenGLES are both available.
Browse files Browse the repository at this point in the history
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
  • Loading branch information
slouken committed Jul 18, 2012
1 parent 8853df8 commit a46a010
Show file tree
Hide file tree
Showing 3 changed files with 53 additions and 39 deletions.
65 changes: 41 additions & 24 deletions src/video/x11/SDL_x11video.c
Expand Up @@ -144,13 +144,26 @@ X11_CreateDevice(int devindex)
}
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

Expand Down Expand Up @@ -224,26 +237,30 @@ X11_CreateDevice(int devindex)
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;
Expand Down
4 changes: 3 additions & 1 deletion src/video/x11/SDL_x11video.h
Expand Up @@ -92,7 +92,9 @@ typedef struct SDL_VideoData
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);
Expand Down
23 changes: 9 additions & 14 deletions src/video/x11/SDL_x11window.c
Expand Up @@ -269,24 +269,19 @@ X11_CreateWindow(_THIS, SDL_Window * window)
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;
}
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;
if (data->gles) {
vinfo = X11_GLES_GetVisual(_this, display, screen);
} else
#endif
{
vinfo = X11_GL_GetVisual(_this, display, screen);
}

vinfo = X11_GLES_GetVisual(_this, display, screen);
if (!vinfo) {
return -1;
}
Expand Down Expand Up @@ -395,7 +390,7 @@ X11_CreateWindow(_THIS, SDL_Window * window)
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->
Expand Down

0 comments on commit a46a010

Please sign in to comment.