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 <dani...@collabora.com>

Differential Revision: https://phabricator.freedesktop.org/D1419
---
 libweston/compositor-drm.c | 30 +++++++++++++++++++-----------
 1 file changed, 19 insertions(+), 11 deletions(-)

diff --git a/libweston/compositor-drm.c b/libweston/compositor-drm.c
index 08634cd..5909239 100644
--- a/libweston/compositor-drm.c
+++ b/libweston/compositor-drm.c
@@ -615,11 +615,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);
@@ -627,20 +628,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;
@@ -656,7 +658,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]);
 
@@ -664,6 +665,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
@@ -671,6 +674,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. */
@@ -678,9 +682,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);
-- 
2.9.3

_______________________________________________
wayland-devel mailing list
wayland-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/wayland-devel

Reply via email to