If we don't have any damage for the primary plane, then don't force a repaint; simply reuse the old buffer we already have.
Signed-off-by: Daniel Stone <dani...@collabora.com> --- libweston/compositor-drm.c | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/libweston/compositor-drm.c b/libweston/compositor-drm.c index bf3273ba..ca4146a5 100644 --- a/libweston/compositor-drm.c +++ b/libweston/compositor-drm.c @@ -1507,6 +1507,7 @@ drm_output_render(struct drm_output_state *state, pixman_region32_t *damage) struct drm_output *output = state->output; struct weston_compositor *c = output->base.compositor; struct drm_plane_state *scanout_state; + struct drm_plane *scanout_plane = output->scanout_plane; struct drm_backend *b = to_drm_backend(c); struct drm_fb *fb; @@ -1517,10 +1518,20 @@ drm_output_render(struct drm_output_state *state, pixman_region32_t *damage) if (scanout_state->fb) return; - if (b->use_pixman) + if (!pixman_region32_not_empty(damage) && + scanout_plane->state_cur->fb && + (scanout_plane->state_cur->fb->type == BUFFER_GBM_SURFACE || + scanout_plane->state_cur->fb->type == BUFFER_PIXMAN_DUMB) && + scanout_plane->state_cur->fb->width == + output->base.current_mode->width && + scanout_plane->state_cur->fb->height == + output->base.current_mode->height) { + fb = drm_fb_ref(scanout_plane->state_cur->fb); + } else if (b->use_pixman) { fb = drm_output_render_pixman(state, damage); - else + } else { fb = drm_output_render_gl(state, damage); + } if (!fb) { drm_plane_state_put_back(scanout_state); -- 2.13.3 _______________________________________________ wayland-devel mailing list wayland-devel@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/wayland-devel