mirror of
https://gitlab.freedesktop.org/wlroots/wlroots.git
synced 2024-11-25 00:22:25 +00:00
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:
parent
1e949402b0
commit
402a862413
@ -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);
|
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.
|
* This is a utility function that can be called when compositors render.
|
||||||
*/
|
*/
|
||||||
|
@ -81,12 +81,6 @@ void wlr_output_add_software_cursors_to_render_pass(struct wlr_output *output,
|
|||||||
int width, height;
|
int width, height;
|
||||||
wlr_output_transformed_resolution(output, &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;
|
struct wlr_output_cursor *cursor;
|
||||||
wl_list_for_each(cursor, &output->cursors, link) {
|
wl_list_for_each(cursor, &output->cursors, link) {
|
||||||
if (!cursor->enabled || !cursor->visible ||
|
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;
|
struct wlr_box box;
|
||||||
output_cursor_get_box(cursor, &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_t cursor_damage;
|
||||||
pixman_region32_init_rect(&cursor_damage, box.x, box.y, box.width, box.height);
|
pixman_region32_init_rect(&cursor_damage,
|
||||||
pixman_region32_intersect(&cursor_damage, &cursor_damage, &render_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)) {
|
if (!pixman_region32_not_empty(&cursor_damage)) {
|
||||||
pixman_region32_fini(&cursor_damage);
|
pixman_region32_fini(&cursor_damage);
|
||||||
continue;
|
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) {
|
wlr_render_pass_add_texture(render_pass, &(struct wlr_render_texture_options) {
|
||||||
.texture = texture,
|
.texture = texture,
|
||||||
.src_box = cursor->src_box,
|
.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(&cursor_damage);
|
||||||
}
|
}
|
||||||
|
|
||||||
pixman_region32_fini(&render_damage);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void output_cursor_damage_whole(struct wlr_output_cursor *cursor) {
|
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;
|
wlr_output_add_software_cursors_to_render_pass(output, render_pass, &render_data.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);
|
|
||||||
|
|
||||||
pixman_region32_fini(&render_data.damage);
|
pixman_region32_fini(&render_data.damage);
|
||||||
|
|
||||||
if (!wlr_render_pass_submit(render_pass)) {
|
if (!wlr_render_pass_submit(render_pass)) {
|
||||||
|
Loading…
Reference in New Issue
Block a user