On Fri, 3 Mar 2017 23:05:24 +0000 Daniel Stone <dani...@collabora.com> wrote:
> 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 > > Signed-off-by: Daniel Stone <dani...@collabora.com> > --- > 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 423bd51..3f6fafc 100644 > --- a/libweston/compositor-drm.c > +++ b/libweston/compositor-drm.c > @@ -653,11 +653,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); > @@ -665,20 +666,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; > @@ -694,7 +696,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]); > > @@ -702,6 +703,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 > @@ -709,6 +712,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. */ > @@ -716,9 +720,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); Hi, this patch has an unmentioned effect: if rendering fails, damage is not cleared. This is good and logical. Reviewed-by: Pekka Paalanen <pekka.paala...@collabora.co.uk> Thanks, pq
pgpCWEeKaGsvF.pgp
Description: OpenPGP digital signature
_______________________________________________ wayland-devel mailing list wayland-devel@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/wayland-devel