compositor: Keep fade surface around while we're fading

This removes more special cases from weston_output_repaint() and we
avoid creating and destroying the surface for each animation frame.
We gain another special case in weston_compositor_top(), but that's
less of a problem, and we'll fix that later.
dev
Kristian Høgsberg 13 years ago
parent 607c1a769d
commit 681f9f4149
  1. 41
      src/compositor.c
  2. 1
      src/compositor.h

@ -618,6 +618,9 @@ weston_compositor_top(struct weston_compositor *compositor)
/* Insert below pointer */ /* Insert below pointer */
list = &compositor->surface_list; list = &compositor->surface_list;
if (compositor->fade.surface &&
list->next == &compositor->fade.surface->link)
list = list->next;
if (list->next == &input_device->sprite->link) if (list->next == &input_device->sprite->link)
list = list->next; list = list->next;
@ -677,21 +680,28 @@ fade_frame(struct weston_animation *animation,
struct weston_compositor *compositor = struct weston_compositor *compositor =
container_of(animation, container_of(animation,
struct weston_compositor, fade.animation); struct weston_compositor, fade.animation);
struct weston_surface *surface;
surface = compositor->fade.surface;
weston_spring_update(&compositor->fade.spring, msecs); weston_spring_update(&compositor->fade.spring, msecs);
weston_surface_set_color(surface, 0.0, 0.0, 0.0,
compositor->fade.spring.current);
weston_surface_damage(surface);
if (weston_spring_done(&compositor->fade.spring)) { if (weston_spring_done(&compositor->fade.spring)) {
compositor->fade.spring.current = compositor->fade.spring.current =
compositor->fade.spring.target; compositor->fade.spring.target;
wl_list_remove(&animation->link); wl_list_remove(&animation->link);
wl_list_init(&animation->link); wl_list_init(&animation->link);
if (compositor->fade.spring.current > 0.999) { if (compositor->fade.spring.current < 0.001) {
destroy_surface(&surface->surface.resource);
compositor->fade.surface = NULL;
} else if (compositor->fade.spring.current > 0.999) {
compositor->state = WESTON_COMPOSITOR_SLEEPING; compositor->state = WESTON_COMPOSITOR_SLEEPING;
compositor->shell->lock(compositor->shell); compositor->shell->lock(compositor->shell);
} }
} }
weston_output_damage(output);
} }
static void static void
@ -747,7 +757,7 @@ static void
weston_output_repaint(struct weston_output *output, int msecs) weston_output_repaint(struct weston_output *output, int msecs)
{ {
struct weston_compositor *ec = output->compositor; struct weston_compositor *ec = output->compositor;
struct weston_surface *es, *solid = NULL; struct weston_surface *es;
struct weston_animation *animation, *next; struct weston_animation *animation, *next;
struct weston_frame_callback *cb, *cnext; struct weston_frame_callback *cb, *cnext;
pixman_region32_t opaque, new_damage, total_damage, pixman_region32_t opaque, new_damage, total_damage,
@ -755,16 +765,6 @@ weston_output_repaint(struct weston_output *output, int msecs)
glViewport(0, 0, output->current->width, output->current->height); glViewport(0, 0, output->current->width, output->current->height);
if (ec->fade.spring.current >= 0.001) {
solid = weston_surface_create(ec,
output->x, output->y,
output->current->width,
output->current->height);
weston_surface_set_color(solid, 0.0, 0.0, 0.0,
ec->fade.spring.current);
wl_list_insert(&ec->surface_list, &solid->link);
}
pixman_region32_init(&new_damage); pixman_region32_init(&new_damage);
pixman_region32_init(&opaque); pixman_region32_init(&opaque);
pixman_region32_init(&overlap); pixman_region32_init(&overlap);
@ -806,9 +806,6 @@ weston_output_repaint(struct weston_output *output, int msecs)
output->repaint(output); output->repaint(output);
if (solid)
destroy_surface(&solid->surface.resource);
pixman_region32_fini(&total_damage); pixman_region32_fini(&total_damage);
output->repaint_needed = 0; output->repaint_needed = 0;
@ -866,6 +863,7 @@ weston_compositor_schedule_repaint(struct weston_compositor *compositor)
WL_EXPORT void WL_EXPORT void
weston_compositor_fade(struct weston_compositor *compositor, float tint) weston_compositor_fade(struct weston_compositor *compositor, float tint)
{ {
struct weston_surface *surface;
int done; int done;
done = weston_spring_done(&compositor->fade.spring); done = weston_spring_done(&compositor->fade.spring);
@ -877,7 +875,14 @@ weston_compositor_fade(struct weston_compositor *compositor, float tint)
compositor->fade.spring.timestamp = compositor->fade.spring.timestamp =
weston_compositor_get_time(); weston_compositor_get_time();
weston_compositor_damage_all(compositor); if (compositor->fade.surface == NULL) {
surface = weston_surface_create(compositor, 0, 0, 8192, 8192);
weston_surface_set_color(surface, 0.0, 0.0, 0.0, 0.0);
wl_list_insert(&compositor->surface_list, &surface->link);
compositor->fade.surface = surface;
}
weston_surface_damage(compositor->fade.surface);
if (wl_list_empty(&compositor->fade.animation.link)) if (wl_list_empty(&compositor->fade.animation.link))
wl_list_insert(compositor->animation_list.prev, wl_list_insert(compositor->animation_list.prev,
&compositor->fade.animation.link); &compositor->fade.animation.link);

@ -182,6 +182,7 @@ struct weston_compositor {
struct { struct {
struct weston_spring spring; struct weston_spring spring;
struct weston_animation animation; struct weston_animation animation;
struct weston_surface *surface;
} fade; } fade;
uint32_t state; uint32_t state;

Loading…
Cancel
Save