Commit 02e9f81ebec524d3544ca218d0b168a52cb63039

Knut Andre Tidemann 2014-06-28T12:17:29

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.

diff --git a/configure b/configure
index efca355..fb81a2d 100755
--- a/configure
+++ b/configure
@@ -21045,6 +21045,7 @@ $as_echo_n "checking for EGL support... " >&6; }
 /* end confdefs.h.  */
 
          #include <EGL/egl.h>
+         #include <EGL/eglext.h>
 
 int
 main ()
diff --git a/configure.in b/configure.in
index e0dfac1..efb371a 100644
--- a/configure.in
+++ b/configure.in
@@ -1956,6 +1956,7 @@ CheckOpenGLESX11()
         video_opengl_egl=no
         AC_TRY_COMPILE([
          #include <EGL/egl.h>
+         #include <EGL/eglext.h>
         ],[
         ],[
         video_opengl_egl=yes
diff --git a/include/SDL_egl.h b/include/SDL_egl.h
index 036e73a..546a1a7 100644
--- a/include/SDL_egl.h
+++ b/include/SDL_egl.h
@@ -27,6 +27,7 @@
 #ifndef _MSC_VER
 
 #include <EGL/egl.h>
+#include <EGL/eglext.h>
 
 #else /* _MSC_VER */
 
diff --git a/src/video/SDL_egl.c b/src/video/SDL_egl.c
index 0185f66..57d5fb6 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) {