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.
master
Alexander Orezechowski 1 month ago committed by itycodes
parent 3cd7c40544
commit fd23474497

@ -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.
*/

@ -92,12 +92,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 ||
@ -112,20 +106,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,
@ -136,8 +131,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) {

@ -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)) {

Loading…
Cancel
Save