mirror of
https://gitlab.freedesktop.org/wlroots/wlroots.git
synced 2026-03-31 07:11:32 -04:00
wlr_scene: Nuke buffer output_enter / output_leave
outputs_update should be used instead.
This commit is contained in:
parent
39e918edc8
commit
7f87c7fe90
2 changed files with 4 additions and 35 deletions
|
|
@ -169,8 +169,6 @@ struct wlr_scene_buffer {
|
||||||
|
|
||||||
struct {
|
struct {
|
||||||
struct wl_signal outputs_update; // struct wlr_scene_outputs_update_event
|
struct wl_signal outputs_update; // struct wlr_scene_outputs_update_event
|
||||||
struct wl_signal output_enter; // struct wlr_scene_output
|
|
||||||
struct wl_signal output_leave; // struct wlr_scene_output
|
|
||||||
struct wl_signal output_sample; // struct wlr_scene_output_sample_event
|
struct wl_signal output_sample; // struct wlr_scene_output_sample_event
|
||||||
struct wl_signal frame_done; // struct wlr_scene_frame_done_event
|
struct wl_signal frame_done; // struct wlr_scene_frame_done_event
|
||||||
} events;
|
} events;
|
||||||
|
|
|
||||||
|
|
@ -113,24 +113,11 @@ void wlr_scene_node_destroy(struct wlr_scene_node *node) {
|
||||||
if (node->type == WLR_SCENE_NODE_BUFFER) {
|
if (node->type == WLR_SCENE_NODE_BUFFER) {
|
||||||
struct wlr_scene_buffer *scene_buffer = wlr_scene_buffer_from_node(node);
|
struct wlr_scene_buffer *scene_buffer = wlr_scene_buffer_from_node(node);
|
||||||
|
|
||||||
uint64_t active = scene_buffer->active_outputs;
|
|
||||||
if (active) {
|
|
||||||
struct wlr_scene_output *scene_output;
|
|
||||||
wl_list_for_each(scene_output, &scene->outputs, link) {
|
|
||||||
if (active & (1ull << scene_output->index)) {
|
|
||||||
wl_signal_emit_mutable(&scene_buffer->events.output_leave,
|
|
||||||
scene_output);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
scene_buffer_set_buffer(scene_buffer, NULL);
|
scene_buffer_set_buffer(scene_buffer, NULL);
|
||||||
scene_buffer_set_texture(scene_buffer, NULL);
|
scene_buffer_set_texture(scene_buffer, NULL);
|
||||||
pixman_region32_fini(&scene_buffer->opaque_region);
|
pixman_region32_fini(&scene_buffer->opaque_region);
|
||||||
wlr_drm_syncobj_timeline_unref(scene_buffer->wait_timeline);
|
wlr_drm_syncobj_timeline_unref(scene_buffer->wait_timeline);
|
||||||
|
|
||||||
assert(wl_list_empty(&scene_buffer->events.output_leave.listener_list));
|
|
||||||
assert(wl_list_empty(&scene_buffer->events.output_enter.listener_list));
|
|
||||||
assert(wl_list_empty(&scene_buffer->events.outputs_update.listener_list));
|
assert(wl_list_empty(&scene_buffer->events.outputs_update.listener_list));
|
||||||
assert(wl_list_empty(&scene_buffer->events.output_sample.listener_list));
|
assert(wl_list_empty(&scene_buffer->events.output_sample.listener_list));
|
||||||
assert(wl_list_empty(&scene_buffer->events.frame_done.listener_list));
|
assert(wl_list_empty(&scene_buffer->events.frame_done.listener_list));
|
||||||
|
|
@ -481,28 +468,12 @@ static void update_node_update_outputs(struct wlr_scene_node *node,
|
||||||
(struct wlr_linux_dmabuf_feedback_v1_init_options){0};
|
(struct wlr_linux_dmabuf_feedback_v1_init_options){0};
|
||||||
}
|
}
|
||||||
|
|
||||||
uint64_t old_active = scene_buffer->active_outputs;
|
|
||||||
scene_buffer->active_outputs = active_outputs;
|
|
||||||
|
|
||||||
struct wlr_scene_output *scene_output;
|
|
||||||
wl_list_for_each(scene_output, outputs, link) {
|
|
||||||
uint64_t mask = 1ull << scene_output->index;
|
|
||||||
bool intersects = active_outputs & mask;
|
|
||||||
bool intersects_before = old_active & mask;
|
|
||||||
|
|
||||||
if (intersects && !intersects_before) {
|
|
||||||
wl_signal_emit_mutable(&scene_buffer->events.output_enter, scene_output);
|
|
||||||
} else if (!intersects && intersects_before) {
|
|
||||||
wl_signal_emit_mutable(&scene_buffer->events.output_leave, scene_output);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// if there are active outputs on this node, we should always have a primary
|
// if there are active outputs on this node, we should always have a primary
|
||||||
// output
|
// output
|
||||||
assert(!scene_buffer->active_outputs || scene_buffer->primary_output);
|
assert(!active_outputs || scene_buffer->primary_output);
|
||||||
|
|
||||||
// Skip output update event if nothing was updated
|
// Skip output update event if nothing was updated
|
||||||
if (old_active == active_outputs &&
|
if (scene_buffer->active_outputs == active_outputs &&
|
||||||
(!force || ((1ull << force->index) & ~active_outputs)) &&
|
(!force || ((1ull << force->index) & ~active_outputs)) &&
|
||||||
old_primary_output == scene_buffer->primary_output) {
|
old_primary_output == scene_buffer->primary_output) {
|
||||||
return;
|
return;
|
||||||
|
|
@ -515,6 +486,7 @@ static void update_node_update_outputs(struct wlr_scene_node *node,
|
||||||
};
|
};
|
||||||
|
|
||||||
size_t i = 0;
|
size_t i = 0;
|
||||||
|
struct wlr_scene_output *scene_output;
|
||||||
wl_list_for_each(scene_output, outputs, link) {
|
wl_list_for_each(scene_output, outputs, link) {
|
||||||
if (~active_outputs & (1ull << scene_output->index)) {
|
if (~active_outputs & (1ull << scene_output->index)) {
|
||||||
continue;
|
continue;
|
||||||
|
|
@ -524,6 +496,7 @@ static void update_node_update_outputs(struct wlr_scene_node *node,
|
||||||
outputs_array[i++] = scene_output;
|
outputs_array[i++] = scene_output;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
scene_buffer->active_outputs = active_outputs;
|
||||||
wl_signal_emit_mutable(&scene_buffer->events.outputs_update, &event);
|
wl_signal_emit_mutable(&scene_buffer->events.outputs_update, &event);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -869,8 +842,6 @@ struct wlr_scene_buffer *wlr_scene_buffer_create(struct wlr_scene_tree *parent,
|
||||||
scene_node_init(&scene_buffer->node, WLR_SCENE_NODE_BUFFER, parent);
|
scene_node_init(&scene_buffer->node, WLR_SCENE_NODE_BUFFER, parent);
|
||||||
|
|
||||||
wl_signal_init(&scene_buffer->events.outputs_update);
|
wl_signal_init(&scene_buffer->events.outputs_update);
|
||||||
wl_signal_init(&scene_buffer->events.output_enter);
|
|
||||||
wl_signal_init(&scene_buffer->events.output_leave);
|
|
||||||
wl_signal_init(&scene_buffer->events.output_sample);
|
wl_signal_init(&scene_buffer->events.output_sample);
|
||||||
wl_signal_init(&scene_buffer->events.frame_done);
|
wl_signal_init(&scene_buffer->events.frame_done);
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue