wayland/glcontext: Sync surface state before swapping buffers
authorJonas Ådahl <jadahl@gmail.com>
Wed, 21 Mar 2018 06:01:58 +0000 (14:01 +0800)
committerJonas Ådahl <jadahl@gmail.com>
Wed, 21 Mar 2018 06:14:20 +0000 (14:14 +0800)
A side effect of eglSwapBuffers* is the EGL implementation calling
wl_surface_commit() on the corresponding Wayland surface. Thus, before
swapping buffers, we must synchronize the surface state (e.g. opaque
region, window geometry, etc) that changed since the last buffer swap.
Prior to this commit, this was done after eglSwapBuffers*, causing the
surface state to always correspond to the previous buffer state. As of
this commit this is now done before swapping the buffers, thus before
wl_surface_commit().

gdk/wayland/gdkglcontext-wayland.c

index 1e6f2ca28abec9ea3a17bb62cabfd801a7290ea0..700baa02d658ac021f1fa74c2047671c87fdade5 100644 (file)
@@ -223,6 +223,8 @@ gdk_wayland_gl_context_end_frame (GdkDrawContext *draw_context,
   egl_surface = gdk_wayland_surface_get_egl_surface (surface->impl_surface,
                                                     context_wayland->egl_config);
 
+  gdk_wayland_surface_sync (surface);
+
   if (display_wayland->have_egl_swap_buffers_with_damage && damage != NULL)
     {
       int i, j, n_rects = cairo_region_num_rectangles (damage);
@@ -243,8 +245,6 @@ gdk_wayland_gl_context_end_frame (GdkDrawContext *draw_context,
     }
   else
     eglSwapBuffers (display_wayland->egl_display, egl_surface);
-
-  gdk_wayland_surface_sync (surface);
 }
 
 static void