mirror of
https://gitlab.freedesktop.org/wayland/weston.git
synced 2025-12-20 04:40:07 +01:00
compositor: Try to remove some unnecessary repaints
If a surface isn't visible, there's no point in performing a repaint when its state changes. However, we don't know if a surface is visible until we perform the scene graph updates at repaint. Use our new visibility tracking API to check whether we need to perform a repaint, or if we can just skip it. Signed-off-by: Derek Foreman <derek.foreman@collabora.com>
This commit is contained in:
parent
61134fa151
commit
73e0bb2829
1 changed files with 16 additions and 5 deletions
|
|
@ -462,17 +462,27 @@ weston_subsurface_parent_apply(struct weston_subsurface *sub)
|
|||
|
||||
/**
|
||||
* \param surface The surface to be repainted
|
||||
* \param status The weston_surface_status last applied
|
||||
*
|
||||
* Marks the output(s) that the surface is shown on as needing to be
|
||||
* repainted. See weston_output_schedule_repaint().
|
||||
* repainted. Tries to avoid repaints on occluded surfaces when
|
||||
* possible by checking surface status dirty bits.
|
||||
*
|
||||
* See weston_output_schedule_repaint().
|
||||
*/
|
||||
static void
|
||||
weston_surface_schedule_repaint(struct weston_surface *surface)
|
||||
weston_surface_schedule_repaint(struct weston_surface *surface,
|
||||
enum weston_surface_status status)
|
||||
{
|
||||
struct weston_output *output;
|
||||
uint32_t visible_mask;
|
||||
|
||||
if (status == WESTON_SURFACE_CLEAN)
|
||||
return;
|
||||
|
||||
visible_mask = weston_surface_visibility_mask(surface);
|
||||
wl_list_for_each(output, &surface->compositor->output_list, link) {
|
||||
if (surface->output_mask & (1u << output->id))
|
||||
if (visible_mask & (1u << output->id))
|
||||
weston_output_schedule_repaint(output);
|
||||
}
|
||||
}
|
||||
|
|
@ -483,10 +493,11 @@ weston_surface_apply(struct weston_surface *surface,
|
|||
{
|
||||
WESTON_TRACE_FUNC_FLOW(&state->flow_id);
|
||||
struct weston_subsurface *sub;
|
||||
enum weston_surface_status status;
|
||||
|
||||
weston_surface_apply_state(surface, state);
|
||||
status = weston_surface_apply_state(surface, state);
|
||||
|
||||
weston_surface_schedule_repaint(surface);
|
||||
weston_surface_schedule_repaint(surface, status);
|
||||
|
||||
wl_list_for_each(sub, &surface->subsurface_list, parent_link) {
|
||||
if (sub->surface != surface)
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue