Hi Brian, Keith,

+Some more Chromium folks for visibility.

On Wed, Aug 22, 2018 at 4:21 PM Tomasz Figa <tf...@chromium.org> wrote:
>
> Hi Michel,
>
> On Thu, Aug 16, 2018 at 6:43 PM Michel Dänzer <mic...@daenzer.net> wrote:
> >
> > On 2018-08-16 11:34 AM, Tomasz Figa wrote:
> > > If there is no last fence, due to no rendering happening yet, just
> > > create a new signaled fence and return it, to match the expectations of
> > > the EGL sync fence API.
> > >
> > > Fixes random "Could not create sync fence 0x3003" assertion failures from
> > > Skia on Android, coming from the following code:
> > >
> > > https://android.googlesource.com/platform/frameworks/base/+/master/libs/hwui/pipeline/skia/SkiaOpenGLPipeline.cpp#427
> > >
> > > Reproducible especially with thread count >= 4.
> > >
> > > Signed-off-by: Tomasz Figa <tf...@chromium.org>
> > > ---
> > >  src/gallium/drivers/llvmpipe/lp_setup.c | 8 +++++++-
> > >  1 file changed, 7 insertions(+), 1 deletion(-)
> > >
> > > diff --git a/src/gallium/drivers/llvmpipe/lp_setup.c 
> > > b/src/gallium/drivers/llvmpipe/lp_setup.c
> > > index b087369473..a6f1b54d69 100644
> > > --- a/src/gallium/drivers/llvmpipe/lp_setup.c
> > > +++ b/src/gallium/drivers/llvmpipe/lp_setup.c
> > > @@ -360,7 +360,13 @@ lp_setup_flush( struct lp_setup_context *setup,
> > >     set_scene_state( setup, SETUP_FLUSHED, reason );
> > >
> > >     if (fence) {
> > > -      lp_fence_reference((struct lp_fence **)fence, setup->last_fence);
> > > +      struct lp_fence *lp_fence = NULL;
> > > +
> > > +      lp_fence_reference(&lp_fence, setup->last_fence);
> > > +      if (!lp_fence)
> > > +         lp_fence = lp_fence_create(0);
> > > +      lp_fence_reference((struct lp_fence **)fence, lp_fence);
> > > +      lp_fence_reference(&lp_fence, NULL);
> > >     }
> > >  }
> > >
> > >
> >
> > Other drivers keep around a reference to the last fence in the context,
> > and return that if there's no new work to flush.
>
> Thanks for taking a look.
>
> Right, it sounds like a sane thing to do. LLVMpipe, however, seems to
> explicitly destroy the fence whenever a rendering pass completes and I
> didn't want to change that without understanding the intentions behind
> that. Precisely, it's lp_scene_end_rasterization():
> https://gitlab.freedesktop.org/mesa/mesa/blob/master/src/gallium/drivers/llvmpipe/lp_scene.c#L292
>
> Also, this still wouldn't solve the problem of an EGL sync fence being
> created and waited on without any rendering happening at all, which is
> also likely to happen with Android code pointed to in the commit
> message. Obviously that could be dealt with by creating a signaled
> fence in lp_setup_create(), though.
>
> Let me add Keith and Brian for more visibility.

Any thoughts on this?

Best regards,
Tomasz
_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to