pixman_region32_init(&surface->damage);
pixman_region32_init(&surface->opaque);
+ pixman_region32_init(&surface->clip);
undef_region(&surface->input);
pixman_region32_init(&surface->transform.opaque);
wl_list_init(&surface->frame_callback_list);
pixman_region32_fini(&surface->transform.boundingbox);
pixman_region32_fini(&surface->damage);
pixman_region32_fini(&surface->opaque);
+ pixman_region32_fini(&surface->clip);
if (!region_is_undefined(&surface->input))
pixman_region32_fini(&surface->input);
}
WL_EXPORT void
-weston_surface_draw(struct weston_surface *es, struct weston_output *output)
+weston_surface_draw(struct weston_surface *es, struct weston_output *output,
+ pixman_region32_t *damage)
{
struct weston_compositor *ec = es->compositor;
GLfloat *v;
int n;
pixman_region32_init(&repaint);
- pixman_region32_intersect(&repaint, &es->transform.boundingbox,
- &output->region);
- pixman_region32_intersect(&repaint, &repaint, &es->damage);
-
- /* Clear damage, assume outputs do not overlap. */
- pixman_region32_subtract(&es->damage, &es->damage, &output->region);
+ pixman_region32_intersect(&repaint,
+ &es->transform.boundingbox, damage);
+ pixman_region32_subtract(&repaint, &repaint, &es->clip);
if (!pixman_region32_not_empty(&repaint))
goto out;
struct weston_surface *es;
struct weston_animation *animation, *next;
struct weston_frame_callback *cb, *cnext;
- pixman_region32_t opaque, new_damage, total_damage;
+ pixman_region32_t opaque, new_damage, output_damage;
int32_t width, height;
weston_compositor_update_drag_surfaces(ec);
output->border.top + output->border.bottom;
glViewport(0, 0, width, height);
- pixman_region32_init(&new_damage);
- pixman_region32_init(&opaque);
-
wl_list_for_each(es, &ec->surface_list, link)
/* Update surface transform now to avoid calling it ever
* again from the repaint sub-functions. */
*/
output->assign_planes(output);
+ pixman_region32_init(&new_damage);
+ pixman_region32_init(&opaque);
+
wl_list_for_each(es, &ec->surface_list, link) {
pixman_region32_subtract(&es->damage, &es->damage, &opaque);
pixman_region32_union(&new_damage, &new_damage, &es->damage);
+ empty_region(&es->damage);
+ pixman_region32_copy(&es->clip, &opaque);
pixman_region32_union(&opaque, &opaque, &es->transform.opaque);
}
- pixman_region32_init(&total_damage);
- pixman_region32_union(&total_damage, &new_damage,
- &output->previous_damage);
- pixman_region32_intersect(&output->previous_damage,
- &new_damage, &output->region);
+ pixman_region32_union(&ec->damage, &ec->damage, &new_damage);
+
+ pixman_region32_init(&output_damage);
+ pixman_region32_union(&output_damage,
+ &ec->damage, &output->previous_damage);
+ pixman_region32_copy(&output->previous_damage, &ec->damage);
+ pixman_region32_intersect(&output_damage,
+ &output_damage, &output->region);
+ pixman_region32_subtract(&ec->damage, &ec->damage, &output->region);
pixman_region32_fini(&opaque);
pixman_region32_fini(&new_damage);
- wl_list_for_each(es, &ec->surface_list, link) {
- pixman_region32_copy(&es->damage, &total_damage);
- pixman_region32_subtract(&total_damage,
- &total_damage, &es->transform.opaque);
- }
-
if (output->dirty)
weston_output_update_matrix(output);
- output->repaint(output);
+ output->repaint(output, &output_damage);
- pixman_region32_fini(&total_damage);
+ pixman_region32_fini(&output_damage);
output->repaint_needed = 0;
struct weston_mode *current;
struct wl_list mode_list;
- void (*repaint)(struct weston_output *output);
+ void (*repaint)(struct weston_output *output,
+ pixman_region32_t *damage);
void (*destroy)(struct weston_output *output);
void (*assign_planes)(struct weston_output *output);
int idle_time; /* effective timeout, s */
/* Repaint state. */
- struct timespec previous_swap;
struct wl_array vertices, indices;
+ pixman_region32_t damage;
uint32_t focus;
struct wl_surface surface;
struct weston_compositor *compositor;
GLuint texture;
+ pixman_region32_t clip;
pixman_region32_t damage;
pixman_region32_t opaque;
pixman_region32_t input;
weston_surface_activate(struct weston_surface *surface,
struct weston_input_device *device, uint32_t time);
void
-weston_surface_draw(struct weston_surface *es, struct weston_output *output);
+weston_surface_draw(struct weston_surface *es,
+ struct weston_output *output, pixman_region32_t *damage);
void
notify_motion(struct wl_input_device *device,