[PATCH weston 2/4] clients & tests: use eglGetPlatformDisplayEXT when supported
Jonny Lamb
jonny.lamb at collabora.co.uk
Tue Feb 17 07:48:01 PST 2015
---
clients/nested-client.c | 29 ++++++++++++++++++++++++++++-
clients/simple-egl.c | 23 ++++++++++++++++++++++-
clients/subsurfaces.c | 26 +++++++++++++++++++++++++-
clients/window.c | 27 ++++++++++++++++++++++++++-
tests/buffer-count-test.c | 30 ++++++++++++++++++++++++++++--
5 files changed, 129 insertions(+), 6 deletions(-)
diff --git a/clients/nested-client.c b/clients/nested-client.c
index 7f237e6..fbf5350 100644
--- a/clients/nested-client.c
+++ b/clients/nested-client.c
@@ -31,6 +31,7 @@
#include <GLES2/gl2.h>
#include <EGL/egl.h>
+#include <EGL/eglext.h>
struct window;
struct seat;
@@ -238,6 +239,10 @@ static const struct wl_registry_listener registry_listener = {
registry_handle_global_remove
};
+#ifdef EGL_EXT_platform_base
+static PFNEGLGETPLATFORMDISPLAYEXTPROC get_platform_display = NULL;
+#endif
+
static struct nested_client *
nested_client_create(void)
{
@@ -261,6 +266,10 @@ nested_client_create(void)
struct nested_client *client;
+#ifdef EGL_EXT_platform_base
+ const char *extensions;
+#endif
+
client = malloc(sizeof *client);
if (client == NULL)
return NULL;
@@ -277,7 +286,25 @@ nested_client_create(void)
/* get globals */
wl_display_roundtrip(client->display);
- client->egl_display = eglGetDisplay(client->display);
+#ifdef EGL_EXT_platform_base
+ extensions = eglQueryString(EGL_NO_DISPLAY, EGL_EXTENSIONS);
+
+ if (strstr(extensions, "EGL_EXT_platform_wayland")) {
+ get_platform_display =
+ (void *) eglGetProcAddress("eglGetPlatformDisplayEXT");
+ } else {
+ fprintf(stderr, "error: no wayland egl support\n");
+ return NULL;
+ }
+#endif
+
+ if (get_platform_display) {
+ client->egl_display = get_platform_display(EGL_PLATFORM_WAYLAND_EXT,
+ client->display, NULL);
+ } else {
+ client->egl_display = eglGetDisplay(client->display);
+ }
+
if (client->egl_display == NULL)
return NULL;
diff --git a/clients/simple-egl.c b/clients/simple-egl.c
index d3c205f..1162eb4 100644
--- a/clients/simple-egl.c
+++ b/clients/simple-egl.c
@@ -125,6 +125,10 @@ static const char *frag_shader_text =
static int running = 1;
+#ifdef EGL_EXT_platform_base
+static PFNEGLGETPLATFORMDISPLAYEXTPROC get_platform_display = NULL;
+#endif
+
static void
init_egl(struct display *display, struct window *window)
{
@@ -151,7 +155,24 @@ init_egl(struct display *display, struct window *window)
if (window->opaque || window->buffer_size == 16)
config_attribs[9] = 0;
- display->egl.dpy = eglGetDisplay(display->display);
+#ifdef EGL_EXT_platform_base
+ extensions = eglQueryString(EGL_NO_DISPLAY, EGL_EXTENSIONS);
+
+ if (strstr(extensions, "EGL_EXT_platform_wayland")) {
+ get_platform_display =
+ (void *) eglGetProcAddress("eglGetPlatformDisplayEXT");
+ } else {
+ fprintf(stderr, "error: no wayland egl support\n");
+ exit(1);
+ }
+#endif
+
+ if (get_platform_display) {
+ display->egl.dpy = get_platform_display(EGL_PLATFORM_WAYLAND_EXT,
+ display->display, NULL);
+ } else {
+ display->egl.dpy = eglGetDisplay(display->display);
+ }
assert(display->egl.dpy);
ret = eglInitialize(display->egl.dpy, &major, &minor);
diff --git a/clients/subsurfaces.c b/clients/subsurfaces.c
index fcbe496..d15d5a5 100644
--- a/clients/subsurfaces.c
+++ b/clients/subsurfaces.c
@@ -38,6 +38,7 @@
#include <wayland-egl.h>
#include <GLES2/gl2.h>
#include <EGL/egl.h>
+#include <EGL/eglext.h>
#include "window.h"
@@ -189,6 +190,10 @@ egl_print_config_info(struct egl_state *egl)
printf(" unknown\n");
}
+#ifdef EGL_EXT_platform_base
+static PFNEGLGETPLATFORMDISPLAYEXTPROC get_platform_display = NULL;
+#endif
+
static struct egl_state *
egl_state_create(struct wl_display *display)
{
@@ -212,10 +217,29 @@ egl_state_create(struct wl_display *display)
EGLint major, minor, n;
EGLBoolean ret;
+#ifdef EGL_EXT_platform_base
+ const char *extensions;
+
+ extensions = eglQueryString(EGL_NO_DISPLAY, EGL_EXTENSIONS);
+
+ if (strstr(extensions, "EGL_EXT_platform_wayland")) {
+ get_platform_display =
+ (void *) eglGetProcAddress("eglGetPlatformDisplayEXT");
+ } else {
+ fprintf(stderr, "error: no wayland egl support\n");
+ exit(1);
+ }
+#endif
+
egl = calloc(1, sizeof *egl);
assert(egl);
- egl->dpy = eglGetDisplay(display);
+ if (get_platform_display) {
+ egl->dpy = get_platform_display(EGL_PLATFORM_WAYLAND_EXT,
+ display, NULL);
+ } else {
+ egl->dpy = eglGetDisplay(display);
+ }
assert(egl->dpy);
ret = eglInitialize(egl->dpy, &major, &minor);
diff --git a/clients/window.c b/clients/window.c
index c5082ba..dc08f59 100644
--- a/clients/window.c
+++ b/clients/window.c
@@ -5348,6 +5348,11 @@ static const struct wl_registry_listener registry_listener = {
};
#ifdef HAVE_CAIRO_EGL
+
+#ifdef EGL_EXT_platform_base
+static PFNEGLGETPLATFORMDISPLAYEXTPROC get_platform_display = NULL;
+#endif
+
static int
init_egl(struct display *d)
{
@@ -5382,7 +5387,27 @@ init_egl(struct display *d)
EGLint api = EGL_OPENGL_API;
#endif
- d->dpy = eglGetDisplay(d->display);
+#ifdef EGL_EXT_platform_base
+ const char *extensions;
+
+ extensions = eglQueryString(EGL_NO_DISPLAY, EGL_EXTENSIONS);
+
+ if (strstr(extensions, "EGL_EXT_platform_wayland")) {
+ get_platform_display =
+ (void *) eglGetProcAddress("eglGetPlatformDisplayEXT");
+ } else {
+ fprintf(stderr, "error: no wayland egl support\n");
+ return -1;
+ }
+#endif
+
+ if (get_platform_display) {
+ d->dpy = get_platform_display(EGL_PLATFORM_WAYLAND_EXT,
+ d->display, NULL);
+ } else {
+ d->dpy = eglGetDisplay(d->display);
+ }
+
if (!eglInitialize(d->dpy, &major, &minor)) {
fprintf(stderr, "failed to initialize EGL\n");
return -1;
diff --git a/tests/buffer-count-test.c b/tests/buffer-count-test.c
index 43fb089..1912b62 100644
--- a/tests/buffer-count-test.c
+++ b/tests/buffer-count-test.c
@@ -25,6 +25,7 @@
#include <string.h>
#include <stdio.h>
#include <EGL/egl.h>
+#include <EGL/eglext.h>
#include <wayland-egl.h>
#include <GLES2/gl2.h>
@@ -41,6 +42,10 @@ struct test_data {
EGLSurface egl_surface;
};
+#ifdef EGL_EXT_platform_base
+static PFNEGLGETPLATFORMDISPLAYEXTPROC get_platform_display = NULL;
+#endif
+
static int
init_egl(struct test_data *test_data)
{
@@ -66,8 +71,29 @@ init_egl(struct test_data *test_data)
EGLint major, minor, n;
EGLBoolean ret;
- test_data->egl_dpy = eglGetDisplay((EGLNativeDisplayType)
- test_data->client->wl_display);
+#ifdef EGL_EXT_platform_base
+ const char *extensions;
+
+ extensions = eglQueryString(EGL_NO_DISPLAY, EGL_EXTENSIONS);
+
+ if (strstr(extensions, "EGL_EXT_platform_wayland")) {
+ get_platform_display =
+ (void *) eglGetProcAddress("eglGetPlatformDisplayEXT");
+ } else {
+ fprintf(stderr, "error: no wayland egl support\n");
+ return -1;
+ }
+#endif
+
+ if (get_platform_display) {
+ test_data->egl_dpy = get_platform_display(EGL_PLATFORM_WAYLAND_EXT,
+ test_data->client->wl_display,
+ NULL);
+ } else {
+ test_data->egl_dpy = eglGetDisplay((EGLNativeDisplayType)
+ test_data->client->wl_display);
+ }
+
if (!test_data->egl_dpy)
fail("eglGetDisplay");
--
2.1.4
More information about the wayland-devel
mailing list