Skip to content

Commit

Permalink
SDL_egl: allow creation of versioned OpenGL contexts with EGL_KHR_cre…
Browse files Browse the repository at this point in the history
…ate_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.
  • Loading branch information
awdAvenger committed Jun 28, 2014
1 parent e592b04 commit 02e9f81
Show file tree
Hide file tree
Showing 4 changed files with 60 additions and 1 deletion.
1 change: 1 addition & 0 deletions configure
Expand Up @@ -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 ()
Expand Down
1 change: 1 addition & 0 deletions configure.in
Expand Up @@ -1956,6 +1956,7 @@ CheckOpenGLESX11()
video_opengl_egl=no
AC_TRY_COMPILE([
#include <EGL/egl.h>
#include <EGL/eglext.h>
],[
],[
video_opengl_egl=yes
Expand Down
1 change: 1 addition & 0 deletions include/SDL_egl.h
Expand Up @@ -27,6 +27,7 @@
#ifndef _MSC_VER

#include <EGL/egl.h>
#include <EGL/eglext.h>

#else /* _MSC_VER */

Expand Down
58 changes: 57 additions & 1 deletion src/video/SDL_egl.c
Expand Up @@ -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)
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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
};

Expand Down Expand Up @@ -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) {
Expand Down

0 comments on commit 02e9f81

Please sign in to comment.