output: Change wlr_output_add_software_cursors_to_render_pass to take buffer coordinates

Since wlr_damage_ring now only works with buffer local coordinates, this
creates an inpedance mismatch for compositors that want to use this
function. Instead of compositors needing to the the conversion itself,
change thu function to take buffer local coordinates directly.
This commit is contained in:
Alexander Orezechowski 2024-10-11 12:35:57 -04:00 committed by Kirill Primak
parent 1e949402b0
commit 402a862413
3 changed files with 10 additions and 24 deletions

View File

@ -380,7 +380,7 @@ void wlr_output_lock_attach_render(struct wlr_output *output, bool lock);
*/
void wlr_output_lock_software_cursors(struct wlr_output *output, bool lock);
/**
* Render software cursors.
* Render software cursors. The damage is in buffer-local coordinate space.
*
* This is a utility function that can be called when compositors render.
*/

View File

@ -81,12 +81,6 @@ void wlr_output_add_software_cursors_to_render_pass(struct wlr_output *output,
int width, height;
wlr_output_transformed_resolution(output, &width, &height);
pixman_region32_t render_damage;
pixman_region32_init_rect(&render_damage, 0, 0, width, height);
if (damage != NULL) {
pixman_region32_intersect(&render_damage, &render_damage, damage);
}
struct wlr_output_cursor *cursor;
wl_list_for_each(cursor, &output->cursors, link) {
if (!cursor->enabled || !cursor->visible ||
@ -101,20 +95,21 @@ void wlr_output_add_software_cursors_to_render_pass(struct wlr_output *output,
struct wlr_box box;
output_cursor_get_box(cursor, &box);
wlr_box_transform(&box, &box,
wlr_output_transform_invert(output->transform), width, height);
pixman_region32_t cursor_damage;
pixman_region32_init_rect(&cursor_damage, box.x, box.y, box.width, box.height);
pixman_region32_intersect(&cursor_damage, &cursor_damage, &render_damage);
pixman_region32_init_rect(&cursor_damage,
box.x, box.y, box.width, box.height);
if (damage != NULL) {
pixman_region32_intersect(&cursor_damage, &cursor_damage, damage);
}
if (!pixman_region32_not_empty(&cursor_damage)) {
pixman_region32_fini(&cursor_damage);
continue;
}
enum wl_output_transform transform =
wlr_output_transform_invert(output->transform);
wlr_box_transform(&box, &box, transform, width, height);
wlr_region_transform(&cursor_damage, &cursor_damage, transform, width, height);
wlr_render_pass_add_texture(render_pass, &(struct wlr_render_texture_options) {
.texture = texture,
.src_box = cursor->src_box,
@ -125,8 +120,6 @@ void wlr_output_add_software_cursors_to_render_pass(struct wlr_output *output,
pixman_region32_fini(&cursor_damage);
}
pixman_region32_fini(&render_damage);
}
static void output_cursor_damage_whole(struct wlr_output_cursor *cursor) {

View File

@ -2208,14 +2208,7 @@ bool wlr_scene_output_build_state(struct wlr_scene_output *scene_output,
}
}
pixman_region32_t cursor_damage;
pixman_region32_init(&cursor_damage);
pixman_region32_copy(&cursor_damage, &render_data.damage);
wlr_region_transform(&cursor_damage, &cursor_damage,
output->transform, resolution_width, resolution_height);
wlr_output_add_software_cursors_to_render_pass(output, render_pass, &cursor_damage);
pixman_region32_fini(&cursor_damage);
wlr_output_add_software_cursors_to_render_pass(output, render_pass, &render_data.damage);
pixman_region32_fini(&render_data.damage);
if (!wlr_render_pass_submit(render_pass)) {