[waffle] [PATCH] egl: Support robust access contexts with EGL 1.5.

Bas Nieuwenhuizen bas at basnieuwenhuizen.nl
Fri Apr 15 21:04:59 UTC 2016


EGL 1.5 also supports the EGL_CONTEXT_OPENGL_ROBUST_ACCESS
attribute without any extensions for both ES and non-ES.

Signed-off-by: Bas Nieuwenhuizen <bas at basnieuwenhuizen.nl>
---
 src/waffle/egl/wegl_config.c  | 9 ++++++---
 src/waffle/egl/wegl_context.c | 9 +++++++--
 src/waffle/egl/wegl_display.c | 3 +--
 src/waffle/egl/wegl_display.h | 2 ++
 4 files changed, 16 insertions(+), 7 deletions(-)

diff --git a/src/waffle/egl/wegl_config.c b/src/waffle/egl/wegl_config.c
index 1c3f416..08e06fb 100644
--- a/src/waffle/egl/wegl_config.c
+++ b/src/waffle/egl/wegl_config.c
@@ -56,17 +56,20 @@ check_context_attrs(struct wegl_display *dpy,
     }
 
     if (attrs->context_robust && !dpy->EXT_create_context_robustness &&
+        dpy->major_version == 1 && dpy->minor_version < 5 &&
         attrs->context_api != WAFFLE_CONTEXT_OPENGL) {
         wcore_errorf(WAFFLE_ERROR_UNSUPPORTED_ON_PLATFORM,
-                     "EGL_EXT_create_context_robustness is required in order to "
-                     "request a robust access context for OpenGL ES");
+                     "EGL_EXT_create_context_robustness or EGL 1.5 is "
+                     "required in order to request a robust access context "
+                     "for OpenGL ES");
         return false;
     }
 
     if (attrs->context_robust && !dpy->KHR_create_context &&
+        dpy->major_version == 1 && dpy->minor_version < 5 &&
         attrs->context_api == WAFFLE_CONTEXT_OPENGL) {
         wcore_errorf(WAFFLE_ERROR_UNSUPPORTED_ON_PLATFORM,
-                     "EGL_KHR_create_context is required in order to "
+                     "EGL_KHR_create_context or EGL 1.5 is required in order to "
                      "request a robust access context for OpenGL");
         return false;
     }
diff --git a/src/waffle/egl/wegl_context.c b/src/waffle/egl/wegl_context.c
index 67cbc04..4b208fa 100644
--- a/src/waffle/egl/wegl_context.c
+++ b/src/waffle/egl/wegl_context.c
@@ -96,8 +96,13 @@ create_real_context(struct wegl_config *config,
             }
 
             if (attrs->context_robust) {
-                assert(dpy->KHR_create_context);
-                context_flags |= EGL_CONTEXT_OPENGL_ROBUST_ACCESS_BIT_KHR;
+                if (dpy->major_version > 1 || dpy->minor_version >= 5) {
+                    attrib_list[i++] = EGL_CONTEXT_OPENGL_ROBUST_ACCESS_EXT;
+                    attrib_list[i++] = EGL_TRUE;
+                } else {
+                    assert(dpy->KHR_create_context);
+                    context_flags |= EGL_CONTEXT_OPENGL_ROBUST_ACCESS_BIT_KHR;
+                }
             }
 
             if (wcore_config_attrs_version_ge(attrs, 32))  {
diff --git a/src/waffle/egl/wegl_display.c b/src/waffle/egl/wegl_display.c
index 16af142..a5e3429 100644
--- a/src/waffle/egl/wegl_display.c
+++ b/src/waffle/egl/wegl_display.c
@@ -64,7 +64,6 @@ wegl_display_init(struct wegl_display *dpy,
 {
     struct wegl_platform *plat = wegl_platform(wc_plat);
     bool ok;
-    EGLint major, minor;
 
     ok = wcore_display_init(&dpy->wcore, wc_plat);
     if (!ok)
@@ -76,7 +75,7 @@ wegl_display_init(struct wegl_display *dpy,
         goto fail;
     }
 
-    ok = plat->eglInitialize(dpy->egl, &major, &minor);
+    ok = plat->eglInitialize(dpy->egl, &dpy->major_version, &dpy->minor_version);
     if (!ok) {
         wegl_emit_error(plat, "eglInitialize");
         goto fail;
diff --git a/src/waffle/egl/wegl_display.h b/src/waffle/egl/wegl_display.h
index b82a2ec..0d03ec8 100644
--- a/src/waffle/egl/wegl_display.h
+++ b/src/waffle/egl/wegl_display.h
@@ -39,6 +39,8 @@ struct wegl_display {
     EGLDisplay egl;
     bool EXT_create_context_robustness;
     bool KHR_create_context;
+    EGLint major_version;
+    EGLint minor_version;
 };
 
 DEFINE_CONTAINER_CAST_FUNC(wegl_display,
-- 
2.8.0



More information about the waffle mailing list