---
 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) {
+               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);
 
-- 
2.1.4

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

Reply via email to