mirror of
https://github.com/brl/mutter.git
synced 2025-04-15 14:49:39 +00:00
shaped-texture: Add debug paint overlay for opaque regions
Using opaque painting paths can have a big impact on painting performance. In order to easily validate whether we use the opaque paths, add a opaque (green) or blended (purple) overlay over painted areas if the `META_DEBUG_PAINT_OPAQUE_REGION` `MetaDebugPaintFlag` is set. You can do so in `lg` via: `Meta.add_debug_paint_flag(Meta.DebugPaintFlag.OPAQUE_REGION)` This can be helpful for application developers, as previously it was not trivial to check whether e.g. Wayland or X11 opaque regions where properly set. https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1372
This commit is contained in:
parent
1f557a502b
commit
effb824412
@ -73,6 +73,11 @@ enum
|
|||||||
|
|
||||||
static guint signals[LAST_SIGNAL];
|
static guint signals[LAST_SIGNAL];
|
||||||
|
|
||||||
|
static CoglPipelineKey opaque_overlay_pipeline_key =
|
||||||
|
"meta-shaped-texture-opaque-pipeline-key";
|
||||||
|
static CoglPipelineKey blended_overlay_pipeline_key =
|
||||||
|
"meta-shaped-texture-blended-pipeline-key";
|
||||||
|
|
||||||
struct _MetaShapedTexture
|
struct _MetaShapedTexture
|
||||||
{
|
{
|
||||||
GObject parent;
|
GObject parent;
|
||||||
@ -422,6 +427,46 @@ get_unblended_pipeline (MetaShapedTexture *stex,
|
|||||||
return pipeline;
|
return pipeline;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static CoglPipeline *
|
||||||
|
get_opaque_overlay_pipeline (CoglContext *ctx)
|
||||||
|
{
|
||||||
|
CoglPipeline *pipeline;
|
||||||
|
|
||||||
|
pipeline = cogl_context_get_named_pipeline (ctx,
|
||||||
|
&opaque_overlay_pipeline_key);
|
||||||
|
if (!pipeline)
|
||||||
|
{
|
||||||
|
pipeline = cogl_pipeline_new (ctx);
|
||||||
|
cogl_pipeline_set_color4ub (pipeline, 0x00, 0x33, 0x00, 0x33);
|
||||||
|
|
||||||
|
cogl_context_set_named_pipeline (ctx,
|
||||||
|
&opaque_overlay_pipeline_key,
|
||||||
|
pipeline);
|
||||||
|
}
|
||||||
|
|
||||||
|
return pipeline;
|
||||||
|
}
|
||||||
|
|
||||||
|
static CoglPipeline *
|
||||||
|
get_blended_overlay_pipeline (CoglContext *ctx)
|
||||||
|
{
|
||||||
|
CoglPipeline *pipeline;
|
||||||
|
|
||||||
|
pipeline = cogl_context_get_named_pipeline (ctx,
|
||||||
|
&blended_overlay_pipeline_key);
|
||||||
|
if (!pipeline)
|
||||||
|
{
|
||||||
|
pipeline = cogl_pipeline_new (ctx);
|
||||||
|
cogl_pipeline_set_color4ub (pipeline, 0x33, 0x00, 0x33, 0x33);
|
||||||
|
|
||||||
|
cogl_context_set_named_pipeline (ctx,
|
||||||
|
&blended_overlay_pipeline_key,
|
||||||
|
pipeline);
|
||||||
|
}
|
||||||
|
|
||||||
|
return pipeline;
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
paint_clipped_rectangle_node (MetaShapedTexture *stex,
|
paint_clipped_rectangle_node (MetaShapedTexture *stex,
|
||||||
ClutterPaintNode *root_node,
|
ClutterPaintNode *root_node,
|
||||||
@ -549,6 +594,7 @@ do_paint_content (MetaShapedTexture *stex,
|
|||||||
CoglPipelineFilter filter;
|
CoglPipelineFilter filter;
|
||||||
CoglFramebuffer *framebuffer;
|
CoglFramebuffer *framebuffer;
|
||||||
int sample_width, sample_height;
|
int sample_width, sample_height;
|
||||||
|
gboolean debug_paint_opaque_region;
|
||||||
|
|
||||||
ensure_size_valid (stex);
|
ensure_size_valid (stex);
|
||||||
|
|
||||||
@ -565,6 +611,9 @@ do_paint_content (MetaShapedTexture *stex,
|
|||||||
.height = dst_height,
|
.height = dst_height,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
debug_paint_opaque_region =
|
||||||
|
meta_get_debug_paint_flags() & META_DEBUG_PAINT_OPAQUE_REGION;
|
||||||
|
|
||||||
/* Use nearest-pixel interpolation if the texture is unscaled. This
|
/* Use nearest-pixel interpolation if the texture is unscaled. This
|
||||||
* improves performance, especially with software rendering.
|
* improves performance, especially with software rendering.
|
||||||
*/
|
*/
|
||||||
@ -664,6 +713,16 @@ do_paint_content (MetaShapedTexture *stex,
|
|||||||
paint_clipped_rectangle_node (stex, root_node,
|
paint_clipped_rectangle_node (stex, root_node,
|
||||||
opaque_pipeline,
|
opaque_pipeline,
|
||||||
&rect, alloc);
|
&rect, alloc);
|
||||||
|
|
||||||
|
if (G_UNLIKELY (debug_paint_opaque_region))
|
||||||
|
{
|
||||||
|
CoglPipeline *opaque_overlay_pipeline;
|
||||||
|
|
||||||
|
opaque_overlay_pipeline = get_opaque_overlay_pipeline (ctx);
|
||||||
|
paint_clipped_rectangle_node (stex, root_node,
|
||||||
|
opaque_overlay_pipeline,
|
||||||
|
&rect, alloc);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -719,6 +778,16 @@ do_paint_content (MetaShapedTexture *stex,
|
|||||||
paint_clipped_rectangle_node (stex, root_node,
|
paint_clipped_rectangle_node (stex, root_node,
|
||||||
blended_pipeline,
|
blended_pipeline,
|
||||||
&rect, alloc);
|
&rect, alloc);
|
||||||
|
|
||||||
|
if (G_UNLIKELY (debug_paint_opaque_region))
|
||||||
|
{
|
||||||
|
CoglPipeline *blended_overlay_pipeline;
|
||||||
|
|
||||||
|
blended_overlay_pipeline = get_blended_overlay_pipeline (ctx);
|
||||||
|
paint_clipped_rectangle_node (stex, root_node,
|
||||||
|
blended_overlay_pipeline,
|
||||||
|
&rect, alloc);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -731,6 +800,20 @@ do_paint_content (MetaShapedTexture *stex,
|
|||||||
|
|
||||||
/* 3) blended_tex_region is NULL. Do a full paint. */
|
/* 3) blended_tex_region is NULL. Do a full paint. */
|
||||||
clutter_paint_node_add_rectangle (node, alloc);
|
clutter_paint_node_add_rectangle (node, alloc);
|
||||||
|
|
||||||
|
if (G_UNLIKELY (debug_paint_opaque_region))
|
||||||
|
{
|
||||||
|
CoglPipeline *blended_overlay_pipeline;
|
||||||
|
g_autoptr (ClutterPaintNode) node_overlay = NULL;
|
||||||
|
|
||||||
|
blended_overlay_pipeline = get_blended_overlay_pipeline (ctx);
|
||||||
|
|
||||||
|
node_overlay = clutter_pipeline_node_new (blended_overlay_pipeline);
|
||||||
|
clutter_paint_node_set_static_name (node_overlay,
|
||||||
|
"MetaShapedTexture (unclipped overlay)");
|
||||||
|
clutter_paint_node_add_child (root_node, node_overlay);
|
||||||
|
clutter_paint_node_add_rectangle (node_overlay, alloc);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user