x11: Make the frame clock work in GL and Vulkan
authorBenjamin Otte <otte@redhat.com>
Fri, 30 Mar 2018 08:43:26 +0000 (10:43 +0200)
committerBenjamin Otte <otte@redhat.com>
Fri, 30 Mar 2018 14:50:28 +0000 (16:50 +0200)
gdk/x11/gdkglcontext-x11.c
gdk/x11/gdksurface-x11.c
gdk/x11/gdksurface-x11.h
gdk/x11/gdkvulkancontext-x11.c

index c5f104fde5b17ab7f6c62af9b6f6a838a2812baa..8eca015b1c4b40033a1fa1100b47174bdbdbced7 100644 (file)
@@ -182,6 +182,8 @@ gdk_x11_gl_context_end_frame (GdkDrawContext *draw_context,
         }
     }
 
+  gdk_x11_surface_pre_damage (surface);
+
   glXSwapBuffers (dpy, drawable);
 
   if (context_x11->do_frame_sync && info != NULL && display_x11->has_glx_video_sync)
index 54a101eb914afef442fc284734d18b981910777c..29385afb7ead9a0c9a4b72fbf87ae8cf518ead89 100644 (file)
@@ -229,8 +229,8 @@ set_sync_counter(Display     *display,
     XSyncSetCounter (display, counter, sync_value);
 }
 
-static void
-surface_pre_damage (GdkSurface *surface)
+void
+gdk_x11_surface_pre_damage (GdkSurface *surface)
 {
   GdkSurface *toplevel_surface = gdk_surface_get_toplevel (surface);
   GdkSurfaceImplX11 *impl;
@@ -257,7 +257,7 @@ on_surface_changed (void *data)
   GdkSurfaceImplX11 *impl = GDK_SURFACE_IMPL_X11 (surface->impl);
 
   if (impl->tracking_damage)
-    surface_pre_damage (surface);
+    gdk_x11_surface_pre_damage (surface);
 }
 
 /* We want to know when cairo drawing causes damage to the window,
@@ -372,14 +372,14 @@ gdk_x11_surface_begin_frame (GdkSurface *surface,
 
       impl->toplevel->configure_counter_value = 0;
 
-      surface_pre_damage (surface);
+      gdk_x11_surface_pre_damage (surface);
     }
   else if (force_frame)
     {
       /* When mapping the surface, we really want to freeze the
          rendering of the surface by the compositor until we've
          actually painted something into the surface's buffer. */
-      surface_pre_damage (surface);
+      gdk_x11_surface_pre_damage (surface);
     }
   else
     {
@@ -1511,7 +1511,7 @@ surface_x11_resize (GdkSurface *surface,
   if (height < 1)
     height = 1;
 
-  surface_pre_damage (surface);
+  gdk_x11_surface_pre_damage (surface);
 
   XResizeWindow (GDK_SURFACE_XDISPLAY (surface),
                  GDK_SURFACE_XID (surface),
@@ -1547,7 +1547,7 @@ surface_x11_move_resize (GdkSurface *surface,
   if (height < 1)
     height = 1;
 
-  surface_pre_damage (surface);
+  gdk_x11_surface_pre_damage (surface);
 
   XMoveResizeWindow (GDK_SURFACE_XDISPLAY (surface),
                      GDK_SURFACE_XID (surface),
index 1beda132d8e024212e338d79b8b4aa07d7c8430b..07c67d6666e6d5b3f4f85533185aefd875f2c35a 100644 (file)
@@ -194,6 +194,8 @@ void            _gdk_x11_surface_update_size         (GdkSurfaceImplX11 *impl);
 void            _gdk_x11_surface_set_surface_scale   (GdkSurface *window,
                                                       int        scale);
 
+void            gdk_x11_surface_pre_damage           (GdkSurface *surface);
+
 G_END_DECLS
 
 #endif /* __GDK_SURFACE_X11_H__ */
index c59dbe3dec807f61e96ecc39d24dc59cba86c038..733acd93b648ceb07a58b560a2706271c6591b18 100644 (file)
@@ -58,10 +58,25 @@ gdk_x11_vulkan_context_create_surface (GdkVulkanContext *context,
                                                surface);
 }
 
+static void
+gdk_x11_vulkan_context_end_frame (GdkDrawContext *context,
+                                  cairo_region_t *painted,
+                                  cairo_region_t *damage)
+{
+  GdkSurface *surface = gdk_draw_context_get_surface (context);
+
+  gdk_x11_surface_pre_damage (surface);
+
+  GDK_DRAW_CONTEXT_CLASS (gdk_x11_vulkan_context_parent_class)->end_frame (context, painted, damage);
+}
+
 static void
 gdk_x11_vulkan_context_class_init (GdkX11VulkanContextClass *klass)
 {
   GdkVulkanContextClass *context_class = GDK_VULKAN_CONTEXT_CLASS (klass);
+  GdkDrawContextClass *draw_context_class = GDK_DRAW_CONTEXT_CLASS (klass);
+
+  draw_context_class->end_frame = gdk_x11_vulkan_context_end_frame;
 
   context_class->create_surface = gdk_x11_vulkan_context_create_surface;
 }