On Fri, 20 Mar 2015 15:26:51 +0100
Jonny Lamb <[email protected]> wrote:

> Reviewed-by: Derek Foreman <[email protected]>
> Reviewed-by: Bryce Harrington <[email protected]>
> ---
>  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");

_______________________________________________
wayland-devel mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/wayland-devel

Reply via email to