diff options
author | Daniel Stone <daniels@collabora.com> | 2016-10-24 14:54:53 +0100 |
---|---|---|
committer | Daniel Stone <daniels@collabora.com> | 2017-02-07 19:16:31 +0000 |
commit | fef7cb2e20daae342afbb4aa2ab71fc7a38c375d (patch) | |
tree | 8019843ce535550b370acc265041f1d7fee176d0 | |
parent | 091462606ecc166f54bc6d6afea1cdc4e8b5e753 (diff) |
compositor-drm: Return FB directly from render
Instead of setting state members directly in the drm_output_render
functions (to paint using Pixman or GL), just return a drm_fb, and let
the core function place it in state.
Signed-off-by: Daniel Stone <daniels@collabora.com>
Differential Revision: https://phabricator.freedesktop.org/D1419
-rw-r--r-- | libweston/compositor-drm.c | 30 |
1 files changed, 19 insertions, 11 deletions
diff --git a/libweston/compositor-drm.c b/libweston/compositor-drm.c index dcb40d1f..3cbb1513 100644 --- a/libweston/compositor-drm.c +++ b/libweston/compositor-drm.c @@ -614,11 +614,12 @@ drm_output_prepare_scanout_view(struct drm_output *output, return &output->fb_plane; } -static void +static struct drm_fb * drm_output_render_gl(struct drm_output *output, pixman_region32_t *damage) { struct drm_backend *b = to_drm_backend(output->base.compositor); struct gbm_bo *bo; + struct drm_fb *ret; output->base.compositor->renderer->repaint_output(&output->base, damage); @@ -626,20 +627,21 @@ drm_output_render_gl(struct drm_output *output, pixman_region32_t *damage) bo = gbm_surface_lock_front_buffer(output->gbm_surface); if (!bo) { weston_log("failed to lock front buffer: %m\n"); - return; + return NULL; } - output->fb_pending = drm_fb_get_from_bo(bo, b, output->gbm_format, - BUFFER_GBM_SURFACE); - if (!output->fb_pending) { + ret = drm_fb_get_from_bo(bo, b, output->gbm_format, BUFFER_GBM_SURFACE); + if (!ret) { weston_log("failed to get drm_fb for bo\n"); gbm_surface_release_buffer(output->gbm_surface, bo); - return; + return NULL; } - output->fb_pending->gbm_surface = output->gbm_surface; + ret->gbm_surface = output->gbm_surface; + + return ret; } -static void +static struct drm_fb * drm_output_render_pixman(struct drm_output *output, pixman_region32_t *damage) { struct weston_compositor *ec = output->base.compositor; @@ -655,7 +657,6 @@ drm_output_render_pixman(struct drm_output *output, pixman_region32_t *damage) output->current_image ^= 1; - output->fb_pending = drm_fb_ref(output->dumb[output->current_image]); pixman_renderer_output_set_buffer(&output->base, output->image[output->current_image]); @@ -663,6 +664,8 @@ drm_output_render_pixman(struct drm_output *output, pixman_region32_t *damage) pixman_region32_fini(&total_damage); pixman_region32_fini(&previous_damage); + + return drm_fb_ref(output->dumb[output->current_image]); } static void @@ -670,6 +673,7 @@ drm_output_render(struct drm_output *output, pixman_region32_t *damage) { struct weston_compositor *c = output->base.compositor; struct drm_backend *b = to_drm_backend(c); + struct drm_fb *fb; /* If we already have a client buffer promoted to scanout, then we don't * want to render. */ @@ -677,9 +681,13 @@ drm_output_render(struct drm_output *output, pixman_region32_t *damage) return; if (b->use_pixman) - drm_output_render_pixman(output, damage); + fb = drm_output_render_pixman(output, damage); else - drm_output_render_gl(output, damage); + fb = drm_output_render_gl(output, damage); + + if (!fb) + return; + output->fb_pending = fb; pixman_region32_subtract(&c->primary_plane.damage, &c->primary_plane.damage, damage); |