From 02e9f81ebec524d3544ca218d0b168a52cb63039 Mon Sep 17 00:00:00 2001 From: Knut Andre Tidemann Date: Sat, 28 Jun 2014 12:17:29 -0300 Subject: [PATCH] SDL_egl: allow creation of versioned OpenGL contexts with EGL_KHR_create_context If the EGL extension EGL_KHR_create_context is available, we can use it to set the core/compatability profile and the minimum OpenGL version. Use this if it is available to get the context requested by the GL attributes. --- configure | 1 + configure.in | 1 + include/SDL_egl.h | 1 + src/video/SDL_egl.c | 58 ++++++++++++++++++++++++++++++++++++++++++++- 4 files changed, 60 insertions(+), 1 deletion(-) diff --git a/configure b/configure index efca355fbd199..fb81a2db1142b 100755 --- a/configure +++ b/configure @@ -21045,6 +21045,7 @@ $as_echo_n "checking for EGL support... " >&6; } /* end confdefs.h. */ #include + #include int main () diff --git a/configure.in b/configure.in index e0dfac1d21c62..efb371a2b2397 100644 --- a/configure.in +++ b/configure.in @@ -1956,6 +1956,7 @@ CheckOpenGLESX11() video_opengl_egl=no AC_TRY_COMPILE([ #include + #include ],[ ],[ video_opengl_egl=yes diff --git a/include/SDL_egl.h b/include/SDL_egl.h index 036e73a9f2c17..546a1a7458162 100644 --- a/include/SDL_egl.h +++ b/include/SDL_egl.h @@ -27,6 +27,7 @@ #ifndef _MSC_VER #include +#include #else /* _MSC_VER */ diff --git a/src/video/SDL_egl.c b/src/video/SDL_egl.c index 0185f66aa2019..57d5fb654f857 100644 --- a/src/video/SDL_egl.c +++ b/src/video/SDL_egl.c @@ -69,6 +69,37 @@ if (!_this->egl_data->NAME) \ } /* EGL implementation of SDL OpenGL ES support */ +static int SDL_EGL_HasExtension(_THIS, const char *ext) +{ + int i; + int len = 0; + int ext_len; + const char *exts; + const char *ext_word; + + ext_len = SDL_strlen(ext); + exts = _this->egl_data->eglQueryString(_this->egl_data->egl_display, EGL_EXTENSIONS); + + if(exts) { + ext_word = exts; + + for(i = 0; exts[i] != 0; i++) { + if(exts[i] == ' ') { + if(ext_len == len && !SDL_strncmp(ext_word, ext, len)) { + return 1; + } + + len = 0; + ext_word = &exts[i + 1]; + } + else { + len++; + } + } + } + + return 0; +} void * SDL_EGL_GetProcAddress(_THIS, const char *proc) @@ -226,6 +257,7 @@ SDL_EGL_LoadLibrary(_THIS, const char *egl_path, NativeDisplayType native_displa LOAD_FUNC(eglWaitNative); LOAD_FUNC(eglWaitGL); LOAD_FUNC(eglBindAPI); + LOAD_FUNC(eglQueryString); #if !defined(__WINRT__) _this->egl_data->egl_display = _this->egl_data->eglGetDisplay(native_display); @@ -365,6 +397,10 @@ SDL_EGL_CreateContext(_THIS, EGLSurface egl_surface) EGLint context_attrib_list[] = { EGL_CONTEXT_CLIENT_VERSION, 1, + EGL_NONE, + EGL_NONE, + EGL_NONE, + EGL_NONE, EGL_NONE }; @@ -392,9 +428,29 @@ SDL_EGL_CreateContext(_THIS, EGLSurface egl_surface) } else { _this->egl_data->eglBindAPI(EGL_OPENGL_API); + if(SDL_EGL_HasExtension(_this, "EGL_KHR_create_context")) { + context_attrib_list[0] = EGL_CONTEXT_MAJOR_VERSION_KHR; + context_attrib_list[1] = _this->gl_config.major_version; + context_attrib_list[2] = EGL_CONTEXT_MINOR_VERSION_KHR; + context_attrib_list[3] = _this->gl_config.minor_version; + context_attrib_list[4] = EGL_CONTEXT_OPENGL_PROFILE_MASK_KHR; + switch(_this->gl_config.profile_mask) { + case SDL_GL_CONTEXT_PROFILE_COMPATIBILITY: + context_attrib_list[5] = EGL_CONTEXT_OPENGL_COMPATIBILITY_PROFILE_BIT_KHR; + break; + + case SDL_GL_CONTEXT_PROFILE_CORE: + default: + context_attrib_list[5] = EGL_CONTEXT_OPENGL_CORE_PROFILE_BIT_KHR; + break; + } + } + else { + context_attrib_list[0] = EGL_NONE; + } egl_context = _this->egl_data->eglCreateContext(_this->egl_data->egl_display, _this->egl_data->egl_config, - share_context, NULL); + share_context, context_attrib_list); } if (egl_context == EGL_NO_CONTEXT) {