[gtk+/wip/frame-synchronization: 27/33] GdkWindowX11: Communicate gdk_frame_timings_get_slept_before() to the compositor



commit 7c6dbe9e7d3fc51d79659b61186755d7971019ef
Author: Owen W. Taylor <otaylor fishsoup net>
Date:   Wed Nov 14 16:50:05 2012 -0500

    GdkWindowX11: Communicate gdk_frame_timings_get_slept_before() to the compositor
    
    We want the compositor to do different things for frames where
    "slept before" is TRUE. Communicate to the compositor that
    frame is a no-delay frame (slept_before=FALSE) by ending the frame
    by increasing the counter value by 1, and that the frame is a
    normal frame (slept_before=TRUE) by increasing the counter value
    by 3.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=685460

 gdk/x11/gdkwindow-x11.c |   33 +++++++++++++++++++++++----------
 1 files changed, 23 insertions(+), 10 deletions(-)
---
diff --git a/gdk/x11/gdkwindow-x11.c b/gdk/x11/gdkwindow-x11.c
index ecbc179..c715437 100644
--- a/gdk/x11/gdkwindow-x11.c
+++ b/gdk/x11/gdkwindow-x11.c
@@ -297,6 +297,10 @@ gdk_x11_window_begin_frame (GdkWindow *window)
 static void
 gdk_x11_window_end_frame (GdkWindow *window)
 {
+  GdkPaintClock *clock;
+  GdkFrameHistory *history;
+  gint64 frame_counter;
+  GdkFrameTimings *timings;
   GdkWindowImplX11 *impl;
 
   g_return_if_fail (GDK_IS_WINDOW (window));
@@ -308,11 +312,24 @@ gdk_x11_window_end_frame (GdkWindow *window)
       !impl->toplevel->in_frame)
     return;
 
+  clock = gdk_window_get_paint_clock (window);
+  history = gdk_paint_clock_get_history (clock);
+  frame_counter = gdk_frame_history_get_frame_counter (history);
+  timings = gdk_frame_history_get_timings (history, frame_counter);
+
   impl->toplevel->in_frame = FALSE;
 
   if (impl->toplevel->current_counter_value % 2 == 1)
     {
-      impl->toplevel->current_counter_value += 1;
+      /* An increment of 3 means that the frame was not drawn as fast as possible,
+       * but rather at a particular time. This can trigger different handling from
+       * the compositor.
+       */
+      if (gdk_frame_timings_get_slept_before (timings))
+        impl->toplevel->current_counter_value += 3;
+      else
+        impl->toplevel->current_counter_value += 1;
+
       set_sync_counter(GDK_WINDOW_XDISPLAY (impl->wrapper),
 		       impl->toplevel->extended_update_counter,
 		       impl->toplevel->current_counter_value);
@@ -322,10 +339,15 @@ gdk_x11_window_end_frame (GdkWindow *window)
         {
           impl->toplevel->frame_pending = TRUE;
           gdk_paint_clock_freeze (gdk_window_get_paint_clock (window));
+          gdk_frame_timings_set_cookie (timings,
+                                        impl->toplevel->current_counter_value);
         }
     }
 
   unhook_surface_changed (window);
+
+  if (!impl->toplevel->frame_pending)
+    gdk_frame_timings_set_complete (timings, TRUE);
 }
 
 /*****************************************************
@@ -852,17 +874,8 @@ static void
 on_paint_clock_after_paint (GdkPaintClock *clock,
                             GdkWindow     *window)
 {
-  GdkToplevelX11 *toplevel = _gdk_x11_window_get_toplevel (window);
-  GdkFrameHistory *history = gdk_paint_clock_get_history (clock);
-  gint64 frame_counter = gdk_frame_history_get_frame_counter (history);
-  GdkFrameTimings *timings = gdk_frame_history_get_timings (history, frame_counter);
-
   gdk_x11_window_end_frame (window);
 
-  if (toplevel->frame_pending)
-    gdk_frame_timings_set_cookie (timings, toplevel->current_counter_value);
-  else
-    gdk_frame_timings_set_complete (timings, TRUE);
 }
 
 void



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]