mirror of
https://gitlab.freedesktop.org/wayland/weston.git
synced 2026-05-08 01:58:03 +02:00
compositor: Track which plane a surface is on
We start tracking which hardware plane a surface is displayed on, which lets us avoid generating damage when a hardware overlay/cursor is moved around.
This commit is contained in:
parent
f6f69d3250
commit
d553bfc127
3 changed files with 17 additions and 8 deletions
|
|
@ -42,6 +42,10 @@
|
|||
#include "launcher-util.h"
|
||||
#include "log.h"
|
||||
|
||||
enum {
|
||||
WESTON_PLANE_DRM_CURSOR = 0x100
|
||||
};
|
||||
|
||||
struct drm_compositor {
|
||||
struct weston_compositor base;
|
||||
|
||||
|
|
@ -635,7 +639,6 @@ weston_output_set_cursor(struct weston_output *output,
|
|||
pixman_region32_t *overlap)
|
||||
{
|
||||
pixman_region32_t cursor_region;
|
||||
int prior_was_hardware;
|
||||
|
||||
if (seat->sprite == NULL)
|
||||
return;
|
||||
|
|
@ -650,19 +653,18 @@ weston_output_set_cursor(struct weston_output *output,
|
|||
goto out;
|
||||
}
|
||||
|
||||
prior_was_hardware = seat->hw_cursor;
|
||||
if (pixman_region32_not_empty(overlap) ||
|
||||
drm_output_set_cursor(output, seat) < 0) {
|
||||
if (prior_was_hardware) {
|
||||
if (seat->sprite->plane == WESTON_PLANE_DRM_CURSOR) {
|
||||
weston_surface_damage(seat->sprite);
|
||||
drm_output_set_cursor(output, NULL);
|
||||
}
|
||||
seat->hw_cursor = 0;
|
||||
seat->sprite->plane = WESTON_PLANE_PRIMARY;
|
||||
} else {
|
||||
if (!prior_was_hardware)
|
||||
if (seat->sprite->plane == WESTON_PLANE_PRIMARY)
|
||||
weston_surface_damage_below(seat->sprite);
|
||||
wl_list_remove(&seat->sprite->link);
|
||||
seat->hw_cursor = 1;
|
||||
seat->sprite->plane = WESTON_PLANE_DRM_CURSOR;
|
||||
}
|
||||
|
||||
out:
|
||||
|
|
@ -705,7 +707,7 @@ drm_assign_planes(struct weston_output *output)
|
|||
weston_output_set_cursor(output, seat,
|
||||
&surface_overlap);
|
||||
|
||||
if (!seat->hw_cursor)
|
||||
if (seat->sprite->plane == WESTON_PLANE_PRIMARY)
|
||||
pixman_region32_union(&overlap, &overlap,
|
||||
&es->transform.boundingbox);
|
||||
} else if (!drm_output_prepare_overlay_surface(output, es,
|
||||
|
|
|
|||
|
|
@ -306,6 +306,9 @@ weston_surface_damage_below(struct weston_surface *surface)
|
|||
struct weston_compositor *compositor = surface->compositor;
|
||||
pixman_region32_t damage;
|
||||
|
||||
if (surface->plane != WESTON_PLANE_PRIMARY)
|
||||
return;
|
||||
|
||||
pixman_region32_init(&damage);
|
||||
pixman_region32_subtract(&damage, &surface->transform.boundingbox,
|
||||
&surface->clip);
|
||||
|
|
|
|||
|
|
@ -222,7 +222,6 @@ struct weston_seat {
|
|||
int32_t hotspot_x, hotspot_y;
|
||||
struct wl_list link;
|
||||
enum weston_keyboard_modifier modifier_state;
|
||||
int hw_cursor;
|
||||
struct wl_surface *saved_kbd_focus;
|
||||
struct wl_listener saved_kbd_focus_listener;
|
||||
|
||||
|
|
@ -382,6 +381,10 @@ struct weston_region {
|
|||
* transformation in global coordinates, add it to the tail of the list.
|
||||
*/
|
||||
|
||||
enum {
|
||||
WESTON_PLANE_PRIMARY
|
||||
};
|
||||
|
||||
struct weston_surface {
|
||||
struct wl_surface surface;
|
||||
struct weston_compositor *compositor;
|
||||
|
|
@ -398,6 +401,7 @@ struct weston_surface {
|
|||
GLfloat opaque_rect[4];
|
||||
GLfloat alpha;
|
||||
int blend;
|
||||
int plane;
|
||||
|
||||
/* Surface geometry state, mutable.
|
||||
* If you change anything, set dirty = 1.
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue