From 4ce08a7b8967eb40ef22b77b19420253fc3fe3cc Mon Sep 17 00:00:00 2001 From: Benjamin Otte Date: Tue, 26 Dec 2023 17:15:26 +0100 Subject: [PATCH 1/4] rendernode: Use different hilights When hilighting Cairo nodes, use a different hilight color than when hilighting other nodes. This allows differentiating application use of Cairo (via nodes) from renderer use of Cairo (via fallback). --- gsk/gskrendernode.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/gsk/gskrendernode.c b/gsk/gskrendernode.c index d126c924f9..be237ddaa6 100644 --- a/gsk/gskrendernode.c +++ b/gsk/gskrendernode.c @@ -434,11 +434,18 @@ gsk_render_node_draw_fallback (GskRenderNode *node, /* pink, black * black, pink */ - static const guint32 pixels[] = { 0xFFFF00CC, 0xFF000000, - 0xFF000000, 0xFFFF00CC }; + static const guint32 fallback_pixels[] = { 0xFFFF00CC, 0xFF000000, + 0xFF000000, 0xFFFF00CC }; + static const guint32 cairo_pixels[] = { 0xFF9900FF, 0xFF000000, + 0xFF000000, 0xFF9900FF }; + const guint32 *pixels; cairo_surface_t *surface; cairo_save (cr); + if (GSK_RENDER_NODE_TYPE (node) == GSK_CAIRO_NODE) + pixels = cairo_pixels; + else + pixels = fallback_pixels; surface = cairo_image_surface_create_for_data ((guchar *) pixels, CAIRO_FORMAT_ARGB32, 2, 2, From 3f97ba20414bd723e9df5243f77117cffebd5811 Mon Sep 17 00:00:00 2001 From: Benjamin Otte Date: Tue, 26 Dec 2023 17:19:20 +0100 Subject: [PATCH 2/4] gsk: Clarify debug category messages a bit After discussion on IRC about debug messages: - FALLBACK is meant to be used for printing stuff about fallbacks (Cairo, offscreens, conversion when uploading, etc) - CAIRO is for overdrawing everything drawn with Cairo --- gsk/gskdebug.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gsk/gskdebug.c b/gsk/gskdebug.c index e308213877..36692b07e5 100644 --- a/gsk/gskdebug.c +++ b/gsk/gskdebug.c @@ -9,7 +9,7 @@ static const GdkDebugKey gsk_debug_keys[] = { { "vulkan", GSK_DEBUG_VULKAN, "Vulkan renderer information" }, { "shaders", GSK_DEBUG_SHADERS, "Information about shaders" }, { "surface", GSK_DEBUG_SURFACE, "Information about surfaces" }, - { "fallback", GSK_DEBUG_FALLBACK, "Information about fallbacks" }, + { "fallback", GSK_DEBUG_FALLBACK, "Information about fallback usage in renderers" }, { "glyphcache", GSK_DEBUG_GLYPH_CACHE, "Information about glyph caching" }, { "verbose", GSK_DEBUG_VERBOSE, "Print verbose output while rendering" }, { "geometry", GSK_DEBUG_GEOMETRY, "Show borders (when using cairo)" }, From af014007f44baca453d4b2e7af750f21c2af9aca Mon Sep 17 00:00:00 2001 From: Benjamin Otte Date: Tue, 26 Dec 2023 17:21:12 +0100 Subject: [PATCH 3/4] gl: Remove old Cairo fallback drawing code We use gsk_render_node_draw_fallback() now which does all of that for us. --- gsk/gl/gskglrenderer.c | 4 ---- gsk/gl/gskglrenderjob.c | 28 ---------------------------- gsk/gl/gskglrenderjobprivate.h | 2 -- 3 files changed, 34 deletions(-) diff --git a/gsk/gl/gskglrenderer.c b/gsk/gl/gskglrenderer.c index 8e48ca222f..163b4c5508 100644 --- a/gsk/gl/gskglrenderer.c +++ b/gsk/gl/gskglrenderer.c @@ -389,8 +389,6 @@ gsk_gl_renderer_render (GskRenderer *renderer, gsk_gl_driver_begin_frame (self->driver, self->command_queue); job = gsk_gl_render_job_new (self->driver, &viewport, scale, render_region, 0, clear_framebuffer); - if (GSK_RENDERER_DEBUG_CHECK (GSK_RENDERER (self), FALLBACK)) - gsk_gl_render_job_set_debug_fallback (job, TRUE); gsk_gl_render_job_render (job, root); gsk_gl_driver_end_frame (self->driver); gsk_gl_render_job_free (job); @@ -475,8 +473,6 @@ gsk_gl_renderer_render_texture (GskRenderer *renderer, { gsk_gl_driver_begin_frame (self->driver, self->command_queue); job = gsk_gl_render_job_new (self->driver, viewport, 1, NULL, render_target->framebuffer_id, TRUE); - if (GSK_RENDERER_DEBUG_CHECK (GSK_RENDERER (self), FALLBACK)) - gsk_gl_render_job_set_debug_fallback (job, TRUE); gsk_gl_render_job_render_flipped (job, root); texture_id = gsk_gl_driver_release_render_target (self->driver, render_target, FALSE); texture = gsk_gl_driver_create_gdk_texture (self->driver, texture_id, gdk_format); diff --git a/gsk/gl/gskglrenderjob.c b/gsk/gl/gskglrenderjob.c index 864a0435e2..a3e7c315ba 100644 --- a/gsk/gl/gskglrenderjob.c +++ b/gsk/gl/gskglrenderjob.c @@ -167,9 +167,6 @@ struct _GskGLRenderJob guint source_is_glyph_atlas : 1; - /* If we should be rendering red zones over fallback nodes */ - guint debug_fallback : 1; - /* In some cases we might want to avoid clearing the framebuffer * because we're going to render over the existing contents. */ @@ -1232,22 +1229,6 @@ gsk_gl_render_job_visit_as_fallback (GskGLRenderJob *job, cairo_rectangle (cr, 0, 0, surface_width / fabs (scale_x), surface_height / fabs (scale_y)); cairo_fill (cr); cairo_restore (cr); - - if (job->debug_fallback) - { - cairo_move_to (cr, 0, 0); - cairo_rectangle (cr, 0, 0, node->bounds.size.width, node->bounds.size.height); - if (GSK_RENDER_NODE_TYPE (node) == GSK_CAIRO_NODE) - cairo_set_source_rgba (cr, 0.3, 0, 1, 0.25); - else - cairo_set_source_rgba (cr, 1, 0, 0, 0.25); - cairo_fill_preserve (cr); - if (GSK_RENDER_NODE_TYPE (node) == GSK_CAIRO_NODE) - cairo_set_source_rgba (cr, 0.3, 0, 1, 1); - else - cairo_set_source_rgba (cr, 1, 0, 0, 1); - cairo_stroke (cr); - } cairo_destroy (cr); /* Create texture to upload */ @@ -4580,15 +4561,6 @@ gsk_gl_render_job_render (GskGLRenderJob *job, gdk_profiler_add_mark (start_time, GDK_PROFILER_CURRENT_TIME-start_time, "Execute GL command queue", ""); } -void -gsk_gl_render_job_set_debug_fallback (GskGLRenderJob *job, - gboolean debug_fallback) -{ - g_return_if_fail (job != NULL); - - job->debug_fallback = !!debug_fallback; -} - static int get_framebuffer_format (GdkGLContext *context, guint framebuffer) diff --git a/gsk/gl/gskglrenderjobprivate.h b/gsk/gl/gskglrenderjobprivate.h index 32edae12a3..2e38b07a2e 100644 --- a/gsk/gl/gskglrenderjobprivate.h +++ b/gsk/gl/gskglrenderjobprivate.h @@ -33,6 +33,4 @@ void gsk_gl_render_job_render (GskGLRenderJob *job GskRenderNode *root); void gsk_gl_render_job_render_flipped (GskGLRenderJob *job, GskRenderNode *root); -void gsk_gl_render_job_set_debug_fallback (GskGLRenderJob *job, - gboolean debug_fallback); From 0c036c0c217adf187fffc827865bf15548addea5 Mon Sep 17 00:00:00 2001 From: Benjamin Otte Date: Tue, 26 Dec 2023 17:22:09 +0100 Subject: [PATCH 4/4] inspector: Make the "show fallbacks" actually do the right thing After reshuffling debug categories, that toggle didn't do what was expected anymore. Fix that. Also clarify the message and add a tooltip. --- gtk/inspector/visual.c | 26 +++++++++++++------------- gtk/inspector/visual.ui | 11 ++++++----- 2 files changed, 19 insertions(+), 18 deletions(-) diff --git a/gtk/inspector/visual.c b/gtk/inspector/visual.c index 2ef1cfbef6..d831eb0640 100644 --- a/gtk/inspector/visual.c +++ b/gtk/inspector/visual.c @@ -92,7 +92,7 @@ struct _GtkInspectorVisual GtkWidget *debug_box; GtkWidget *fps_switch; GtkWidget *updates_switch; - GtkWidget *fallback_switch; + GtkWidget *cairo_switch; GtkWidget *baselines_switch; GtkWidget *layout_switch; GtkWidget *focus_switch; @@ -388,25 +388,25 @@ updates_activate (GtkSwitch *sw, } static void -fallback_activate (GtkSwitch *sw, - GParamSpec *pspec, - GtkInspectorVisual *vis) +cairo_activate (GtkSwitch *sw, + GParamSpec *pspec, + GtkInspectorVisual *vis) { GtkInspectorWindow *iw; - gboolean fallback; + gboolean active; guint flags; GList *toplevels, *l; - fallback = gtk_switch_get_active (sw); + active = gtk_switch_get_active (sw); iw = GTK_INSPECTOR_WINDOW (gtk_widget_get_root (GTK_WIDGET (vis))); if (iw == NULL) return; flags = gsk_get_debug_flags (); - if (fallback) - flags = flags | GSK_DEBUG_FALLBACK; + if (active) + flags = flags | GSK_DEBUG_CAIRO; else - flags = flags & ~GSK_DEBUG_FALLBACK; + flags = flags & ~GSK_DEBUG_CAIRO; gsk_set_debug_flags (flags); toplevels = gtk_window_list_toplevels (); @@ -1055,9 +1055,9 @@ row_activated (GtkListBox *box, GtkSwitch *sw = GTK_SWITCH (vis->updates_switch); gtk_switch_set_active (sw, !gtk_switch_get_active (sw)); } - else if (gtk_widget_is_ancestor (vis->fallback_switch, GTK_WIDGET (row))) + else if (gtk_widget_is_ancestor (vis->cairo_switch, GTK_WIDGET (row))) { - GtkSwitch *sw = GTK_SWITCH (vis->fallback_switch); + GtkSwitch *sw = GTK_SWITCH (vis->cairo_switch); gtk_switch_set_active (sw, !gtk_switch_get_active (sw)); } else if (gtk_widget_is_ancestor (vis->baselines_switch, GTK_WIDGET (row))) @@ -1199,7 +1199,7 @@ gtk_inspector_visual_class_init (GtkInspectorVisualClass *klass) gtk_widget_class_bind_template_child (widget_class, GtkInspectorVisual, font_scale_adjustment); gtk_widget_class_bind_template_child (widget_class, GtkInspectorVisual, fps_switch); gtk_widget_class_bind_template_child (widget_class, GtkInspectorVisual, updates_switch); - gtk_widget_class_bind_template_child (widget_class, GtkInspectorVisual, fallback_switch); + gtk_widget_class_bind_template_child (widget_class, GtkInspectorVisual, cairo_switch); gtk_widget_class_bind_template_child (widget_class, GtkInspectorVisual, baselines_switch); gtk_widget_class_bind_template_child (widget_class, GtkInspectorVisual, layout_switch); gtk_widget_class_bind_template_child (widget_class, GtkInspectorVisual, focus_switch); @@ -1208,7 +1208,7 @@ gtk_inspector_visual_class_init (GtkInspectorVisualClass *klass) gtk_widget_class_bind_template_callback (widget_class, fps_activate); gtk_widget_class_bind_template_callback (widget_class, updates_activate); - gtk_widget_class_bind_template_callback (widget_class, fallback_activate); + gtk_widget_class_bind_template_callback (widget_class, cairo_activate); gtk_widget_class_bind_template_callback (widget_class, direction_changed); gtk_widget_class_bind_template_callback (widget_class, baselines_activate); gtk_widget_class_bind_template_callback (widget_class, layout_activate); diff --git a/gtk/inspector/visual.ui b/gtk/inspector/visual.ui index ae11317f2b..1d3c65946e 100644 --- a/gtk/inspector/visual.ui +++ b/gtk/inspector/visual.ui @@ -427,23 +427,24 @@ + Tints all the places where the current renderer uses Cairo instead of the GPU. 40 - - Show Fallback Rendering + + Show Cairo Rendering start baseline 0.0 - + end center 1 - + @@ -718,7 +719,7 @@ - +