[PATCH weston 3/4] gl-renderer: use eglCreatePlatformWindowSurfaceEXT to get EGLSurfaces
Derek Foreman
derekf at osg.samsung.com
Mon Feb 23 10:14:51 PST 2015
I'm suddenly unsure what our coding style is regarding typecasts, I'd
thought we didn't put a space between cast and value, but there are
places where we do in the existing code - as well of plenty of examples
with no space.
Anyone have an authoritative answer? :)
(1 more comment below)
On 17/02/15 09:48 AM, Jonny Lamb wrote:
> ---
> src/compositor-drm.c | 3 ++-
> src/compositor-fbdev.c | 2 +-
> src/compositor-wayland.c | 1 +
> src/compositor-x11.c | 5 +++++
> src/gl-renderer.c | 38 +++++++++++++++++++++++++++++++++-----
> src/gl-renderer.h | 3 ++-
> 6 files changed, 44 insertions(+), 8 deletions(-)
>
> diff --git a/src/compositor-drm.c b/src/compositor-drm.c
> index bf3dab8..8d7d7a8 100644
> --- a/src/compositor-drm.c
> +++ b/src/compositor-drm.c
> @@ -1623,7 +1623,8 @@ drm_output_init_egl(struct drm_output *output, struct drm_compositor *ec)
> return -1;
> }
>
> - if (gl_renderer->output_create(&output->base, output->surface,
> + if (gl_renderer->output_create(&output->base,
> + output->surface, output->surface,
> gl_renderer->opaque_attribs,
> &format) < 0) {
> weston_log("failed to create gl renderer output state\n");
> diff --git a/src/compositor-fbdev.c b/src/compositor-fbdev.c
> index 41b43f1..09f7b35 100644
> --- a/src/compositor-fbdev.c
> +++ b/src/compositor-fbdev.c
> @@ -625,7 +625,7 @@ fbdev_output_create(struct fbdev_compositor *compositor,
> } else {
> setenv("HYBRIS_EGLPLATFORM", "wayland", 1);
> if (gl_renderer->output_create(&output->base,
> - (EGLNativeWindowType)NULL,
> + (EGLNativeWindowType) NULL, NULL,
> gl_renderer->opaque_attribs,
> NULL) < 0) {
> weston_log("gl_renderer_output_create failed.\n");
> diff --git a/src/compositor-wayland.c b/src/compositor-wayland.c
> index 850cd4c..5bfb822 100644
> --- a/src/compositor-wayland.c
> +++ b/src/compositor-wayland.c
> @@ -645,6 +645,7 @@ wayland_output_init_gl_renderer(struct wayland_output *output)
>
> if (gl_renderer->output_create(&output->base,
> output->gl.egl_window,
> + output->gl.egl_window,
> gl_renderer->alpha_attribs,
> NULL) < 0)
> goto cleanup_window;
> diff --git a/src/compositor-x11.c b/src/compositor-x11.c
> index ad7f4c3..505a15b 100644
> --- a/src/compositor-x11.c
> +++ b/src/compositor-x11.c
> @@ -904,8 +904,13 @@ x11_compositor_create_output(struct x11_compositor *c, int x, int y,
> return NULL;
> }
> } else {
> + /* eglCreatePlatformWindowSurfaceEXT takes a Window*
> + * but eglCreateWindowSurface takes a Window. */
> + Window xid = (Window) output->window;
> +
> ret = gl_renderer->output_create(&output->base,
> (EGLNativeWindowType) output->window,
> + &xid,
> gl_renderer->opaque_attribs,
> NULL);
> if (ret < 0)
> diff --git a/src/gl-renderer.c b/src/gl-renderer.c
> index 279028b..aae1812 100644
> --- a/src/gl-renderer.c
> +++ b/src/gl-renderer.c
> @@ -136,6 +136,10 @@ struct gl_renderer {
> PFNEGLSWAPBUFFERSWITHDAMAGEEXTPROC swap_buffers_with_damage;
> #endif
>
> +#ifdef EGL_EXT_platform_base
> + PFNEGLCREATEPLATFORMWINDOWSURFACEEXTPROC create_platform_window;
> +#endif
> +
> int has_unpack_subimage;
>
> PFNEGLBINDWAYLANDDISPLAYWL bind_display;
> @@ -1797,7 +1801,8 @@ gl_renderer_setup(struct weston_compositor *ec, EGLSurface egl_surface);
>
> static int
> gl_renderer_output_create(struct weston_output *output,
> - EGLNativeWindowType window,
> + EGLNativeWindowType window_for_legacy,
> + void *window_for_platform,
> const EGLint *attribs,
> const EGLint *visual_id)
> {
> @@ -1824,10 +1829,18 @@ gl_renderer_output_create(struct weston_output *output,
> if (go == NULL)
> return -1;
>
> - go->egl_surface =
> - eglCreateWindowSurface(gr->egl_display,
> - egl_config,
> - window, NULL);
> + if (gr->create_platform_window) {
I think create_platform_window won't exist if EGL_EXT_platform_base
didn't, and this will fail to compile?
> + go->egl_surface =
> + gr->create_platform_window(gr->egl_display,
> + egl_config,
> + window_for_platform,
> + NULL);
> + } else {
> + go->egl_surface =
> + eglCreateWindowSurface(gr->egl_display,
> + egl_config,
> + window_for_legacy, NULL);
> + }
>
> if (go->egl_surface == EGL_NO_SURFACE) {
> weston_log("failed to create egl surface\n");
> @@ -1947,6 +1960,21 @@ gl_renderer_setup_egl_extensions(struct weston_compositor *ec)
> "supported. Performance could be affected.\n");
> #endif
>
> +#ifdef EGL_EXT_platform_base
> + extensions =
> + (const char *) eglQueryString(EGL_NO_DISPLAY, EGL_EXTENSIONS);
> + if (!extensions) {
> + weston_log("Retrieving EGL client extension string failed.\n");
> + return -1;
> + }
> +
> + if (strstr(extensions, "EGL_EXT_platform_base"))
> + gr->create_platform_window =
> + (void *) eglGetProcAddress("eglCreatePlatformWindowSurfaceEXT");
> + else
> + weston_log("warning: EGL_EXT_platform_base not supported.\n");
> +#endif
> +
> #ifdef EGL_MESA_configless_context
> if (strstr(extensions, "EGL_MESA_configless_context"))
> gr->has_configless_context = 1;
> diff --git a/src/gl-renderer.h b/src/gl-renderer.h
> index 96b3cd5..b8c83c9 100644
> --- a/src/gl-renderer.h
> +++ b/src/gl-renderer.h
> @@ -62,7 +62,8 @@ struct gl_renderer_interface {
> EGLDisplay (*display)(struct weston_compositor *ec);
>
> int (*output_create)(struct weston_output *output,
> - EGLNativeWindowType window,
> + EGLNativeWindowType window_for_legacy,
> + void *window_for_platform,
> const EGLint *attribs,
> const EGLint *visual_id);
>
>
More information about the wayland-devel
mailing list