wayland/surface: Process damage also for non-actor surfaces

The texture still needs to be updated with damaged content.

https://gitlab.gnome.org/GNOME/mutter/issues/199
This commit is contained in:
Jonas Ådahl 2019-02-08 19:42:06 +01:00
parent 944a4763f6
commit d2f1edd6c6

View File

@ -283,7 +283,7 @@ surface_process_damage (MetaWaylandSurface *surface,
cairo_region_t *transformed_region; cairo_region_t *transformed_region;
cairo_region_t *viewport_region; cairo_region_t *viewport_region;
ClutterRect src_rect; ClutterRect src_rect;
int i, n_rectangles; MetaSurfaceActor *actor;
/* If the client destroyed the buffer it attached before committing, but /* If the client destroyed the buffer it attached before committing, but
* still posted damage, or posted damage without any buffer, don't try to * still posted damage, or posted damage without any buffer, don't try to
@ -345,19 +345,22 @@ surface_process_damage (MetaWaylandSurface *surface,
/* First update the buffer. */ /* First update the buffer. */
meta_wayland_buffer_process_damage (buffer, buffer_region); meta_wayland_buffer_process_damage (buffer, buffer_region);
/* Now damage the actor. The actor expects damage in the unscaled texture actor = meta_wayland_surface_get_actor (surface);
* coordinate space, i.e. same as the buffer. */ if (actor)
/* XXX: Should this be a signal / callback on MetaWaylandBuffer instead? */ {
int i, n_rectangles;
n_rectangles = cairo_region_num_rectangles (buffer_region); n_rectangles = cairo_region_num_rectangles (buffer_region);
for (i = 0; i < n_rectangles; i++) for (i = 0; i < n_rectangles; i++)
{ {
cairo_rectangle_int_t rect; cairo_rectangle_int_t rect;
cairo_region_get_rectangle (buffer_region, i, &rect); cairo_region_get_rectangle (buffer_region, i, &rect);
meta_surface_actor_process_damage (meta_wayland_surface_get_actor (surface), meta_surface_actor_process_damage (actor,
rect.x, rect.y, rect.x, rect.y,
rect.width, rect.height); rect.width, rect.height);
} }
}
cairo_region_destroy (viewport_region); cairo_region_destroy (viewport_region);
cairo_region_destroy (scaled_region); cairo_region_destroy (scaled_region);
@ -774,9 +777,8 @@ meta_wayland_surface_apply_pending_state (MetaWaylandSurface *surface,
surface->viewport.has_dst_size = surface->viewport.dst_width > 0; surface->viewport.has_dst_size = surface->viewport.dst_width > 0;
} }
if (meta_wayland_surface_get_actor (surface) && if (!cairo_region_is_empty (pending->surface_damage) ||
(!cairo_region_is_empty (pending->surface_damage) || !cairo_region_is_empty (pending->buffer_damage))
!cairo_region_is_empty (pending->buffer_damage)))
surface_process_damage (surface, surface_process_damage (surface,
pending->surface_damage, pending->surface_damage,
pending->buffer_damage); pending->buffer_damage);