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.
Kristian Høgsberg 13 years ago
parent f6f69d3250
commit d553bfc127
  1. 16
      src/compositor-drm.c
  2. 3
      src/compositor.c
  3. 6
      src/compositor.h

@ -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…
Cancel
Save