summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Stone <daniels@collabora.com>2016-10-24 14:54:53 +0100
committerDaniel Stone <daniels@collabora.com>2017-02-07 19:16:31 +0000
commitfef7cb2e20daae342afbb4aa2ab71fc7a38c375d (patch)
tree8019843ce535550b370acc265041f1d7fee176d0
parent091462606ecc166f54bc6d6afea1cdc4e8b5e753 (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.c30
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);