1
0
Эх сурвалжийг харах

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.
Knut Andre Tidemann 10 жил өмнө
parent
commit
02e9f81ebe
4 өөрчлөгдсөн 60 нэмэгдсэн , 1 устгасан
  1. 1 0
      configure
  2. 1 0
      configure.in
  3. 1 0
      include/SDL_egl.h
  4. 57 1
      src/video/SDL_egl.c

+ 1 - 0
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 ()

+ 1 - 0
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

+ 1 - 0
include/SDL_egl.h

@@ -27,6 +27,7 @@
 #ifndef _MSC_VER
 
 #include <EGL/egl.h>
+#include <EGL/eglext.h>
 
 #else /* _MSC_VER */
 

+ 57 - 1
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) {