[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