From 117d41ba275b280f7c17de94c1c38571bc1d5306 Mon Sep 17 00:00:00 2001 From: "Owen W. Taylor" Date: Mon, 28 Jan 2013 12:22:57 -0500 Subject: Add cogl_get_clock_time() Add an API to get the current time in the time system that Cogl is reporting timestamps. This is to be used to convert timestamps into a different time system. Reviewed-by: Robert Bragg --- cogl/cogl-context.c | 12 ++++++++++++ cogl/cogl-context.h | 23 +++++++++++++++++++++++ cogl/winsys/cogl-winsys-glx.c | 37 +++++++++++++++++++++++++++++++++++++ cogl/winsys/cogl-winsys-private.h | 3 +++ 4 files changed, 75 insertions(+) diff --git a/cogl/cogl-context.c b/cogl/cogl-context.c index 6eab4231..24052c9e 100644 --- a/cogl/cogl-context.c +++ b/cogl/cogl-context.c @@ -676,4 +676,16 @@ _cogl_context_get_gl_version (CoglContext *context) return _cogl_config_override_gl_version; else return (const char *) context->glGetString (GL_VERSION); + +} + +int64_t +cogl_get_clock_time (CoglContext *context) +{ + const CoglWinsysVtable *winsys = _cogl_context_get_winsys (context); + + if (winsys->context_get_clock_time) + return winsys->context_get_clock_time (context); + else + return 0; } diff --git a/cogl/cogl-context.h b/cogl/cogl-context.h index 810e653b..1b6b8782 100644 --- a/cogl/cogl-context.h +++ b/cogl/cogl-context.h @@ -313,6 +313,29 @@ cogl_foreach_feature (CoglContext *context, CoglFeatureCallback callback, void *user_data); +/** + * cogl_get_clock_time: + * @context: a #CoglContext pointer + * + * Returns the current time value from Cogl's internal clock. This + * clock is used for measuring times such as the presentation time + * in a #CoglFrameInfo. + * + * This method is meant for converting timestamps retrieved from Cogl + * to other time systems, and is not meant to be used as a standalone + * timing system. For that reason, if this function is called without + * having retrieved a valid (non-zero) timestamp from Cogl first, it + * may return 0 to indicate that Cogl has no active internal clock. + * + * Return value: the time value for the Cogl clock, in nanoseconds + * from an arbitrary point in time, or 0 if Cogl doesn't have an + * active internal clock. + * Since: 1.14 + * Stability: unstable + */ +int64_t +cogl_get_clock_time (CoglContext *context); + COGL_END_DECLS #endif /* __COGL_CONTEXT_H__ */ diff --git a/cogl/winsys/cogl-winsys-glx.c b/cogl/winsys/cogl-winsys-glx.c index 10f0d9ab..f559f156 100644 --- a/cogl/winsys/cogl-winsys-glx.c +++ b/cogl/winsys/cogl-winsys-glx.c @@ -264,6 +264,42 @@ ust_to_nanoseconds (CoglRenderer *renderer, return 0; } +static int64_t +_cogl_winsys_get_clock_time (CoglContext *context) +{ + CoglGLXRenderer *glx_renderer = context->display->renderer->winsys; + + /* We don't call ensure_ust_type() because we don't have a drawable + * to work with. cogl_get_clock_time() is documented to only work + * once a valid, non-zero, timestamp has been retrieved from Cogl. + */ + + switch (glx_renderer->ust_type) + { + case COGL_GLX_UST_IS_UNKNOWN: + case COGL_GLX_UST_IS_OTHER: + return 0; + case COGL_GLX_UST_IS_GETTIMEOFDAY: + { + struct timeval tv; + + gettimeofday(&tv, NULL); + return tv.tv_sec * G_GINT64_CONSTANT (1000000000) + + tv.tv_usec * G_GINT64_CONSTANT (1000); + } + case COGL_GLX_UST_IS_MONOTONIC_TIME: + { + struct timespec ts; + + clock_gettime (CLOCK_MONOTONIC, &ts); + return ts.tv_sec * G_GINT64_CONSTANT (1000000000) + ts.tv_nsec; + } + } + + g_assert_not_reached(); + return 0; +} + static void set_sync_pending (CoglOnscreen *onscreen) { @@ -2554,6 +2590,7 @@ static CoglWinsysVtable _cogl_winsys_vtable = .display_destroy = _cogl_winsys_display_destroy, .context_init = _cogl_winsys_context_init, .context_deinit = _cogl_winsys_context_deinit, + .context_get_clock_time = _cogl_winsys_get_clock_time, .xlib_get_visual_info = _cogl_winsys_xlib_get_visual_info, .onscreen_init = _cogl_winsys_onscreen_init, .onscreen_deinit = _cogl_winsys_onscreen_deinit, diff --git a/cogl/winsys/cogl-winsys-private.h b/cogl/winsys/cogl-winsys-private.h index fe87e06b..36676e3a 100644 --- a/cogl/winsys/cogl-winsys-private.h +++ b/cogl/winsys/cogl-winsys-private.h @@ -122,6 +122,9 @@ typedef struct _CoglWinsysVtable /* Optional functions */ + int64_t + (*context_get_clock_time) (CoglContext *context); + void (*onscreen_swap_region) (CoglOnscreen *onscreen, const int *rectangles, -- cgit v1.2.1