[RFC] etnaviv: native fence fd support

Philipp Zabel p.zabel at pengutronix.de
Thu Apr 6 14:22:56 UTC 2017


On Thu, 2017-04-06 at 09:54 +0200, Christian Gmeiner wrote:
> /2017-04-05 18:14 GMT+02:00 Philipp Zabel <p.zabel at pengutronix.de>:
> > This adds native fence fd support to etnaviv, similarly to commit
> > 0b98e84e9ba0 ("freedreno: native fence fd"), enabled for kernel
> > driver version 1.1 or later.
> >
> > Signed-off-by: Philipp Zabel <p.zabel at pengutronix.de>
> > ---
> > This depends on libdrm patches [1][2] which may or may not make their
> > way into libdrm 2.4.78.
> > [1] https://patchwork.kernel.org/patch/9664401/
> > [2] https://patchwork.kernel.org/patch/9664403/
> > ---
> >  configure.ac                                  |  2 +-
> >  src/gallium/drivers/etnaviv/etnaviv_context.c | 17 ++++++++--
> >  src/gallium/drivers/etnaviv/etnaviv_context.h |  1 +
> >  src/gallium/drivers/etnaviv/etnaviv_fence.c   | 46 +++++++++++++++++++++++++--
> >  src/gallium/drivers/etnaviv/etnaviv_fence.h   | 14 +++++++-
> >  src/gallium/drivers/etnaviv/etnaviv_screen.c  | 10 +++++-
> >  src/gallium/drivers/etnaviv/etnaviv_screen.h  |  3 ++
> >  7 files changed, 86 insertions(+), 7 deletions(-)
> >
> > diff --git a/configure.ac b/configure.ac
> > index 1c60a59823..a5e1d69912 100644
> > --- a/configure.ac
> > +++ b/configure.ac
> > @@ -80,7 +80,7 @@ LIBDRM_NVVIEUX_REQUIRED=2.4.66
> >  LIBDRM_NOUVEAU_REQUIRED=2.4.66
> >  LIBDRM_FREEDRENO_REQUIRED=2.4.74
> >  LIBDRM_VC4_REQUIRED=2.4.69
> > -LIBDRM_ETNAVIV_REQUIRED=2.4.74
> > +LIBDRM_ETNAVIV_REQUIRED=2.4.78
> >
> >  dnl Versions for external dependencies
> >  DRI2PROTO_REQUIRED=2.8
> > diff --git a/src/gallium/drivers/etnaviv/etnaviv_context.c b/src/gallium/drivers/etnaviv/etnaviv_context.c
> > index dfd9e1f73a..14170342ff 100644
> > --- a/src/gallium/drivers/etnaviv/etnaviv_context.c
> > +++ b/src/gallium/drivers/etnaviv/etnaviv_context.c
> > @@ -73,6 +73,9 @@ etna_context_destroy(struct pipe_context *pctx)
> >
> >     slab_destroy_child(&ctx->transfer_pool);
> >
> > +   if (ctx->in_fence_fd != -1)
> > +      close(ctx->in_fence_fd);
> > +
> >     FREE(pctx);
> >  }
> >
> > @@ -230,11 +233,17 @@ etna_flush(struct pipe_context *pctx, struct pipe_fence_handle **fence,
> >             enum pipe_flush_flags flags)
> >  {
> >     struct etna_context *ctx = etna_context(pctx);
> > +   int out_fence_fd = -1;
> >
> > -   etna_cmd_stream_flush(ctx->stream);
> > +   if (ctx->in_fence_fd != -1 || (flags & PIPE_FLUSH_FENCE_FD))
> > +      etna_cmd_stream_flush_explicit(ctx->stream, ctx->in_fence_fd,
> > +                                     (flags & PIPE_FLUSH_FENCE_FD) ?
> > +                                     &out_fence_fd : NULL);
> > +   else
> > +      etna_cmd_stream_flush(ctx->stream);
> >
> 
> Can we do that without the extra if and just call
> etna_cmd_stream_flush_explicit(..) in every
> case? (Just like in freedreno?)

Yes, etna_cmd_stream_flush(stream) effectively maps to the same as
etna_cmd_stream_flush_explicit(stream, -1, NULL) anyway. I'll change
this.

regards
Philipp



More information about the etnaviv mailing list