[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