mirror of
https://github.com/brl/mutter.git
synced 2024-11-25 01:20:42 -05:00
cogl: Add CPU swap time and GPU rendering query to CoglFrameInfo
Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1762>
This commit is contained in:
parent
fbe6740df1
commit
8c258d1de1
@ -254,6 +254,7 @@ swap_framebuffer (ClutterStageWindow *stage_window,
|
|||||||
ClutterStageCoglPrivate *priv =
|
ClutterStageCoglPrivate *priv =
|
||||||
_clutter_stage_cogl_get_instance_private (stage_cogl);
|
_clutter_stage_cogl_get_instance_private (stage_cogl);
|
||||||
CoglFramebuffer *framebuffer = clutter_stage_view_get_onscreen (view);
|
CoglFramebuffer *framebuffer = clutter_stage_view_get_onscreen (view);
|
||||||
|
CoglContext *cogl_context = cogl_framebuffer_get_context (framebuffer);
|
||||||
|
|
||||||
clutter_stage_view_before_swap_buffer (view, swap_region);
|
clutter_stage_view_before_swap_buffer (view, swap_region);
|
||||||
|
|
||||||
@ -276,7 +277,8 @@ swap_framebuffer (ClutterStageWindow *stage_window,
|
|||||||
damage[i * 4 + 3] = rect.height;
|
damage[i * 4 + 3] = rect.height;
|
||||||
}
|
}
|
||||||
|
|
||||||
frame_info = cogl_frame_info_new (priv->global_frame_counter);
|
frame_info =
|
||||||
|
cogl_frame_info_new (cogl_context, priv->global_frame_counter);
|
||||||
priv->global_frame_counter++;
|
priv->global_frame_counter++;
|
||||||
|
|
||||||
/* push on the screen */
|
/* push on the screen */
|
||||||
@ -688,6 +690,7 @@ clutter_stage_cogl_scanout_view (ClutterStageCogl *stage_cogl,
|
|||||||
ClutterStageCoglPrivate *priv =
|
ClutterStageCoglPrivate *priv =
|
||||||
_clutter_stage_cogl_get_instance_private (stage_cogl);
|
_clutter_stage_cogl_get_instance_private (stage_cogl);
|
||||||
CoglFramebuffer *framebuffer = clutter_stage_view_get_framebuffer (view);
|
CoglFramebuffer *framebuffer = clutter_stage_view_get_framebuffer (view);
|
||||||
|
CoglContext *cogl_context = cogl_framebuffer_get_context (framebuffer);
|
||||||
CoglOnscreen *onscreen;
|
CoglOnscreen *onscreen;
|
||||||
CoglFrameInfo *frame_info;
|
CoglFrameInfo *frame_info;
|
||||||
|
|
||||||
@ -695,7 +698,7 @@ clutter_stage_cogl_scanout_view (ClutterStageCogl *stage_cogl,
|
|||||||
|
|
||||||
onscreen = COGL_ONSCREEN (framebuffer);
|
onscreen = COGL_ONSCREEN (framebuffer);
|
||||||
|
|
||||||
frame_info = cogl_frame_info_new (priv->global_frame_counter);
|
frame_info = cogl_frame_info_new (cogl_context, priv->global_frame_counter);
|
||||||
|
|
||||||
if (!cogl_onscreen_direct_scanout (onscreen,
|
if (!cogl_onscreen_direct_scanout (onscreen,
|
||||||
scanout,
|
scanout,
|
||||||
@ -748,9 +751,10 @@ clutter_stage_cogl_add_onscreen_frame_info (ClutterStageCogl *stage_cogl,
|
|||||||
ClutterStageCoglPrivate *priv =
|
ClutterStageCoglPrivate *priv =
|
||||||
_clutter_stage_cogl_get_instance_private (stage_cogl);
|
_clutter_stage_cogl_get_instance_private (stage_cogl);
|
||||||
CoglFramebuffer *framebuffer = clutter_stage_view_get_onscreen (view);
|
CoglFramebuffer *framebuffer = clutter_stage_view_get_onscreen (view);
|
||||||
|
CoglContext *cogl_context = cogl_framebuffer_get_context (framebuffer);
|
||||||
CoglFrameInfo *frame_info;
|
CoglFrameInfo *frame_info;
|
||||||
|
|
||||||
frame_info = cogl_frame_info_new (priv->global_frame_counter);
|
frame_info = cogl_frame_info_new (cogl_context, priv->global_frame_counter);
|
||||||
priv->global_frame_counter++;
|
priv->global_frame_counter++;
|
||||||
|
|
||||||
cogl_onscreen_add_frame_info (COGL_ONSCREEN (framebuffer), frame_info);
|
cogl_onscreen_add_frame_info (COGL_ONSCREEN (framebuffer), frame_info);
|
||||||
|
@ -33,6 +33,7 @@
|
|||||||
|
|
||||||
#include "cogl-frame-info.h"
|
#include "cogl-frame-info.h"
|
||||||
#include "cogl-object-private.h"
|
#include "cogl-object-private.h"
|
||||||
|
#include "cogl-context.h"
|
||||||
|
|
||||||
typedef enum _CoglFrameInfoFlag
|
typedef enum _CoglFrameInfoFlag
|
||||||
{
|
{
|
||||||
@ -62,6 +63,8 @@ struct _CoglFrameInfo
|
|||||||
{
|
{
|
||||||
CoglObject _parent;
|
CoglObject _parent;
|
||||||
|
|
||||||
|
CoglContext *context;
|
||||||
|
|
||||||
int64_t frame_counter;
|
int64_t frame_counter;
|
||||||
int64_t presentation_time_us; /* CLOCK_MONOTONIC */
|
int64_t presentation_time_us; /* CLOCK_MONOTONIC */
|
||||||
float refresh_rate;
|
float refresh_rate;
|
||||||
@ -71,9 +74,14 @@ struct _CoglFrameInfo
|
|||||||
CoglFrameInfoFlag flags;
|
CoglFrameInfoFlag flags;
|
||||||
|
|
||||||
unsigned int sequence;
|
unsigned int sequence;
|
||||||
|
|
||||||
|
CoglTimestampQuery *timestamp_query;
|
||||||
|
int64_t gpu_time_before_buffer_swap_ns;
|
||||||
|
int64_t cpu_time_before_buffer_swap_us;
|
||||||
};
|
};
|
||||||
|
|
||||||
COGL_EXPORT
|
COGL_EXPORT
|
||||||
CoglFrameInfo *cogl_frame_info_new (int64_t global_frame_counter);
|
CoglFrameInfo *cogl_frame_info_new (CoglContext *context,
|
||||||
|
int64_t global_frame_counter);
|
||||||
|
|
||||||
#endif /* __COGL_FRAME_INFO_PRIVATE_H */
|
#endif /* __COGL_FRAME_INFO_PRIVATE_H */
|
||||||
|
@ -32,6 +32,7 @@
|
|||||||
|
|
||||||
#include "cogl-frame-info-private.h"
|
#include "cogl-frame-info-private.h"
|
||||||
#include "cogl-gtype-private.h"
|
#include "cogl-gtype-private.h"
|
||||||
|
#include "cogl-context-private.h"
|
||||||
|
|
||||||
static void _cogl_frame_info_free (CoglFrameInfo *info);
|
static void _cogl_frame_info_free (CoglFrameInfo *info);
|
||||||
|
|
||||||
@ -39,11 +40,13 @@ COGL_OBJECT_DEFINE (FrameInfo, frame_info);
|
|||||||
COGL_GTYPE_DEFINE_CLASS (FrameInfo, frame_info);
|
COGL_GTYPE_DEFINE_CLASS (FrameInfo, frame_info);
|
||||||
|
|
||||||
CoglFrameInfo *
|
CoglFrameInfo *
|
||||||
cogl_frame_info_new (int64_t global_frame_counter)
|
cogl_frame_info_new (CoglContext *context,
|
||||||
|
int64_t global_frame_counter)
|
||||||
{
|
{
|
||||||
CoglFrameInfo *info;
|
CoglFrameInfo *info;
|
||||||
|
|
||||||
info = g_new0 (CoglFrameInfo, 1);
|
info = g_new0 (CoglFrameInfo, 1);
|
||||||
|
info->context = context;
|
||||||
info->global_frame_counter = global_frame_counter;
|
info->global_frame_counter = global_frame_counter;
|
||||||
|
|
||||||
return _cogl_frame_info_object_new (info);
|
return _cogl_frame_info_object_new (info);
|
||||||
@ -52,6 +55,9 @@ cogl_frame_info_new (int64_t global_frame_counter)
|
|||||||
static void
|
static void
|
||||||
_cogl_frame_info_free (CoglFrameInfo *info)
|
_cogl_frame_info_free (CoglFrameInfo *info)
|
||||||
{
|
{
|
||||||
|
if (info->timestamp_query)
|
||||||
|
cogl_context_free_timestamp_query (info->context, info->timestamp_query);
|
||||||
|
|
||||||
g_free (info);
|
g_free (info);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -114,3 +120,24 @@ cogl_frame_info_get_sequence (CoglFrameInfo *info)
|
|||||||
|
|
||||||
return info->sequence;
|
return info->sequence;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int64_t
|
||||||
|
cogl_frame_info_get_rendering_duration_ns (CoglFrameInfo *info)
|
||||||
|
{
|
||||||
|
int64_t gpu_time_rendering_done_ns;
|
||||||
|
|
||||||
|
if (!info->timestamp_query)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
gpu_time_rendering_done_ns =
|
||||||
|
cogl_context_timestamp_query_get_time_ns (info->context,
|
||||||
|
info->timestamp_query);
|
||||||
|
|
||||||
|
return gpu_time_rendering_done_ns - info->gpu_time_before_buffer_swap_ns;
|
||||||
|
}
|
||||||
|
|
||||||
|
int64_t
|
||||||
|
cogl_frame_info_get_time_before_buffer_swap_us (CoglFrameInfo *info)
|
||||||
|
{
|
||||||
|
return info->cpu_time_before_buffer_swap_us;
|
||||||
|
}
|
||||||
|
@ -150,6 +150,12 @@ gboolean cogl_frame_info_is_vsync (CoglFrameInfo *info);
|
|||||||
COGL_EXPORT
|
COGL_EXPORT
|
||||||
unsigned int cogl_frame_info_get_sequence (CoglFrameInfo *info);
|
unsigned int cogl_frame_info_get_sequence (CoglFrameInfo *info);
|
||||||
|
|
||||||
|
COGL_EXPORT
|
||||||
|
int64_t cogl_frame_info_get_rendering_duration_ns (CoglFrameInfo *info);
|
||||||
|
|
||||||
|
COGL_EXPORT
|
||||||
|
int64_t cogl_frame_info_get_time_before_buffer_swap_us (CoglFrameInfo *info);
|
||||||
|
|
||||||
G_END_DECLS
|
G_END_DECLS
|
||||||
|
|
||||||
#endif /* __COGL_FRAME_INFO_H */
|
#endif /* __COGL_FRAME_INFO_H */
|
||||||
|
@ -168,6 +168,7 @@ meta_stage_x11_nested_finish_frame (ClutterStageWindow *stage_window,
|
|||||||
MetaRenderer *renderer = meta_backend_get_renderer (backend);
|
MetaRenderer *renderer = meta_backend_get_renderer (backend);
|
||||||
ClutterBackend *clutter_backend = meta_backend_get_clutter_backend (backend);
|
ClutterBackend *clutter_backend = meta_backend_get_clutter_backend (backend);
|
||||||
CoglFramebuffer *onscreen = COGL_FRAMEBUFFER (stage_x11->onscreen);
|
CoglFramebuffer *onscreen = COGL_FRAMEBUFFER (stage_x11->onscreen);
|
||||||
|
CoglContext *context = cogl_framebuffer_get_context (onscreen);
|
||||||
GList *l;
|
GList *l;
|
||||||
CoglFrameInfo *frame_info;
|
CoglFrameInfo *frame_info;
|
||||||
|
|
||||||
@ -195,7 +196,7 @@ meta_stage_x11_nested_finish_frame (ClutterStageWindow *stage_window,
|
|||||||
draw_view (stage_nested, renderer_view, texture);
|
draw_view (stage_nested, renderer_view, texture);
|
||||||
}
|
}
|
||||||
|
|
||||||
frame_info = cogl_frame_info_new (0);
|
frame_info = cogl_frame_info_new (context, 0);
|
||||||
cogl_onscreen_swap_buffers (stage_x11->onscreen, frame_info, frame);
|
cogl_onscreen_swap_buffers (stage_x11->onscreen, frame_info, frame);
|
||||||
|
|
||||||
if (!clutter_frame_has_result (frame))
|
if (!clutter_frame_has_result (frame))
|
||||||
|
Loading…
Reference in New Issue
Block a user