diff options
-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); |