[PATCH weston] simple-egl: Do not set EGL up until XDG setup is complete

Miguel A. Vico mvicomoya at nvidia.com
Tue Nov 15 04:49:30 UTC 2016


There is nothing that prohibits the underlying EGL_PLATFORM_WAYLAND
implementation to attach a buffer or commit surfaces right after the
Wayland EGLSurface has been created.

Since XDG Shell v6 imposes that no buffer attachments or surface commits
must be done before a configure is complete, Wayland clients shouldn't
start setting EGL up until XDG setup is complete.

Related bug:

    https://bugs.freedesktop.org/show_bug.cgi?id=98731

Signed-off-by: Miguel A Vico Moya <mvicomoya at nvidia.com>
---
 clients/simple-egl.c | 65 +++++++++++++++++++++++++++-------------------------
 1 file changed, 34 insertions(+), 31 deletions(-)

diff --git a/clients/simple-egl.c b/clients/simple-egl.c
index 9d401f9..b3d1b79 100644
--- a/clients/simple-egl.c
+++ b/clients/simple-egl.c
@@ -200,11 +200,31 @@ init_egl(struct display *display, struct window *window)
 	if (display->swap_buffers_with_damage)
 		printf("has EGL_EXT_buffer_age and EGL_EXT_swap_buffers_with_damage\n");
 
+	window->egl_surface =
+		weston_platform_create_egl_surface(display->egl.dpy,
+						   display->egl.conf,
+						   window->native, NULL);
+
+	ret = eglMakeCurrent(window->display->egl.dpy, window->egl_surface,
+			     window->egl_surface, window->display->egl.ctx);
+	assert(ret == EGL_TRUE);
+
+	if (!window->frame_sync)
+		eglSwapInterval(display->egl.dpy, 0);
+
 }
 
 static void
-fini_egl(struct display *display)
+fini_egl(struct display *display, struct window *window)
 {
+	/* Required, otherwise segfault in egl_dri2.c: dri2_make_current()
+	 * on eglReleaseThread(). */
+	eglMakeCurrent(window->display->egl.dpy, EGL_NO_SURFACE, EGL_NO_SURFACE,
+		       EGL_NO_CONTEXT);
+
+	eglDestroySurface(window->display->egl.dpy, window->egl_surface);
+	wl_egl_window_destroy(window->native);
+
 	eglTerminate(display->egl.dpy);
 	eglReleaseThread();
 }
@@ -339,7 +359,8 @@ handle_ivi_surface_configure(void *data, struct ivi_surface *ivi_surface,
 {
 	struct window *window = data;
 
-	wl_egl_window_resize(window->native, width, height, 0, 0);
+	if (window->native)
+		wl_egl_window_resize(window->native, width, height, 0, 0);
 
 	window->geometry.width = width;
 	window->geometry.height = height;
@@ -392,7 +413,6 @@ static void
 create_surface(struct window *window)
 {
 	struct display *display = window->display;
-	EGLBoolean ret;
 
 	window->surface = wl_compositor_create_surface(display->compositor);
 
@@ -400,10 +420,6 @@ create_surface(struct window *window)
 		wl_egl_window_create(window->surface,
 				     window->geometry.width,
 				     window->geometry.height);
-	window->egl_surface =
-		weston_platform_create_egl_surface(display->egl.dpy,
-						   display->egl.conf,
-						   window->native, NULL);
 
 
 	if (display->shell) {
@@ -414,13 +430,6 @@ create_surface(struct window *window)
 		assert(0);
 	}
 
-	ret = eglMakeCurrent(window->display->egl.dpy, window->egl_surface,
-			     window->egl_surface, window->display->egl.ctx);
-	assert(ret == EGL_TRUE);
-
-	if (!window->frame_sync)
-		eglSwapInterval(display->egl.dpy, 0);
-
 	if (!display->shell)
 		return;
 
@@ -431,14 +440,6 @@ create_surface(struct window *window)
 static void
 destroy_surface(struct window *window)
 {
-	/* Required, otherwise segfault in egl_dri2.c: dri2_make_current()
-	 * on eglReleaseThread(). */
-	eglMakeCurrent(window->display->egl.dpy, EGL_NO_SURFACE, EGL_NO_SURFACE,
-		       EGL_NO_CONTEXT);
-
-	eglDestroySurface(window->display->egl.dpy, window->egl_surface);
-	wl_egl_window_destroy(window->native);
-
 	if (window->xdg_toplevel)
 		zxdg_toplevel_v6_destroy(window->xdg_toplevel);
 	if (window->xdg_surface)
@@ -873,9 +874,7 @@ main(int argc, char **argv)
 
 	wl_display_roundtrip(display.display);
 
-	init_egl(&display, &window);
 	create_surface(&window);
-	init_gl(&window);
 
 	display.cursor_surface =
 		wl_compositor_create_surface(display.compositor);
@@ -885,23 +884,27 @@ main(int argc, char **argv)
 	sigint.sa_flags = SA_RESETHAND;
 	sigaction(SIGINT, &sigint, NULL);
 
+	/* We must assure XDG setup is complete before setting EGL up */
+	while (running && window.wait_for_configure) {
+		wl_display_dispatch(display.display);
+	}
+
+	init_egl(&display, &window);
+	init_gl(&window);
+
 	/* The mainloop here is a little subtle.  Redrawing will cause
 	 * EGL to read events so we can just call
 	 * wl_display_dispatch_pending() to handle any events that got
 	 * queued up as a side effect. */
 	while (running && ret != -1) {
-		if (window.wait_for_configure) {
-			wl_display_dispatch(display.display);
-		} else {
-			wl_display_dispatch_pending(display.display);
-			redraw(&window, NULL, 0);
-		}
+		wl_display_dispatch_pending(display.display);
+		redraw(&window, NULL, 0);
 	}
 
 	fprintf(stderr, "simple-egl exiting\n");
 
+	fini_egl(&display, &window);
 	destroy_surface(&window);
-	fini_egl(&display);
 
 	wl_surface_destroy(display.cursor_surface);
 	if (display.cursor_theme)
-- 
2.10.0



More information about the wayland-devel mailing list