[Mesa-dev] [PATCH 1/6] radeonsi: allow DMABUF exports for local buffers
Nicolai Hähnle
nhaehnle at gmail.com
Wed Dec 6 15:52:07 UTC 2017
On 06.12.2017 13:43, Marek Olšák wrote:
>
>
> On Dec 6, 2017 12:34 PM, "Nicolai Hähnle" <nhaehnle at gmail.com
> <mailto:nhaehnle at gmail.com>> wrote:
>
> On 05.12.2017 20:05, Marek Olšák wrote:
>
> From: Marek Olšák <marek.olsak at amd.com <mailto:marek.olsak at amd.com>>
>
> Cc: 17.3 <mesa-stable at lists.freedesktop.org
> <mailto:mesa-stable at lists.freedesktop.org>>
> ---
> src/gallium/drivers/radeon/r600_texture.c | 6 +++++-
> 1 file changed, 5 insertions(+), 1 deletion(-)
>
> diff --git a/src/gallium/drivers/radeon/r600_texture.c
> b/src/gallium/drivers/radeon/r600_texture.c
> index 2aa47b5..07f7c33 100644
> --- a/src/gallium/drivers/radeon/r600_texture.c
> +++ b/src/gallium/drivers/radeon/r600_texture.c
> @@ -739,22 +739,26 @@ static boolean
> r600_texture_get_handle(struct pipe_screen* screen,
> stride = rtex->surface.u.gfx9.surf_pitch *
> rtex->surface.bpe;
> slice_size =
> rtex->surface.u.gfx9.surf_slice_size;
> } else {
> offset =
> rtex->surface.u.legacy.level[0].offset;
> stride =
> rtex->surface.u.legacy.level[0].nblk_x *
> rtex->surface.bpe;
> slice_size =
> (uint64_t)rtex->surface.u.legacy.level[0].slice_size_dw * 4;
> }
> } else {
> + /* Buffer exports are for the OpenCL interop. */
> /* Move a suballocated buffer into a
> non-suballocated allocation. */
> - if (sscreen->ws->buffer_is_suballocated(res->buf)) {
> + if (sscreen->ws->buffer_is_suballocated(res->buf) ||
> + /* A DMABUF export always fails if the BO is
> local. */
> + (rtex->resource.flags &
> RADEON_FLAG_NO_INTERPROCESS_SHARING &&
> + whandle->type != DRM_API_HANDLE_TYPE_KMS)) {
>
>
> I still don't think this is right. Or at least, it's bound to blow
> up in our faces at some point. Though I think we may have talked
> past each other, apologies that I haven't made myself clear.
>
> The issues I have in mind are scenarios like this:
>
> 1. Buffer allocated in OpenGL.
> 2. Buffer exported as KMS handle for importing to OpenCL in the same
> process.
> 3. Buffer exported as an FD <-- at this point, the OpenGL and OpenCL
> buffers go out of sync because OpenGL re-allocates the buffer but
> OpenCL isn't informed.
>
> Or:
>
> 1. Buffer allocated in OpenGL.
> 2. Buffer exported as KMS handle for importing to OpenCL in the same
> process.
> 3. Buffer attempted to be exported as an FD from OpenCL <-- fails
> because the buffer is local (has NO_INTERPROCESS_SHARING), and
> people will be utterly clueless as to what's going on.
>
> FWIW, I think the patch is good if you drop the whandle->type check
> so that we re-allocate unconditionally.
>
>
> I can remove the check, but buffers are only exported as DMABUF. This
> patch isn't just random - it does fix OpenCL interop.
Well, I doubt it's critical for performance, OpenCL doesn't know about
the NO_INTERPROCESS_SHARING status anyway. So I'd prefer to remove the
check, in case we change the exporting at some point.
Cheers,
Nicolai
>
> Marek
>
>
>
> Cheers,
> Nicolai
>
>
>
> assert(!res->b.is_shared);
> /* Allocate a new buffer with
> PIPE_BIND_SHARED. */
> struct pipe_resource templ = res->b.b;
> templ.bind |= PIPE_BIND_SHARED;
> struct pipe_resource *newb =
> screen->resource_create(screen,
> &templ);
> if (!newb)
> return false;
>
>
>
> --
> Lerne, wie die Welt wirklich ist,
> Aber vergiss niemals, wie sie sein sollte.
>
>
--
Lerne, wie die Welt wirklich ist,
Aber vergiss niemals, wie sie sein sollte.
More information about the mesa-dev
mailing list