#include <EGL/eglext.h>
-#if !defined(CON_GL1) && !defined(CON_GLES2)
-#error "Valid GL contexts for EGL are: GL1, GLES2"
+#if !defined(CON_GL1) && !defined(CON_GL3) && !defined(CON_GLES2)
+#error "Valid GL contexts for EGL are: GL1, GL3, GLES2"
#endif
static const char *eglErrorToString(EGLint e)
static const EGLint contextAttribs[] = {
#ifdef CON_GLES2
EGL_CONTEXT_CLIENT_VERSION, 2,
+#elif CON_GL3
+ EGL_CONTEXT_MAJOR_VERSION_KHR, 3,
+ EGL_CONTEXT_MINOR_VERSION_KHR, 0,
+ EGL_CONTEXT_FLAGS_KHR, EGL_CONTEXT_OPENGL_FORWARD_COMPATIBLE_BIT_KHR,
#endif
EGL_NONE
};
if (eglInitialize(display, &eglMajor, &eglMinor) == EGL_FALSE)
dieEgl("Failed to initialize EGL");
printf("Using EGL version: %d.%d\n", eglMajor, eglMinor);
- if (eglMajor == 1 && eglMinor < 3) {
- // Choosing the GL context version requires EGL 1.3
- die("Need at least EGL 1.3 to function properly\n");
+ if (eglMajor == 1 && eglMinor < 4) {
+ // Choosing the GL context version requires EGL 1.3, creating an OpenGL 3 context requires EGL 1.4
+ die("Need at least EGL 1.4 to function properly\n");
}
#ifdef CON_GLES2
if (eglBindAPI(EGL_OPENGL_ES_API) == EGL_FALSE)
if (eglBindAPI(EGL_OPENGL_API) == EGL_FALSE)
#endif
dieEgl("Failed to bind API");
+ // check for the extension we need
+#ifdef CON_GL3
+ if (!haveEGLExtension("EGL_KHR_create_context")) {
+ die("Required EGL extension EGL_KHR_create_context is not supported\n");
+ }
+#endif
// get an appropriate config
EGLConfig configs[1];
EGLint count;
return (VisualID)val;
}
+bool EGLBackend::haveEGLExtension(const std::string &name)
+{
+ assert(display != EGL_NO_DISPLAY);
+ std::string extensions = eglQueryString(display, EGL_EXTENSIONS);
+ return (std::string(" "+extensions+" ").find(" "+name+" ") != std::string::npos);
+}
+
void EGLBackend::createContext(Window window)
{
assert(display != EGL_NO_DISPLAY && context == EGL_NO_CONTEXT);