SDL_egl: allow creation of versioned OpenGL contexts with EGL_KHR_create_context
authorKnut Andre Tidemann <knut.tidemann@gmail.com>
Sat, 28 Jun 2014 12:17:29 -0300
changeset 8962 c593cbef6d7d
parent 8961 7dbbee37826b
child 8963 f94215b55583
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
configure.in
include/SDL_egl.h
src/video/SDL_egl.c
--- a/configure	Thu Jun 26 12:42:15 2014 -0700
+++ b/configure	Sat Jun 28 12:17:29 2014 -0300
@@ -21045,6 +21045,7 @@
 /* end confdefs.h.  */
 
          #include <EGL/egl.h>
+         #include <EGL/eglext.h>
 
 int
 main ()
--- a/configure.in	Thu Jun 26 12:42:15 2014 -0700
+++ b/configure.in	Sat Jun 28 12:17:29 2014 -0300
@@ -1956,6 +1956,7 @@
         video_opengl_egl=no
         AC_TRY_COMPILE([
          #include <EGL/egl.h>
+         #include <EGL/eglext.h>
         ],[
         ],[
         video_opengl_egl=yes
--- a/include/SDL_egl.h	Thu Jun 26 12:42:15 2014 -0700
+++ b/include/SDL_egl.h	Sat Jun 28 12:17:29 2014 -0300
@@ -27,6 +27,7 @@
 #ifndef _MSC_VER
 
 #include <EGL/egl.h>
+#include <EGL/eglext.h>
 
 #else /* _MSC_VER */
 
--- a/src/video/SDL_egl.c	Thu Jun 26 12:42:15 2014 -0700
+++ b/src/video/SDL_egl.c	Sat Jun 28 12:17:29 2014 -0300
@@ -69,6 +69,37 @@
 }
     
 /* 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 @@
     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 @@
     EGLint context_attrib_list[] = {
         EGL_CONTEXT_CLIENT_VERSION,
         1,
+        EGL_NONE,
+        EGL_NONE,
+        EGL_NONE,
+        EGL_NONE,
         EGL_NONE
     };
     
@@ -392,9 +428,29 @@
     }
     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) {