[Mesa-dev] [RFC] etnaviv: native fence fd support

Christian Gmeiner christian.gmeiner at gmail.com
Thu Apr 6 07:54:17 UTC 2017


/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?)

>     if (fence)
> -      *fence = etna_fence_create(pctx);
> +      *fence = etna_fence_create(pctx, out_fence_fd);
>  }

greets
--
Christian Gmeiner, MSc

https://www.youtube.com/user/AloryOFFICIAL
https://soundcloud.com/christian-gmeiner


More information about the mesa-dev mailing list