From 09267d0bdd92697c835c852c08f66bf014330f47 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michel=20D=C3=A4nzer?= Date: Tue, 9 Apr 2024 18:28:40 +0200 Subject: [PATCH] cogl/onscreen: Add cogl_onscreen_egl_maybe_create_timestamp_query Move the code out of cogl_onscreen_egl_swap_buffers_with_damage, and call the new function from callers of the former. v2: * Use early return if the cogl context doesn't support timestamp queries. (Sebastian Wick) Part-of: --- cogl/cogl/winsys/cogl-onscreen-egl.c | 34 ++++++++++++------- cogl/cogl/winsys/cogl-onscreen-egl.h | 4 +++ src/backends/native/meta-onscreen-native.c | 2 ++ .../x11/nested/meta-stage-x11-nested.c | 2 ++ 4 files changed, 29 insertions(+), 13 deletions(-) diff --git a/cogl/cogl/winsys/cogl-onscreen-egl.c b/cogl/cogl/winsys/cogl-onscreen-egl.c index 6c5bf2654..44010969c 100644 --- a/cogl/cogl/winsys/cogl-onscreen-egl.c +++ b/cogl/cogl/winsys/cogl-onscreen-egl.c @@ -281,6 +281,27 @@ cogl_onscreen_egl_queue_damage_region (CoglOnscreen *onscreen, g_warning ("Error reported by eglSetDamageRegion"); } +void +cogl_onscreen_egl_maybe_create_timestamp_query (CoglOnscreen *onscreen, + CoglFrameInfo *info) +{ + CoglFramebuffer *framebuffer = COGL_FRAMEBUFFER (onscreen); + CoglContext *context = cogl_framebuffer_get_context (framebuffer); + + if (!cogl_has_feature (context, COGL_FEATURE_ID_TIMESTAMP_QUERY)) + return; + + info->gpu_time_before_buffer_swap_ns = + cogl_context_get_gpu_time_ns (context); + info->cpu_time_before_buffer_swap_us = g_get_monotonic_time (); + + /* Set up a timestamp query for when all rendering will be finished. */ + info->timestamp_query = + cogl_framebuffer_create_timestamp_query (framebuffer); + + info->has_valid_gpu_rendering_duration = TRUE; +} + static void cogl_onscreen_egl_swap_buffers_with_damage (CoglOnscreen *onscreen, const int *rectangles, @@ -309,19 +330,6 @@ cogl_onscreen_egl_swap_buffers_with_damage (CoglOnscreen *onscreen, COGL_FRAMEBUFFER (onscreen), COGL_FRAMEBUFFER_STATE_BIND); - if (cogl_has_feature (context, COGL_FEATURE_ID_TIMESTAMP_QUERY)) - { - info->gpu_time_before_buffer_swap_ns = - cogl_context_get_gpu_time_ns (context); - info->cpu_time_before_buffer_swap_us = g_get_monotonic_time (); - - /* Set up a timestamp query for when all rendering will be finished. */ - info->timestamp_query = - cogl_framebuffer_create_timestamp_query (COGL_FRAMEBUFFER (onscreen)); - - info->has_valid_gpu_rendering_duration = TRUE; - } - if (n_rectangles && priv->pf_eglSwapBuffersWithDamage) { CoglFramebuffer *framebuffer = COGL_FRAMEBUFFER (onscreen); diff --git a/cogl/cogl/winsys/cogl-onscreen-egl.h b/cogl/cogl/winsys/cogl-onscreen-egl.h index 13662be60..d4dda6636 100644 --- a/cogl/cogl/winsys/cogl-onscreen-egl.h +++ b/cogl/cogl/winsys/cogl-onscreen-egl.h @@ -40,6 +40,10 @@ struct _CoglOnscreenEglClass CoglOnscreenClass parent_class; }; +COGL_EXPORT void +cogl_onscreen_egl_maybe_create_timestamp_query (CoglOnscreen *onscreen, + CoglFrameInfo *info); + COGL_EXPORT void cogl_onscreen_egl_set_egl_surface (CoglOnscreenEgl *onscreen_egl, EGLSurface egl_surface); diff --git a/src/backends/native/meta-onscreen-native.c b/src/backends/native/meta-onscreen-native.c index 85d86f6f4..cbf9c1530 100644 --- a/src/backends/native/meta-onscreen-native.c +++ b/src/backends/native/meta-onscreen-native.c @@ -1305,6 +1305,8 @@ meta_onscreen_native_swap_buffers_with_damage (CoglOnscreen *onscreen, rectangles, n_rectangles); + cogl_onscreen_egl_maybe_create_timestamp_query (onscreen, frame_info); + parent_class = COGL_ONSCREEN_CLASS (meta_onscreen_native_parent_class); parent_class->swap_buffers_with_damage (onscreen, rectangles, diff --git a/src/backends/x11/nested/meta-stage-x11-nested.c b/src/backends/x11/nested/meta-stage-x11-nested.c index 41b78ec18..02eccc77d 100644 --- a/src/backends/x11/nested/meta-stage-x11-nested.c +++ b/src/backends/x11/nested/meta-stage-x11-nested.c @@ -186,6 +186,8 @@ meta_stage_x11_nested_finish_frame (ClutterStageWindow *stage_window, } frame_info = cogl_frame_info_new (context, 0); + cogl_onscreen_egl_maybe_create_timestamp_query (stage_x11->onscreen, + frame_info); cogl_onscreen_swap_buffers (stage_x11->onscreen, frame_info, frame); if (!clutter_frame_has_result (frame))