[waffle] [PATCH 7/8] egl: Use eglGetPlatformDisplay when possible (v2)

Chad Versace chadversary at chromium.org
Mon Oct 24 21:58:02 UTC 2016


Tested against Mesa master at 8c78fdb with `ninja check-func` on Linux for
x11_egl, wayland, and gbm. However, the new codepaths were not tested
because Mesa does not yet support the needed eglGetPlatformDisplay
extensions.

v2:
  - For x11_egl, pass a `Display*` to eglGetPlatformDisplay, not a
    `Display**`. (for emil)
  - Rebase on other v2 patches.

Cc: Emil Velikov <emil.l.velikov at gmail.com>
---
 src/waffle/egl/wegl_display.c  | 17 +++++++++++++----
 src/waffle/egl/wegl_platform.c | 36 ++++++++++++++++++++++++++++++++++--
 src/waffle/egl/wegl_platform.h |  8 ++++++++
 3 files changed, 55 insertions(+), 6 deletions(-)

diff --git a/src/waffle/egl/wegl_display.c b/src/waffle/egl/wegl_display.c
index 7a7986c..5403cd1 100644
--- a/src/waffle/egl/wegl_display.c
+++ b/src/waffle/egl/wegl_display.c
@@ -104,10 +104,19 @@ wegl_display_init(struct wegl_display *dpy,
     if (!ok)
         goto fail;
 
-    dpy->egl = plat->eglGetDisplay((EGLNativeDisplayType) native_display);
-    if (!dpy->egl) {
-        wegl_emit_error(plat, "eglGetDisplay");
-        goto fail;
+    if (wegl_platform_can_use_eglGetPlatformDisplay(plat)) {
+        dpy->egl = plat->eglGetPlatformDisplay(plat->egl_platform,
+                                               native_display, NULL);
+        if (!dpy->egl) {
+            wegl_emit_error(plat, "eglGetPlatformDisplay");
+            goto fail;
+        }
+    } else {
+        dpy->egl = plat->eglGetDisplay((EGLNativeDisplayType) native_display);
+        if (!dpy->egl) {
+            wegl_emit_error(plat, "eglGetDisplay");
+            goto fail;
+        }
     }
 
     ok = plat->eglInitialize(dpy->egl, &dpy->major_version, &dpy->minor_version);
diff --git a/src/waffle/egl/wegl_platform.c b/src/waffle/egl/wegl_platform.c
index f52bdfa..5887cf5 100644
--- a/src/waffle/egl/wegl_platform.c
+++ b/src/waffle/egl/wegl_platform.c
@@ -66,8 +66,10 @@ wegl_platform_teardown(struct wegl_platform *self)
     bool ok = true;
     int error = 0;
 
-    if (self->egl_platform != EGL_PLATFORM_ANDROID_KHR)
+    if (!wegl_platform_can_use_eglGetPlatformDisplay(self)
+        && self->egl_platform != EGL_PLATFORM_ANDROID_KHR) {
         unsetenv("EGL_PLATFORM");
+    }
 
     if (self->eglHandle) {
         error = dlclose(self->eglHandle);
@@ -168,10 +170,40 @@ wegl_platform_init(struct wegl_platform *self, EGLenum egl_platform)
     self->client_extensions =
         self->eglQueryString(EGL_NO_DISPLAY, EGL_EXTENSIONS);
 
-    setup_env(self);
+    if (!wegl_platform_can_use_eglGetPlatformDisplay(self))
+        setup_env(self);
 
 error:
     // On failure the caller of wegl_platform_init will trigger it's own
     // destruction which will execute wegl_platform_teardown.
     return ok;
 }
+
+bool
+wegl_platform_can_use_eglGetPlatformDisplay(const struct wegl_platform *plat)
+{
+    const char *ext;
+
+    if (!plat->eglGetPlatformDisplay)
+        return false;
+
+    switch (plat->egl_platform) {
+        case EGL_PLATFORM_ANDROID_KHR:
+            ext = "EGL_KHR_platform_android";
+            break;
+        case EGL_PLATFORM_GBM_KHR:
+            ext = "EGL_KHR_platform_gbm";
+            break;
+        case EGL_PLATFORM_WAYLAND_KHR:
+            ext = "EGL_KHR_platform_wayland";
+            break;
+        case EGL_PLATFORM_X11_KHR:
+            ext = "EGL_KHR_platform_x11";
+            break;
+        default:
+            assert(!"bad egl_platform enum");
+            return false;
+    }
+
+    return waffle_is_extension_in_string(plat->client_extensions, ext);
+}
diff --git a/src/waffle/egl/wegl_platform.h b/src/waffle/egl/wegl_platform.h
index 4573ec2..d6788eb 100644
--- a/src/waffle/egl/wegl_platform.h
+++ b/src/waffle/egl/wegl_platform.h
@@ -103,3 +103,11 @@ wegl_platform_teardown(struct wegl_platform *self);
 
 bool
 wegl_platform_init(struct wegl_platform *self, EGLenum egl_platform);
+
+
+// Can eglGetPlatformDisplay can be used for this platform?
+//
+// True if libEGL exposes the eglGetPlatformDisplay function; and if EGL
+// supports the needed platform extension.
+bool
+wegl_platform_can_use_eglGetPlatformDisplay(const struct wegl_platform *plat);
-- 
2.10.1



More information about the waffle mailing list