[cogl/wip/frame-synchronization: 218/223] Add cogl_frame_info_get_output()



commit 5cc26c82555e01ca7370772b73b93ca00772c37a
Author: Owen W. Taylor <otaylor fishsoup net>
Date:   Thu Jan 24 17:38:38 2013 -0500

    Add cogl_frame_info_get_output()
    
    If available from the windowing system, it could potentially be useful
    to know something other than the refresh rate of the output that the
    monitor is currently presenting on. (Note however, an onscreen may span
    multiple outputs. The windowing system has to pick *one* for timing,
    but most other attibutes of the window will apply to the parts of the
    onscreen on that output.)

 cogl/cogl-frame-info-private.h |    2 ++
 cogl/cogl-frame-info.c         |    6 ++++++
 cogl/cogl-frame-info.h         |   21 +++++++++++++++++++++
 cogl/winsys/cogl-winsys-glx.c  |   34 ++++++++++++++++++++--------------
 4 files changed, 49 insertions(+), 14 deletions(-)
---
diff --git a/cogl/cogl-frame-info-private.h b/cogl/cogl-frame-info-private.h
index 12073e4..ef24d54 100644
--- a/cogl/cogl-frame-info-private.h
+++ b/cogl/cogl-frame-info-private.h
@@ -36,6 +36,8 @@ struct _CoglFrameInfo
   int64_t presentation_time;
   float refresh_rate;
 
+  CoglOutput *output;
+
   unsigned int complete : 1;
 };
 
diff --git a/cogl/cogl-frame-info.c b/cogl/cogl-frame-info.c
index a13eba0..bb4059f 100644
--- a/cogl/cogl-frame-info.c
+++ b/cogl/cogl-frame-info.c
@@ -76,3 +76,9 @@ cogl_frame_info_get_refresh_rate (CoglFrameInfo *info)
 {
   return info->refresh_rate;
 }
+
+CoglOutput *
+cogl_frame_info_get_output (CoglFrameInfo *info)
+{
+  return info->output;
+}
diff --git a/cogl/cogl-frame-info.h b/cogl/cogl-frame-info.h
index 75c0148..64dabc5 100644
--- a/cogl/cogl-frame-info.h
+++ b/cogl/cogl-frame-info.h
@@ -32,6 +32,7 @@
 #define __COGL_FRAME_INFO_H
 
 #include <cogl/cogl-types.h>
+#include <cogl/cogl-output.h>
 #include <glib.h>
 
 G_BEGIN_DECLS
@@ -117,12 +118,32 @@ int64_t cogl_frame_info_get_presentation_time (CoglFrameInfo *info);
  * Gets the refresh rate in Hertz for the output that the frame was on
  * at the time the frame was presented.
  *
+ * <note>Some platforms can't associate a #CoglOutput with a
+ * #CoglFrameInfo object but are able to report a refresh rate via
+ * this api. Therefore if you need this information then this api is
+ * more reliable than using cogl_frame_info_get_output() followed by
+ * cogl_output_get_refresh_rate().</note>
+ *
  * Return value: the refresh rate in Hertz
  * Since: 2.0
  * Stability: unstable
  */
 int64_t cogl_frame_info_get_refresh_rate (CoglFrameInfo *info);
 
+/**
+ * cogl_frame_info_get_output:
+ * @info: a #CoglFrameInfo object
+ *
+ * Gets the #CoglOutput that the swapped frame was presented to.
+ *
+ * Return value: The #CoglOutput that the frame was presented to, or
+ *               %NULL if this could not be determined.
+ * Since: 2.0
+ * Stability: unstable
+ */
+CoglOutput *
+cogl_frame_info_get_output (CoglFrameInfo *info);
+
 G_END_DECLS
 
 #endif /* __COGL_FRAME_INFO_H */
diff --git a/cogl/winsys/cogl-winsys-glx.c b/cogl/winsys/cogl-winsys-glx.c
index 46e71e0..fff6dfe 100644
--- a/cogl/winsys/cogl-winsys-glx.c
+++ b/cogl/winsys/cogl-winsys-glx.c
@@ -1464,15 +1464,19 @@ _cogl_winsys_get_vsync_counter (CoglContext *ctx)
 }
 
 static void
-set_refresh_rate_from_output (CoglOnscreen *onscreen,
-                              CoglOutput *output)
+set_frame_info_output (CoglOnscreen *onscreen,
+                       CoglOutput *output)
 {
-  float refresh_rate = cogl_output_get_refresh_rate (output);
-  if (refresh_rate != 0.0)
+  int64_t frame_counter = cogl_onscreen_get_frame_counter (onscreen);
+  CoglFrameInfo *info = cogl_onscreen_get_frame_info (onscreen, frame_counter);
+
+  info->output = output;
+
+  if (output)
     {
-      int64_t frame_counter = cogl_onscreen_get_frame_counter (onscreen);
-      CoglFrameInfo *info = cogl_onscreen_get_frame_info (onscreen, frame_counter);
-      info->refresh_rate = refresh_rate;
+      float refresh_rate = cogl_output_get_refresh_rate (output);
+      if (refresh_rate != 0.0)
+        info->refresh_rate = refresh_rate;
     }
 }
 
@@ -1669,11 +1673,14 @@ _cogl_winsys_onscreen_swap_region (CoglOnscreen *onscreen,
       y_min = CLAMP (y_min, 0, framebuffer_width);
       y_max = CLAMP (y_max, 0, framebuffer_height);
 
-      output = _cogl_xlib_renderer_output_for_rectangle (context->display->renderer,
-                                                         xlib_onscreen->x + x_min, xlib_onscreen->y + y_min,
-                                                         x_max - x_min, y_max - y_min);
-      if (output)
-        set_refresh_rate_from_output (onscreen, output);
+      output =
+        _cogl_xlib_renderer_output_for_rectangle (context->display->renderer,
+                                                  xlib_onscreen->x + x_min,
+                                                  xlib_onscreen->y + y_min,
+                                                  x_max - x_min,
+                                                  y_max - y_min);
+
+      set_frame_info_output (onscreen, output);
     }
 
   set_info_complete (onscreen);
@@ -1757,8 +1764,7 @@ _cogl_winsys_onscreen_swap_buffers (CoglOnscreen *onscreen)
     glx_onscreen->last_swap_vsync_counter =
       _cogl_winsys_get_vsync_counter (context);
 
-  if (xlib_onscreen->output)
-    set_refresh_rate_from_output (onscreen, xlib_onscreen->output);
+  set_frame_info_output (onscreen, xlib_onscreen->output);
 
   if (!(glx_renderer->glXSwapInterval &&
         _cogl_winsys_has_feature (COGL_WINSYS_FEATURE_VBLANK_WAIT)))



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