[PATCH libdrm 2/2] etnaviv: add fence fd support
Christian Gmeiner
christian.gmeiner at gmail.com
Thu Apr 6 07:59:08 UTC 2017
2017-04-05 14:34 GMT+02:00 Philipp Zabel <p.zabel at pengutronix.de>:
> Add etna_cmd_stream_flush_explicit with in-fence fd and out-fence fd
> support for explicit fencing.
>
> Signed-off-by: Philipp Zabel <p.zabel at pengutronix.de>
> ---
> etnaviv/etnaviv_cmd_stream.c | 33 +++++++++++++++++++++++++++++----
> etnaviv/etnaviv_drmif.h | 2 ++
> 2 files changed, 31 insertions(+), 4 deletions(-)
>
> diff --git a/etnaviv/etnaviv_cmd_stream.c b/etnaviv/etnaviv_cmd_stream.c
> index 9ce3f363..93c46e25 100644
> --- a/etnaviv/etnaviv_cmd_stream.c
> +++ b/etnaviv/etnaviv_cmd_stream.c
> @@ -177,7 +177,8 @@ static uint32_t bo2idx(struct etna_cmd_stream *stream, struct etna_bo *bo,
> return idx;
> }
>
> -static void flush(struct etna_cmd_stream *stream)
> +static void flush(struct etna_cmd_stream *stream, int in_fence_fd,
> + int *out_fence_fd)
> {
> struct etna_cmd_stream_priv *priv = etna_cmd_stream_priv(stream);
> int ret, id = priv->pipe->id;
> @@ -194,8 +195,22 @@ static void flush(struct etna_cmd_stream *stream)
> .stream_size = stream->offset * 4, /* in bytes */
> };
>
> + if (in_fence_fd != -1) {
> + req.flags |= ETNA_SUBMIT_FENCE_FD_IN | ETNA_SUBMIT_NO_IMPLICIT;
> + req.fence_fd = in_fence_fd;
> + }
> +
> + if (out_fence_fd)
> + req.flags |= ETNA_SUBMIT_FENCE_FD_OUT;
> +
> + /*
> + * Pass the complete submit structure only if flags are set. Otherwise,
> + * only pass the fields up to, but not including the flags field for
> + * backwards compatiblity with older kernels.
> + */
> ret = drmCommandWriteRead(gpu->dev->fd, DRM_ETNAVIV_GEM_SUBMIT,
> - &req, sizeof(req));
> + &req, req.flags ? sizeof(req) :
> + offsetof(struct drm_etnaviv_gem_submit, flags));
>
> if (ret)
> ERROR_MSG("submit failed: %d (%s)", ret, strerror(errno));
> @@ -208,11 +223,21 @@ static void flush(struct etna_cmd_stream *stream)
> bo->current_stream = NULL;
> etna_bo_del(bo);
> }
> +
> + if (out_fence_fd)
> + *out_fence_fd = req.fence_fd;
> }
>
> void etna_cmd_stream_flush(struct etna_cmd_stream *stream)
> {
> - flush(stream);
> + flush(stream, -1, NULL);
> + reset_buffer(stream);
> +}
> +
> +void etna_cmd_stream_flush_explicit(struct etna_cmd_stream *stream,
> + int in_fence_fd, int *out_fence_fd)
> +{
> + flush(stream, in_fence_fd, out_fence_fd);
> reset_buffer(stream);
> }
Just a little nitpick:
I am not sure about the function name maybe etna_cmd_stream_flush2(..). The
_explicit postfix does not give that much more information about what
it does (without
looking at the new function arguments).
greets
--
Christian Gmeiner, MSc
https://www.youtube.com/user/AloryOFFICIAL
https://soundcloud.com/christian-gmeiner
More information about the dri-devel
mailing list