diff options
author | Daniel Stone <daniels@collabora.com> | 2016-11-14 17:46:59 +0000 |
---|---|---|
committer | Daniel Stone <daniels@collabora.com> | 2017-02-07 19:16:32 +0000 |
commit | 7068aed2635bf56b74224970bfac01f0e560ab40 (patch) | |
tree | dedf7cc94a0a64d369c7cd53fd8c7a1d9ec66f97 | |
parent | b895fb260e61dd4cffd562899352db120c6cad77 (diff) |
compositor-drm: Don't repaint if no damage
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.
Differential Revision: https://phabricator.freedesktop.org/D1499
Signed-off-by: Daniel Stone <daniels@collabora.com>
-rw-r--r-- | libweston/compositor-drm.c | 15 |
1 files changed, 13 insertions, 2 deletions
diff --git a/libweston/compositor-drm.c b/libweston/compositor-drm.c index f0cc1b4d..7eae4617 100644 --- a/libweston/compositor-drm.c +++ b/libweston/compositor-drm.c @@ -1429,6 +1429,7 @@ drm_output_render(struct drm_output *output, pixman_region32_t *damage) { 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; @@ -1439,10 +1440,20 @@ drm_output_render(struct drm_output *output, 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(output, damage); - else + } else { fb = drm_output_render_gl(output, damage); + } if (!fb) { drm_plane_state_put_back(scanout_state); |