[PATCH weston 3/4] gl-renderer: use eglCreatePlatformWindowSurfaceEXT to get EGLSurfaces

Jonny Lamb jonny.lamb at collabora.co.uk
Wed Feb 25 04:42:12 PST 2015


---
 src/compositor-drm.c     |  3 ++-
 src/compositor-fbdev.c   |  2 +-
 src/compositor-wayland.c |  1 +
 src/compositor-x11.c     |  5 +++++
 src/gl-renderer.c        | 42 +++++++++++++++++++++++++++++++++++++-----
 src/gl-renderer.h        |  3 ++-
 6 files changed, 48 insertions(+), 8 deletions(-)

diff --git a/src/compositor-drm.c b/src/compositor-drm.c
index e1fe958..892c93a 100644
--- a/src/compositor-drm.c
+++ b/src/compositor-drm.c
@@ -1622,7 +1622,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..411adf3 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 b6fd37d..4f792b1 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 fb8c08c..39dc88e 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 3b74b89..3b96e39 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,22 @@ gl_renderer_output_create(struct weston_output *output,
 	if (go == NULL)
 		return -1;
 
-	go->egl_surface =
-		eglCreateWindowSurface(gr->egl_display,
-				       egl_config,
-				       window, NULL);
+#ifdef EGL_EXT_platform_base
+	if (gr->create_platform_window) {
+		go->egl_surface =
+			gr->create_platform_window(gr->egl_display,
+						   egl_config,
+						   window_for_platform,
+						   NULL);
+	} else {
+#endif
+		go->egl_surface =
+			eglCreateWindowSurface(gr->egl_display,
+					       egl_config,
+					       window_for_legacy, NULL);
+#ifdef EGL_EXT_platform_base
+	}
+#endif
 
 	if (go->egl_surface == EGL_NO_SURFACE) {
 		weston_log("failed to create egl surface\n");
@@ -1947,6 +1964,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 bbf0ac6..c5550d1 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



More information about the wayland-devel mailing list