From ace1e98a186149702f736e1c11463ca2cfcecd6b Mon Sep 17 00:00:00 2001 From: Gabriel Jacobo Date: Thu, 29 Aug 2013 15:02:32 -0300 Subject: [PATCH] Fixes bug #2040, prepare SDL_GL_CONTEXT_EGL for deprecation on v2.1 SDL_GL_CONTEXT_EGL = 1 is now internally treated as profile_mask = SDL_GL_CONTEXT_PROFILE_ES --- src/render/opengles/SDL_render_gles.c | 2 +- src/render/opengles2/SDL_render_gles2.c | 2 +- src/video/SDL_video.c | 28 ++++++++------ src/video/x11/SDL_x11opengl.c | 49 +++++++++++-------------- src/video/x11/SDL_x11opengles.c | 4 +- src/video/x11/SDL_x11window.c | 10 +++-- 6 files changed, 50 insertions(+), 45 deletions(-) diff --git a/src/render/opengles/SDL_render_gles.c b/src/render/opengles/SDL_render_gles.c index 1b3ea0f79ece4..b3ce7909670e2 100644 --- a/src/render/opengles/SDL_render_gles.c +++ b/src/render/opengles/SDL_render_gles.c @@ -280,7 +280,7 @@ GLES_CreateRenderer(SDL_Window * window, Uint32 flags) GLint value; Uint32 windowFlags; - SDL_GL_SetAttribute(SDL_GL_CONTEXT_EGL, 1); + SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_ES); SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 1); SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 1); diff --git a/src/render/opengles2/SDL_render_gles2.c b/src/render/opengles2/SDL_render_gles2.c index db030c6c03074..484186e3375da 100644 --- a/src/render/opengles2/SDL_render_gles2.c +++ b/src/render/opengles2/SDL_render_gles2.c @@ -1628,7 +1628,7 @@ GLES2_CreateRenderer(SDL_Window *window, Uint32 flags) Uint32 windowFlags; GLint window_framebuffer; - SDL_GL_SetAttribute(SDL_GL_CONTEXT_EGL, 1); + SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_ES); SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 2); SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 0); diff --git a/src/video/SDL_video.c b/src/video/SDL_video.c index 53e6e0208cdbb..72bd0747032e2 100644 --- a/src/video/SDL_video.c +++ b/src/video/SDL_video.c @@ -477,26 +477,21 @@ SDL_VideoInit(const char *driver_name) _this->gl_config.multisamplesamples = 0; _this->gl_config.retained_backing = 1; _this->gl_config.accelerated = -1; /* accelerated or not, both are fine */ + _this->gl_config.profile_mask = 0; #if SDL_VIDEO_OPENGL _this->gl_config.major_version = 2; _this->gl_config.minor_version = 1; - _this->gl_config.use_egl = 0; #elif SDL_VIDEO_OPENGL_ES _this->gl_config.major_version = 1; _this->gl_config.minor_version = 1; -#if SDL_VIDEO_OPENGL_EGL - _this->gl_config.use_egl = 1; -#endif + _this->gl_config.profile_mask = SDL_GL_CONTEXT_PROFILE_ES; #elif SDL_VIDEO_OPENGL_ES2 _this->gl_config.major_version = 2; _this->gl_config.minor_version = 0; -#if SDL_VIDEO_OPENGL_EGL - _this->gl_config.use_egl = 1; -#endif - + _this->gl_config.profile_mask = SDL_GL_CONTEXT_PROFILE_ES; #endif _this->gl_config.flags = 0; - _this->gl_config.profile_mask = 0; + _this->gl_config.share_with_current_context = 0; _this->current_glwin_tls = SDL_TLSCreate(); @@ -2516,7 +2511,12 @@ SDL_GL_SetAttribute(SDL_GLattr attr, int value) _this->gl_config.minor_version = value; break; case SDL_GL_CONTEXT_EGL: - _this->gl_config.use_egl = value; + /* FIXME: SDL_GL_CONTEXT_EGL to be deprecated in SDL 2.1 */ + if (value != 0) { + SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_ES); + } else { + SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, 0); + }; break; case SDL_GL_CONTEXT_FLAGS: if( value & ~(SDL_GL_CONTEXT_DEBUG_FLAG | @@ -2686,8 +2686,14 @@ SDL_GL_GetAttribute(SDL_GLattr attr, int *value) return 0; } case SDL_GL_CONTEXT_EGL: + /* FIXME: SDL_GL_CONTEXT_EGL to be deprecated in SDL 2.1 */ { - *value = _this->gl_config.use_egl; + if (_this->gl_config.profile_mask == SDL_GL_CONTEXT_PROFILE_ES) { + *value = 1; + } + else { + *value = 0; + } return 0; } case SDL_GL_CONTEXT_FLAGS: diff --git a/src/video/x11/SDL_x11opengl.c b/src/video/x11/SDL_x11opengl.c index 6f1cc8b6b5aa3..67a4b06cc6260 100644 --- a/src/video/x11/SDL_x11opengl.c +++ b/src/video/x11/SDL_x11opengl.c @@ -210,36 +210,31 @@ X11_GL_LoadLibrary(_THIS, const char *path) /* Initialize extensions */ X11_GL_InitExtensions(_this); - /* If SDL_GL_CONTEXT_EGL has been changed to 1, and there's - * no GLX_EXT_create_context_es2_profile extension switch over to X11_GLES functions */ - if (_this->gl_config.use_egl == 1) { - if (_this->gl_data->HAS_GLX_EXT_create_context_es2_profile) { - /* We cheat a little bit here by using GLX instead of EGL - * to improve our chances of getting hardware acceleration */ - _this->gl_config.use_egl = 0; - _this->gl_config.profile_mask = SDL_GL_CONTEXT_PROFILE_ES; - } else { + /* If we need a GL ES context and there's no + * GLX_EXT_create_context_es2_profile extension, switch over to X11_GLES functions + */ + if (_this->gl_config.profile_mask == SDL_GL_CONTEXT_PROFILE_ES && + ! _this->gl_data->HAS_GLX_EXT_create_context_es2_profile ) { #if SDL_VIDEO_OPENGL_EGL - X11_GL_UnloadLibrary(_this); - /* Better avoid conflicts! */ - if (_this->gl_config.dll_handle != NULL ) { - GL_UnloadObject(_this->gl_config.dll_handle); - _this->gl_config.dll_handle = NULL; - } - _this->GL_LoadLibrary = X11_GLES_LoadLibrary; - _this->GL_GetProcAddress = X11_GLES_GetProcAddress; - _this->GL_UnloadLibrary = X11_GLES_UnloadLibrary; - _this->GL_CreateContext = X11_GLES_CreateContext; - _this->GL_MakeCurrent = X11_GLES_MakeCurrent; - _this->GL_SetSwapInterval = X11_GLES_SetSwapInterval; - _this->GL_GetSwapInterval = X11_GLES_GetSwapInterval; - _this->GL_SwapWindow = X11_GLES_SwapWindow; - _this->GL_DeleteContext = X11_GLES_DeleteContext; - return X11_GLES_LoadLibrary(_this, NULL); + X11_GL_UnloadLibrary(_this); + /* Better avoid conflicts! */ + if (_this->gl_config.dll_handle != NULL ) { + GL_UnloadObject(_this->gl_config.dll_handle); + _this->gl_config.dll_handle = NULL; + } + _this->GL_LoadLibrary = X11_GLES_LoadLibrary; + _this->GL_GetProcAddress = X11_GLES_GetProcAddress; + _this->GL_UnloadLibrary = X11_GLES_UnloadLibrary; + _this->GL_CreateContext = X11_GLES_CreateContext; + _this->GL_MakeCurrent = X11_GLES_MakeCurrent; + _this->GL_SetSwapInterval = X11_GLES_SetSwapInterval; + _this->GL_GetSwapInterval = X11_GLES_GetSwapInterval; + _this->GL_SwapWindow = X11_GLES_SwapWindow; + _this->GL_DeleteContext = X11_GLES_DeleteContext; + return X11_GLES_LoadLibrary(_this, NULL); #else - return SDL_SetError("SDL not configured with EGL support"); + return SDL_SetError("SDL not configured with EGL support"); #endif - } } return 0; diff --git a/src/video/x11/SDL_x11opengles.c b/src/video/x11/SDL_x11opengles.c index 2d2054ae3318c..98183258f8cae 100644 --- a/src/video/x11/SDL_x11opengles.c +++ b/src/video/x11/SDL_x11opengles.c @@ -33,8 +33,8 @@ X11_GLES_LoadLibrary(_THIS, const char *path) { SDL_VideoData *data = (SDL_VideoData *) _this->driverdata; - /* If SDL_GL_CONTEXT_EGL has been changed to 0, switch over to X11_GL functions */ - if (_this->gl_config.use_egl == 0) { + /* If the profile requested is not GL ES, switch over to X11_GL functions */ + if (_this->gl_config.profile_mask != SDL_GL_CONTEXT_PROFILE_ES) { #if SDL_VIDEO_OPENGL_GLX _this->GL_LoadLibrary = X11_GL_LoadLibrary; _this->GL_GetProcAddress = X11_GL_GetProcAddress; diff --git a/src/video/x11/SDL_x11window.c b/src/video/x11/SDL_x11window.c index 6bc2eb950cb40..a8915289e0cf1 100644 --- a/src/video/x11/SDL_x11window.c +++ b/src/video/x11/SDL_x11window.c @@ -366,10 +366,11 @@ X11_CreateWindow(_THIS, SDL_Window * window) #if SDL_VIDEO_OPENGL_GLX || SDL_VIDEO_OPENGL_EGL if (window->flags & SDL_WINDOW_OPENGL) { - XVisualInfo *vinfo; + XVisualInfo *vinfo = NULL; #if SDL_VIDEO_OPENGL_EGL - if (_this->gl_config.use_egl == 1) { + if (_this->gl_config.profile_mask == SDL_GL_CONTEXT_PROFILE_ES && + ( !_this->gl_data || ! _this->gl_data->HAS_GLX_EXT_create_context_es2_profile )) { vinfo = X11_GLES_GetVisual(_this, display, screen); } else #endif @@ -378,6 +379,7 @@ X11_CreateWindow(_THIS, SDL_Window * window) vinfo = X11_GL_GetVisual(_this, display, screen); #endif } + if (!vinfo) { return -1; } @@ -551,7 +553,9 @@ X11_CreateWindow(_THIS, SDL_Window * window) windowdata = (SDL_WindowData *) window->driverdata; #if SDL_VIDEO_OPENGL_ES || SDL_VIDEO_OPENGL_ES2 - if ((window->flags & SDL_WINDOW_OPENGL) && (_this->gl_config.use_egl == 1)) { + if ((window->flags & SDL_WINDOW_OPENGL) && + _this->gl_config.profile_mask == SDL_GL_CONTEXT_PROFILE_ES && + (!_this->gl_data || ! _this->gl_data->HAS_GLX_EXT_create_context_es2_profile) ) { if (!_this->egl_data) { XDestroyWindow(display, w); return -1;