[cogl/wip/frame-synchronization: 221/223] Switch presentation time to nanoseconds



commit 36bbcb083156926f50c0b3c3e0b42e24f42fdbf7
Author: Owen W. Taylor <otaylor fishsoup net>
Date:   Thu Jan 24 22:43:10 2013 -0500

    Switch presentation time to nanoseconds
    
    In the future, we may want to track frame timings with very high precision
    for profiling purposes, so to be consistent with that, use nanoseconds,
    not microseconds. 63-bits in nanoseconds is 270+ years, so hopefully
    clock_gettime(CLOCK_MONOTONIC,) will fit.

 cogl/cogl-frame-info.h        |    2 +-
 cogl/winsys/cogl-winsys-glx.c |   29 ++++++++++++++---------------
 2 files changed, 15 insertions(+), 16 deletions(-)
---
diff --git a/cogl/cogl-frame-info.h b/cogl/cogl-frame-info.h
index 9ddad0c..08e4df6 100644
--- a/cogl/cogl-frame-info.h
+++ b/cogl/cogl-frame-info.h
@@ -88,7 +88,7 @@ int64_t cogl_frame_info_get_frame_counter (CoglFrameInfo *info);
  * Gets the presentation time for the frame. This is the time at which
  * the frame became visible to the user.
  *
- * The presentation time measured in microseconds is based on a
+ * The presentation time measured in nanoseconds is based on a
  * monotonic time source. The time source is not necessarily
  * correlated with system/wall clock time and may represent the time
  * elapsed since some undefined system event such as when the system
diff --git a/cogl/winsys/cogl-winsys-glx.c b/cogl/winsys/cogl-winsys-glx.c
index 88acd9d..03a2e64 100644
--- a/cogl/winsys/cogl-winsys-glx.c
+++ b/cogl/winsys/cogl-winsys-glx.c
@@ -234,9 +234,9 @@ ensure_ust_type (CoglRenderer *renderer,
 }
 
 static int64_t
-ust_to_monotonic_time (CoglRenderer *renderer,
-                       GLXDrawable   drawable,
-                       int64_t       ust)
+ust_to_nanoseconds (CoglRenderer *renderer,
+                    GLXDrawable drawable,
+                    int64_t ust)
 {
   CoglGLXRenderer *glx_renderer =  renderer->winsys;
 
@@ -257,13 +257,13 @@ ust_to_monotonic_time (CoglRenderer *renderer,
         gettimeofday(&tv, NULL);
         clock_gettime (CLOCK_MONOTONIC, &ts);
         current_system_time = (tv.tv_sec * G_GINT64_CONSTANT (1000000)) + tv.tv_usec;
-        current_monotonic_time = (ts.tv_sec * G_GINT64_CONSTANT (1000000)) +
-          (ts.tv_nsec / G_GINT64_CONSTANT (1000));
+        current_monotonic_time =
+          ts.tv_sec * G_GINT64_CONSTANT (1000000000) + ts.tv_nsec;
 
-        return ust + current_monotonic_time - current_system_time;
+        return current_monotonic_time + 1000 * (ust - current_system_time);
       }
     case COGL_GLX_UST_IS_MONOTONIC_TIME:
-      return ust;
+      return 1000 * ust;
     case COGL_GLX_UST_IS_OTHER:
       /* In this case the scale of UST is undefined so we can't easily
        * scale to nanoseconds.
@@ -320,9 +320,9 @@ notify_swap_buffers (CoglContext *context, GLXBufferSwapComplete *swap_event)
       CoglFrameInfo *info = cogl_onscreen_get_frame_info (onscreen, frame_counter);
 
       info->presentation_time =
-        ust_to_monotonic_time (context->display->renderer,
-                               glx_onscreen->glxwin,
-                               swap_event->ust);
+        ust_to_nanoseconds (context->display->renderer,
+                            glx_onscreen->glxwin,
+                            swap_event->ust);
     }
 
   set_info_complete (onscreen);
@@ -1438,9 +1438,9 @@ _cogl_winsys_wait_for_vblank (CoglOnscreen *onscreen)
           glx_renderer->glXWaitForMsc (xlib_renderer->xdpy, drawable,
                                        0, 2, (msc + 1) % 2,
                                        &ust, &msc, &sbc);
-          info->presentation_time = ust_to_monotonic_time (ctx->display->renderer,
-                                                           drawable,
-                                                           ust);
+          info->presentation_time = ust_to_nanoseconds (ctx->display->renderer,
+                                                        drawable,
+                                                        ust);
         }
       else
         {
@@ -1454,8 +1454,7 @@ _cogl_winsys_wait_for_vblank (CoglOnscreen *onscreen)
 
           clock_gettime (CLOCK_MONOTONIC, &ts);
           info->presentation_time =
-            (ts.tv_sec * G_GINT64_CONSTANT (1000000)) +
-            (ts.tv_nsec / G_GINT64_CONSTANT (1000));
+            ts.tv_sec * G_GINT64_CONSTANT (1000000000) + ts.tv_nsec;
         }
     }
 }



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