[PATCH weston 2/4] clients & tests: use eglGetPlatformDisplayEXT when supported
Pekka Paalanen
ppaalanen at gmail.com
Mon Mar 23 03:34:59 PDT 2015
On Fri, 20 Mar 2015 15:26:51 +0100
Jonny Lamb <jonny.lamb at collabora.co.uk> wrote:
> Reviewed-by: Derek Foreman <derekf at osg.samsung.com>
> Reviewed-by: Bryce Harrington <bryce at osg.samsung.com>
> ---
> Makefile.am | 4 ++-
> clients/nested-client.c | 4 ++-
> clients/simple-egl.c | 6 +++-
> clients/subsurfaces.c | 5 ++-
> clients/window.c | 5 ++-
> clients/window.h | 1 +
> shared/platform.h | 79 +++++++++++++++++++++++++++++++++++++++++++++++
> tests/buffer-count-test.c | 9 ++++--
> 8 files changed, 105 insertions(+), 8 deletions(-)
> create mode 100644 shared/platform.h
>
> diff --git a/Makefile.am b/Makefile.am
> index c509f6e..863adb2 100644
> --- a/Makefile.am
> +++ b/Makefile.am
> @@ -74,6 +74,7 @@ weston_SOURCES = \
> shared/matrix.c \
> shared/matrix.h \
> shared/zalloc.h \
> + shared/platform.h \
> src/weston-egl-ext.h
>
> nodist_weston_SOURCES = \
> @@ -166,7 +167,8 @@ westoninclude_HEADERS = \
> src/timeline-object.h \
> shared/matrix.h \
> shared/config-parser.h \
> - shared/zalloc.h
> + shared/zalloc.h \
> + shared/platform.h
>
> if ENABLE_EGL
> module_LTLIBRARIES += gl-renderer.la
> diff --git a/clients/nested-client.c b/clients/nested-client.c
> index 7f237e6..96cf1c8 100644
> --- a/clients/nested-client.c
> +++ b/clients/nested-client.c
> @@ -277,7 +277,9 @@ nested_client_create(void)
> /* get globals */
> wl_display_roundtrip(client->display);
>
> - client->egl_display = eglGetDisplay(client->display);
> + client->egl_display =
> + weston_platform_get_egl_display(EGL_PLATFORM_WAYLAND_KHR,
> + client->display, NULL);
Wouldn't this need to #include shared/platform.h?
Ah, but building the nested demos requires cairo-glesv2, argh. That's
why we don't get a compiler warning or error.
> if (client->egl_display == NULL)
> return NULL;
>
> diff --git a/clients/simple-egl.c b/clients/simple-egl.c
> index 3040caa..33e02e7 100644
> --- a/clients/simple-egl.c
> +++ b/clients/simple-egl.c
> @@ -46,6 +46,8 @@
> #include "protocol/ivi-application-client-protocol.h"
> #define IVI_SURFACE_ID 9000
>
> +#include "../shared/platform.h"
> +
> #ifndef EGL_EXT_swap_buffers_with_damage
> #define EGL_EXT_swap_buffers_with_damage 1
> typedef EGLBoolean (EGLAPIENTRYP PFNEGLSWAPBUFFERSWITHDAMAGEEXTPROC)(EGLDisplay dpy, EGLSurface surface, EGLint *rects, EGLint n_rects);
> @@ -151,7 +153,9 @@ 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);
> + display->egl.dpy =
> + weston_platform_get_egl_display(EGL_PLATFORM_WAYLAND_KHR,
> + display->display, NULL);
> assert(display->egl.dpy);
>
> ret = eglInitialize(display->egl.dpy, &major, &minor);
> diff --git a/clients/subsurfaces.c b/clients/subsurfaces.c
> index fcbe496..5b8fd8d 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"
>
> @@ -215,7 +216,9 @@ egl_state_create(struct wl_display *display)
> egl = calloc(1, sizeof *egl);
> assert(egl);
>
> - egl->dpy = eglGetDisplay(display);
> + egl->dpy =
> + weston_platform_get_egl_display(EGL_PLATFORM_WAYLAND_KHR,
> + display, NULL);
> assert(egl->dpy);
>
> ret = eglInitialize(egl->dpy, &major, &minor);
> diff --git a/clients/window.c b/clients/window.c
> index b84d3b2..2858281 100644
> --- a/clients/window.c
> +++ b/clients/window.c
> @@ -5392,7 +5392,10 @@ init_egl(struct display *d)
> EGLint api = EGL_OPENGL_API;
> #endif
>
> - d->dpy = eglGetDisplay(d->display);
> + d->dpy =
> + weston_platform_get_egl_display(EGL_PLATFORM_WAYLAND_KHR,
> + d->display, NULL);
> +
> if (!eglInitialize(d->dpy, &major, &minor)) {
> fprintf(stderr, "failed to initialize EGL\n");
> return -1;
> diff --git a/clients/window.h b/clients/window.h
> index 5247f19..0686c3f 100644
> --- a/clients/window.h
> +++ b/clients/window.h
> @@ -30,6 +30,7 @@
> #include <cairo.h>
> #include "../shared/config-parser.h"
> #include "../shared/zalloc.h"
> +#include "../shared/platform.h"
platform.h should be protected by #ifdef ENABLE_EGL, I think.
>
> #define ARRAY_LENGTH(a) (sizeof (a) / sizeof (a)[0])
>
> diff --git a/shared/platform.h b/shared/platform.h
> new file mode 100644
> index 0000000..7f847fa
> --- /dev/null
> +++ b/shared/platform.h
> @@ -0,0 +1,79 @@
> +/*
> + * Copyright © 2015 Collabora, Ltd.
> + *
> + * Permission to use, copy, modify, distribute, and sell this software and
> + * its documentation for any purpose is hereby granted without fee, provided
> + * that the above copyright notice appear in all copies and that both that
> + * copyright notice and this permission notice appear in supporting
> + * documentation, and that the name of the copyright holders not be used in
> + * advertising or publicity pertaining to distribution of the software
> + * without specific, written prior permission. The copyright holders make
> + * no representations about the suitability of this software for any
> + * purpose. It is provided "as is" without express or implied warranty.
> + *
> + * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS
> + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
> + * FITNESS, IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY
> + * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER
> + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF
> + * CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
> + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
> + */
> +
> +#ifndef WESTON_PLATFORM_H
> +#define WESTON_PLATFORM_H
> +
> +#include <string.h>
> +
> +#include <EGL/egl.h>
> +#include <EGL/eglext.h>
Apparently this file is allowed to be #included only if ENABLE_EGL. Ok.
> +
> +#ifdef __cplusplus
> +extern "C" {
> +#endif
> +
> +#ifdef EGL_EXT_platform_base
> +static PFNEGLGETPLATFORMDISPLAYEXTPROC get_platform_display_ext = NULL;
> +
> +#ifndef EGL_PLATFORM_WAYLAND_KHR
> +#define EGL_PLATFORM_WAYLAND_KHR 0x31D8
> +#endif
> +#endif /* EGL_EXT_platform_base */
> +
> +static inline void
> +weston_platform_get_egl_proc_addresses(void)
> +{
> +#ifdef EGL_EXT_platform_base
> + if (!get_platform_display_ext) {
> + const char *extensions = eglQueryString(EGL_NO_DISPLAY, EGL_EXTENSIONS);
> +
> + if (strstr(extensions, "EGL_EXT_platform_wayland")
> + || strstr(extensions, "EGL_KHR_platform_wayland")) {
> + get_platform_display_ext =
> + (void *) eglGetProcAddress("eglGetPlatformDisplayEXT");
> + }
> + }
> +#endif
> +}
> +
> +static inline EGLDisplay
> +weston_platform_get_egl_display(EGLenum platform, void *native_display,
> + const EGLint *attrib_list)
> +{
> +#ifdef EGL_EXT_platform_base
> + if (!get_platform_display_ext)
> + weston_platform_get_egl_proc_addresses();
> +
> + if (get_platform_display_ext)
> + return get_platform_display_ext(platform,
> + native_display, attrib_list);
> + else
> +#endif
> + return eglGetDisplay((EGLNativeDisplayType) native_display);
> +}
> +
> +#ifdef __cplusplus
> +}
> +#endif
Here too, with a little fallback definition, we could just drop all
#ifdef EGL_EXT_platform_base.
And since weston_platform_get_egl_display() is only ever called once at
startup (right?), you don't even need the static variable for caching
the vfunc, so this could be simplified a bit.
It is a little surprising to me that a header defines (not just
declares) a (thankfully static) global variable.
Thanks,
pq
> +
> +#endif /* WESTON_PLATFORM_H */
> diff --git a/tests/buffer-count-test.c b/tests/buffer-count-test.c
> index 43fb089..815e1cc 100644
> --- a/tests/buffer-count-test.c
> +++ b/tests/buffer-count-test.c
> @@ -29,6 +29,7 @@
> #include <GLES2/gl2.h>
>
> #include "weston-test-client-helper.h"
> +#include "../shared/platform.h"
>
> #define fail(msg) { fprintf(stderr, "%s failed\n", msg); return -1; }
>
> @@ -66,10 +67,12 @@ init_egl(struct test_data *test_data)
> EGLint major, minor, n;
> EGLBoolean ret;
>
> - test_data->egl_dpy = eglGetDisplay((EGLNativeDisplayType)
> - test_data->client->wl_display);
> + test_data->egl_dpy =
> + weston_platform_get_egl_display(EGL_PLATFORM_WAYLAND_KHR,
> + test_data->client->wl_display,
> + NULL);
> if (!test_data->egl_dpy)
> - fail("eglGetDisplay");
> + fail("eglGetPlatformDisplay or eglGetDisplay");
>
> if (eglInitialize(test_data->egl_dpy, &major, &minor) != EGL_TRUE)
> fail("eglInitialize");
More information about the wayland-devel
mailing list