[mutter] clutter: Add a max render time debug HUD
- From: Marge Bot <marge-bot src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [mutter] clutter: Add a max render time debug HUD
- Date: Tue, 13 Jul 2021 08:41:56 +0000 (UTC)
commit a5d1d48bf115b0f250a34ad799bf8ec7226886f9
Author: Ivan Molodetskikh <yalterz gmail com>
Date: Fri Nov 27 21:49:19 2020 +0300
clutter: Add a max render time debug HUD
Not sure how to update the damage or redraw clip or something; at least
this works properly when under a constantly-redrawing window, which is
ok for debugging purposes.
Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1762>
clutter/clutter/clutter-frame-clock.c | 45 ++++++++++++++++++++++++++++++++++
clutter/clutter/clutter-frame-clock.h | 2 ++
clutter/clutter/clutter-main.c | 1 +
clutter/clutter/clutter-main.h | 1 +
clutter/clutter/clutter-stage.c | 46 +++++++++++++++++++++++++++++++++++
5 files changed, 95 insertions(+)
---
diff --git a/clutter/clutter/clutter-frame-clock.c b/clutter/clutter/clutter-frame-clock.c
index 504e47bf5c..9b3b10ebac 100644
--- a/clutter/clutter/clutter-frame-clock.c
+++ b/clutter/clutter/clutter-frame-clock.c
@@ -678,6 +678,51 @@ clutter_frame_clock_record_flip_time (ClutterFrameClock *frame_clock,
frame_clock->last_flip_time_us = flip_time_us;
}
+GString *
+clutter_frame_clock_get_max_render_time_debug_info (ClutterFrameClock *frame_clock)
+{
+ int64_t max_dispatch_to_swap_us = 0;
+ int64_t max_swap_to_rendering_done_us = 0;
+ int64_t max_swap_to_flip_us = 0;
+ int i;
+ GString *string;
+
+ string = g_string_new (NULL);
+ g_string_append_printf (string, "Max render time: %ld µs",
+ clutter_frame_clock_compute_max_render_time_us (frame_clock));
+
+ if (frame_clock->got_measurements_last_frame)
+ g_string_append_printf (string, " =");
+ else
+ g_string_append_printf (string, " (no measurements last frame)");
+
+ for (i = 0; i < ESTIMATE_QUEUE_LENGTH; ++i)
+ {
+ max_dispatch_to_swap_us =
+ MAX (max_dispatch_to_swap_us,
+ frame_clock->dispatch_to_swap_us.values[i]);
+ max_swap_to_rendering_done_us =
+ MAX (max_swap_to_rendering_done_us,
+ frame_clock->swap_to_rendering_done_us.values[i]);
+ max_swap_to_flip_us =
+ MAX (max_swap_to_flip_us,
+ frame_clock->swap_to_flip_us.values[i]);
+ }
+
+ g_string_append_printf (string, "\nVblank duration: %ld µs +",
+ frame_clock->vblank_duration_us);
+ g_string_append_printf (string, "\nDispatch to swap: %ld µs +",
+ max_dispatch_to_swap_us);
+ g_string_append_printf (string, "\nmax(Swap to rendering done: %ld µs,",
+ max_swap_to_rendering_done_us);
+ g_string_append_printf (string, "\nSwap to flip: %ld µs) +",
+ max_swap_to_flip_us);
+ g_string_append_printf (string, "\nConstant: %d µs",
+ clutter_max_render_time_constant_us);
+
+ return string;
+}
+
static GSourceFuncs frame_clock_source_funcs = {
NULL,
NULL,
diff --git a/clutter/clutter/clutter-frame-clock.h b/clutter/clutter/clutter-frame-clock.h
index c825ecad94..e71b549873 100644
--- a/clutter/clutter/clutter-frame-clock.h
+++ b/clutter/clutter/clutter-frame-clock.h
@@ -94,4 +94,6 @@ float clutter_frame_clock_get_refresh_rate (ClutterFrameClock *frame_clock);
void clutter_frame_clock_record_flip_time (ClutterFrameClock *frame_clock,
int64_t flip_time_us);
+GString * clutter_frame_clock_get_max_render_time_debug_info (ClutterFrameClock *frame_clock);
+
#endif /* CLUTTER_FRAME_CLOCK_H */
diff --git a/clutter/clutter/clutter-main.c b/clutter/clutter/clutter-main.c
index fa206b3073..a800138eab 100644
--- a/clutter/clutter/clutter-main.c
+++ b/clutter/clutter/clutter-main.c
@@ -136,6 +136,7 @@ static const GDebugKey clutter_paint_debug_keys[] = {
{ "paint-deform-tiles", CLUTTER_DEBUG_PAINT_DEFORM_TILES },
{ "damage-region", CLUTTER_DEBUG_PAINT_DAMAGE_REGION },
{ "disable-dynamic-max-render-time", CLUTTER_DEBUG_DISABLE_DYNAMIC_MAX_RENDER_TIME },
+ { "max-render-time", CLUTTER_DEBUG_PAINT_MAX_RENDER_TIME },
};
gboolean
diff --git a/clutter/clutter/clutter-main.h b/clutter/clutter/clutter-main.h
index a0ee83b3e0..846a9d68d2 100644
--- a/clutter/clutter/clutter-main.h
+++ b/clutter/clutter/clutter-main.h
@@ -73,6 +73,7 @@ typedef enum
CLUTTER_DEBUG_PAINT_DEFORM_TILES = 1 << 7,
CLUTTER_DEBUG_PAINT_DAMAGE_REGION = 1 << 8,
CLUTTER_DEBUG_DISABLE_DYNAMIC_MAX_RENDER_TIME = 1 << 9,
+ CLUTTER_DEBUG_PAINT_MAX_RENDER_TIME = 1 << 10,
} ClutterDrawDebugFlag;
/**
diff --git a/clutter/clutter/clutter-stage.c b/clutter/clutter/clutter-stage.c
index 8627c6a17f..fc170107f2 100644
--- a/clutter/clutter/clutter-stage.c
+++ b/clutter/clutter/clutter-stage.c
@@ -1312,6 +1312,51 @@ clutter_stage_real_paint_view (ClutterStage *stage,
clutter_stage_do_paint_view (stage, view, redraw_clip);
}
+static void
+clutter_stage_paint (ClutterActor *actor,
+ ClutterPaintContext *paint_context)
+{
+ ClutterStageView *view;
+
+ CLUTTER_ACTOR_CLASS (clutter_stage_parent_class)->paint (actor, paint_context);
+
+ view = clutter_paint_context_get_stage_view (paint_context);
+ if (view &&
+ G_UNLIKELY (clutter_paint_debug_flags & CLUTTER_DEBUG_PAINT_MAX_RENDER_TIME))
+ {
+ cairo_rectangle_int_t view_layout;
+ ClutterFrameClock *frame_clock;
+ g_autoptr (GString) string = NULL;
+ PangoLayout *layout;
+ PangoRectangle logical;
+ ClutterColor color;
+ g_autoptr (ClutterPaintNode) node = NULL;
+ ClutterActorBox box;
+
+ clutter_stage_view_get_layout (view, &view_layout);
+ frame_clock = clutter_stage_view_get_frame_clock (view);
+
+ string = clutter_frame_clock_get_max_render_time_debug_info (frame_clock);
+
+ layout = clutter_actor_create_pango_layout (actor, string->str);
+ pango_layout_set_alignment (layout, PANGO_ALIGN_RIGHT);
+ pango_layout_get_pixel_extents (layout, NULL, &logical);
+
+ clutter_color_init (&color, 255, 255, 255, 255);
+ node = clutter_text_node_new (layout, &color);
+
+ box.x1 = view_layout.x;
+ box.y1 = view_layout.y + 30;
+ box.x2 = box.x1 + logical.width;
+ box.y2 = box.y1 + logical.height;
+ clutter_paint_node_add_rectangle (node, &box);
+
+ clutter_paint_node_paint (node, paint_context);
+
+ g_object_unref (layout);
+ }
+}
+
static void
clutter_stage_class_init (ClutterStageClass *klass)
{
@@ -1335,6 +1380,7 @@ clutter_stage_class_init (ClutterStageClass *klass)
actor_class->hide_all = clutter_stage_hide_all;
actor_class->queue_relayout = clutter_stage_real_queue_relayout;
actor_class->apply_transform = clutter_stage_real_apply_transform;
+ actor_class->paint = clutter_stage_paint;
klass->paint_view = clutter_stage_real_paint_view;
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]