Merge branch 'rerender-node' into 'master'

wlr_scene: Add WLR_SCENE_DEBUG_DAMAGE_RENDERER_NODE

See merge request wlroots/wlroots!3662
This commit is contained in:
Alexander Orzechowski 2026-02-28 17:22:55 -05:00
commit 1506d82639
3 changed files with 15 additions and 5 deletions

View file

@ -57,7 +57,7 @@ wlroots reads these environment variables
* *WLR_SCENE_DEBUG_DAMAGE*: specifies debug options for screen damage related
tasks for compositors that use scenes (available options: none, rerender,
highlight)
rerender_node, highlight)
* *WLR_SCENE_DISABLE_DIRECT_SCANOUT*: disables direct scan-out for debugging.
* *WLR_SCENE_DISABLE_VISIBILITY*: If set to 1, the visibility of all scene nodes
will be considered to be the full node. Intelligent visibility canculations will

View file

@ -84,6 +84,7 @@ struct wlr_scene_node {
enum wlr_scene_debug_damage_option {
WLR_SCENE_DEBUG_DAMAGE_NONE,
WLR_SCENE_DEBUG_DAMAGE_RERENDER,
WLR_SCENE_DEBUG_DAMAGE_RERENDER_NODE,
WLR_SCENE_DEBUG_DAMAGE_HIGHLIGHT
};

View file

@ -190,6 +190,7 @@ struct wlr_scene *wlr_scene_create(void) {
const char *debug_damage_options[] = {
"none",
"rerender",
"rerender_node",
"highlight",
NULL
};
@ -981,14 +982,22 @@ void wlr_scene_buffer_set_buffer_with_options(struct wlr_scene_buffer *scene_buf
}
pixman_region32_t trans_damage;
pixman_region32_init(&trans_damage);
wlr_region_transform(&trans_damage, damage,
scene_buffer->transform, buffer->width, buffer->height);
struct wlr_scene *scene = scene_node_get_root(&scene_buffer->node);
if (scene->debug_damage_option == WLR_SCENE_DEBUG_DAMAGE_RERENDER_NODE) {
pixman_region32_init_rect(&trans_damage, 0, 0, buffer->width, buffer->height);
wlr_region_transform(&trans_damage, &trans_damage,
scene_buffer->transform, buffer->width, buffer->height);
} else {
pixman_region32_init(&trans_damage);
wlr_region_transform(&trans_damage, damage,
scene_buffer->transform, buffer->width, buffer->height);
}
pixman_region32_intersect_rect(&trans_damage, &trans_damage,
box.x, box.y, box.width, box.height);
pixman_region32_translate(&trans_damage, -box.x, -box.y);
struct wlr_scene *scene = scene_node_get_root(&scene_buffer->node);
struct wlr_scene_output *scene_output;
wl_list_for_each(scene_output, &scene->outputs, link) {
float output_scale = scene_output->output->scale;