scene: don't assign outputs to invisible nodes

If a node has no visible areas, leave active_outputs empty.

Fixes: 95b2771bfd ("scene: ignore outputs with too small intersection with nodes")
This commit is contained in:
Simon Ser 2025-12-28 22:30:25 +01:00
parent 9119b8aa85
commit 8611aa8440

View file

@ -426,6 +426,7 @@ static void update_node_update_outputs(struct wlr_scene_node *node,
size_t count = 0; size_t count = 0;
uint64_t active_outputs = 0; uint64_t active_outputs = 0;
if (!pixman_region32_empty(&node->visible)) {
uint32_t visible_area = region_area(&node->visible); uint32_t visible_area = region_area(&node->visible);
// let's update the outputs in two steps: // let's update the outputs in two steps:
@ -470,6 +471,7 @@ static void update_node_update_outputs(struct wlr_scene_node *node,
count++; count++;
} }
} }
}
if (old_primary_output != scene_buffer->primary_output) { if (old_primary_output != scene_buffer->primary_output) {
scene_buffer->prev_feedback_options = scene_buffer->prev_feedback_options =
@ -479,6 +481,7 @@ static void update_node_update_outputs(struct wlr_scene_node *node,
uint64_t old_active = scene_buffer->active_outputs; uint64_t old_active = scene_buffer->active_outputs;
scene_buffer->active_outputs = active_outputs; scene_buffer->active_outputs = active_outputs;
struct wlr_scene_output *scene_output;
wl_list_for_each(scene_output, outputs, link) { wl_list_for_each(scene_output, outputs, link) {
uint64_t mask = 1ull << scene_output->index; uint64_t mask = 1ull << scene_output->index;
bool intersects = active_outputs & mask; bool intersects = active_outputs & mask;