1
0
Fork 0

cogl: Report presentation time in microseconds

KMS and GLX device timestamps have microsecond precision, and whenever
we sample the time ourselves it's not the real presentation time anyway,
so nanosecond precision for that case is unnecessary.

The presentation timestamp in ClutterFrameInfo is in microseconds, too,
so this commit makes them have the same precision.

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1484>
This commit is contained in:
Ivan Molodetskikh 2021-01-28 10:18:27 +03:00 committed by Marge Bot
parent 9f53b691c4
commit d8606829c4
6 changed files with 36 additions and 33 deletions

View file

@ -835,7 +835,7 @@ frame_cb (CoglOnscreen *onscreen,
.frame_counter = cogl_frame_info_get_global_frame_counter (frame_info), .frame_counter = cogl_frame_info_get_global_frame_counter (frame_info),
.refresh_rate = cogl_frame_info_get_refresh_rate (frame_info), .refresh_rate = cogl_frame_info_get_refresh_rate (frame_info),
.presentation_time = .presentation_time =
ns2us (cogl_frame_info_get_presentation_time (frame_info)), cogl_frame_info_get_presentation_time_us (frame_info),
.flags = flags, .flags = flags,
}; };
clutter_stage_view_notify_presented (view, &clutter_frame_info); clutter_stage_view_notify_presented (view, &clutter_frame_info);

View file

@ -47,7 +47,7 @@ struct _CoglFrameInfo
CoglObject _parent; CoglObject _parent;
int64_t frame_counter; int64_t frame_counter;
int64_t presentation_time; int64_t presentation_time_us;
float refresh_rate; float refresh_rate;
int64_t global_frame_counter; int64_t global_frame_counter;

View file

@ -62,11 +62,11 @@ cogl_frame_info_get_frame_counter (CoglFrameInfo *info)
} }
int64_t int64_t
cogl_frame_info_get_presentation_time (CoglFrameInfo *info) cogl_frame_info_get_presentation_time_us (CoglFrameInfo *info)
{ {
g_warn_if_fail (!(info->flags & COGL_FRAME_INFO_FLAG_SYMBOLIC)); g_warn_if_fail (!(info->flags & COGL_FRAME_INFO_FLAG_SYMBOLIC));
return info->presentation_time; return info->presentation_time_us;
} }
float float

View file

@ -90,13 +90,13 @@ COGL_EXPORT
int64_t cogl_frame_info_get_frame_counter (CoglFrameInfo *info); int64_t cogl_frame_info_get_frame_counter (CoglFrameInfo *info);
/** /**
* cogl_frame_info_get_presentation_time: * cogl_frame_info_get_presentation_time_us:
* @info: a #CoglFrameInfo object * @info: a #CoglFrameInfo object
* *
* Gets the presentation time for the frame. This is the time at which * Gets the presentation time for the frame. This is the time at which
* the frame became visible to the user. * the frame became visible to the user.
* *
* The presentation time measured in nanoseconds, is based on * The presentation time measured in microseconds, is based on
* cogl_get_clock_time(). * cogl_get_clock_time().
* *
* <note>Linux kernel version less that 3.8 can result in * <note>Linux kernel version less that 3.8 can result in
@ -109,7 +109,7 @@ int64_t cogl_frame_info_get_frame_counter (CoglFrameInfo *info);
* Stability: unstable * Stability: unstable
*/ */
COGL_EXPORT COGL_EXPORT
int64_t cogl_frame_info_get_presentation_time (CoglFrameInfo *info); int64_t cogl_frame_info_get_presentation_time_us (CoglFrameInfo *info);
/** /**
* cogl_frame_info_get_refresh_rate: * cogl_frame_info_get_refresh_rate:

View file

@ -421,11 +421,11 @@ ensure_ust_type (CoglRenderer *renderer,
} }
static int64_t static int64_t
ust_to_nanoseconds (CoglRenderer *renderer, ust_to_microseconds (CoglRenderer *renderer,
GLXDrawable drawable, GLXDrawable drawable,
int64_t ust) int64_t ust)
{ {
CoglGLXRenderer *glx_renderer = renderer->winsys; CoglGLXRenderer *glx_renderer = renderer->winsys;
ensure_ust_type (renderer, drawable); ensure_ust_type (renderer, drawable);
@ -436,10 +436,10 @@ ust_to_nanoseconds (CoglRenderer *renderer,
break; break;
case COGL_GLX_UST_IS_GETTIMEOFDAY: case COGL_GLX_UST_IS_GETTIMEOFDAY:
case COGL_GLX_UST_IS_MONOTONIC_TIME: case COGL_GLX_UST_IS_MONOTONIC_TIME:
return 1000 * ust; return ust;
case COGL_GLX_UST_IS_OTHER: case COGL_GLX_UST_IS_OTHER:
/* In this case the scale of UST is undefined so we can't easily /* In this case the scale of UST is undefined so we can't easily
* scale to nanoseconds. * scale to microseconds.
* *
* For example the driver may be reporting the rdtsc CPU counter * For example the driver may be reporting the rdtsc CPU counter
* as UST values and so the scale would need to be determined * as UST values and so the scale would need to be determined
@ -482,9 +482,9 @@ _cogl_winsys_wait_for_vblank (CoglOnscreen *onscreen)
glx_renderer->glXWaitForMsc (xlib_renderer->xdpy, drawable, glx_renderer->glXWaitForMsc (xlib_renderer->xdpy, drawable,
0, 1, 0, 0, 1, 0,
&ust, &msc, &sbc); &ust, &msc, &sbc);
info->presentation_time = ust_to_nanoseconds (ctx->display->renderer, info->presentation_time_us = ust_to_microseconds (ctx->display->renderer,
drawable, drawable,
ust); ust);
info->flags |= COGL_FRAME_INFO_FLAG_HW_CLOCK; info->flags |= COGL_FRAME_INFO_FLAG_HW_CLOCK;
} }
else else
@ -496,7 +496,7 @@ _cogl_winsys_wait_for_vblank (CoglOnscreen *onscreen)
(current_count + 1) % 2, (current_count + 1) % 2,
&current_count); &current_count);
info->presentation_time = get_monotonic_time_ns (); info->presentation_time_us = g_get_monotonic_time ();
} }
} }
} }
@ -975,10 +975,10 @@ cogl_onscreen_glx_notify_swap_buffers (CoglOnscreen *onscreen,
CoglFrameInfo *info; CoglFrameInfo *info;
info = cogl_onscreen_peek_head_frame_info (onscreen); info = cogl_onscreen_peek_head_frame_info (onscreen);
info->presentation_time = info->presentation_time_us =
ust_to_nanoseconds (context->display->renderer, ust_to_microseconds (context->display->renderer,
onscreen_glx->glxwin, onscreen_glx->glxwin,
swap_event->ust); swap_event->ust);
info->flags |= COGL_FRAME_INFO_FLAG_HW_CLOCK; info->flags |= COGL_FRAME_INFO_FLAG_HW_CLOCK;
} }

View file

@ -169,7 +169,7 @@ meta_onscreen_native_swap_drm_fb (CoglOnscreen *onscreen)
static void static void
maybe_update_frame_info (MetaCrtc *crtc, maybe_update_frame_info (MetaCrtc *crtc,
CoglFrameInfo *frame_info, CoglFrameInfo *frame_info,
int64_t time_ns, int64_t time_us,
CoglFrameInfoFlag flags) CoglFrameInfoFlag flags)
{ {
const MetaCrtcConfig *crtc_config; const MetaCrtcConfig *crtc_config;
@ -186,7 +186,7 @@ maybe_update_frame_info (MetaCrtc *crtc,
refresh_rate = crtc_mode_info->refresh_rate; refresh_rate = crtc_mode_info->refresh_rate;
if (refresh_rate >= frame_info->refresh_rate) if (refresh_rate >= frame_info->refresh_rate)
{ {
frame_info->presentation_time = time_ns; frame_info->presentation_time_us = time_us;
frame_info->refresh_rate = refresh_rate; frame_info->refresh_rate = refresh_rate;
frame_info->flags |= flags; frame_info->flags |= flags;
} }
@ -209,7 +209,7 @@ meta_onscreen_native_notify_frame_complete (CoglOnscreen *onscreen)
static void static void
notify_view_crtc_presented (MetaRendererView *view, notify_view_crtc_presented (MetaRendererView *view,
MetaKmsCrtc *kms_crtc, MetaKmsCrtc *kms_crtc,
int64_t time_ns, int64_t time_us,
CoglFrameInfoFlag flags) CoglFrameInfoFlag flags)
{ {
ClutterStageView *stage_view = CLUTTER_STAGE_VIEW (view); ClutterStageView *stage_view = CLUTTER_STAGE_VIEW (view);
@ -225,7 +225,7 @@ notify_view_crtc_presented (MetaRendererView *view,
frame_info = cogl_onscreen_peek_head_frame_info (onscreen); frame_info = cogl_onscreen_peek_head_frame_info (onscreen);
crtc = META_CRTC (meta_crtc_kms_from_kms_crtc (kms_crtc)); crtc = META_CRTC (meta_crtc_kms_from_kms_crtc (kms_crtc));
maybe_update_frame_info (crtc, frame_info, time_ns, flags); maybe_update_frame_info (crtc, frame_info, time_us, flags);
meta_onscreen_native_notify_frame_complete (onscreen); meta_onscreen_native_notify_frame_complete (onscreen);
@ -245,12 +245,9 @@ notify_view_crtc_presented (MetaRendererView *view,
} }
static int64_t static int64_t
timeval_to_nanoseconds (const struct timeval *tv) timeval_to_microseconds (const struct timeval *tv)
{ {
int64_t usec = ((int64_t) tv->tv_sec) * G_USEC_PER_SEC + tv->tv_usec; return ((int64_t) tv->tv_sec) * G_USEC_PER_SEC + tv->tv_usec;
int64_t nsec = usec * 1000;
return nsec;
} }
static void static void
@ -269,7 +266,7 @@ page_flip_feedback_flipped (MetaKmsCrtc *kms_crtc,
}; };
notify_view_crtc_presented (view, kms_crtc, notify_view_crtc_presented (view, kms_crtc,
timeval_to_nanoseconds (&page_flip_time), timeval_to_microseconds (&page_flip_time),
COGL_FRAME_INFO_FLAG_HW_CLOCK); COGL_FRAME_INFO_FLAG_HW_CLOCK);
} }
@ -307,7 +304,10 @@ page_flip_feedback_mode_set_fallback (MetaKmsCrtc *kms_crtc,
gpu_kms = META_GPU_KMS (meta_crtc_get_gpu (crtc)); gpu_kms = META_GPU_KMS (meta_crtc_get_gpu (crtc));
now_ns = meta_gpu_kms_get_current_time_ns (gpu_kms); now_ns = meta_gpu_kms_get_current_time_ns (gpu_kms);
notify_view_crtc_presented (view, kms_crtc, now_ns, COGL_FRAME_INFO_FLAG_NONE); notify_view_crtc_presented (view,
kms_crtc,
ns2us (now_ns),
COGL_FRAME_INFO_FLAG_NONE);
} }
static void static void
@ -335,7 +335,10 @@ page_flip_feedback_discarded (MetaKmsCrtc *kms_crtc,
gpu_kms = META_GPU_KMS (meta_crtc_get_gpu (crtc)); gpu_kms = META_GPU_KMS (meta_crtc_get_gpu (crtc));
now_ns = meta_gpu_kms_get_current_time_ns (gpu_kms); now_ns = meta_gpu_kms_get_current_time_ns (gpu_kms);
notify_view_crtc_presented (view, kms_crtc, now_ns, COGL_FRAME_INFO_FLAG_NONE); notify_view_crtc_presented (view,
kms_crtc,
ns2us (now_ns),
COGL_FRAME_INFO_FLAG_NONE);
} }
static const MetaKmsPageFlipListenerVtable page_flip_listener_vtable = { static const MetaKmsPageFlipListenerVtable page_flip_listener_vtable = {