llvmpipe: properly save llvmpipe_memory_allocation in memory_object

Importing an opaque fd no longer returns the mapped pointer but
a pointer to llvmpipe_memory_allocation to support both memfds and
dma bufs. This saves the pointer with the correct type and we can
unwrap the mapped data in a correct way.

Fixes: d74ea2c117 ("llvmpipe: Implement dmabuf handling")
Reviewed-by: Dave Airlie <airlied@redhat.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/31022>
This commit is contained in:
Thomas Wagner
2024-07-12 17:30:27 +02:00
committed by Marge Bot
parent 39156b6cd4
commit 3e01c15fa7
2 changed files with 9 additions and 5 deletions

View File

@@ -452,7 +452,11 @@ llvmpipe_memobj_create_from_handle(struct pipe_screen *pscreen,
pipe_reference_init(&memobj->reference, 1); pipe_reference_init(&memobj->reference, 1);
if (handle->type == WINSYS_HANDLE_TYPE_FD && if (handle->type == WINSYS_HANDLE_TYPE_FD &&
pscreen->import_memory_fd(pscreen, handle->handle, &memobj->data, &memobj->size, false)) { pscreen->import_memory_fd(pscreen,
handle->handle,
(struct pipe_memory_allocation **)&memobj->mem_alloc,
&memobj->size,
false)) {
return &memobj->b; return &memobj->b;
} }
free(memobj); free(memobj);
@@ -471,7 +475,7 @@ llvmpipe_memobj_destroy(struct pipe_screen *pscreen,
if (pipe_reference(&lpmo->reference, NULL)) if (pipe_reference(&lpmo->reference, NULL))
{ {
#ifdef PIPE_MEMORY_FD #ifdef PIPE_MEMORY_FD
pscreen->free_memory_fd(pscreen, lpmo->data); pscreen->free_memory_fd(pscreen, (struct pipe_memory_allocation *)lpmo->mem_alloc);
#endif #endif
free(lpmo); free(lpmo);
} }
@@ -501,7 +505,7 @@ llvmpipe_resource_from_memobj(struct pipe_screen *pscreen,
goto fail; goto fail;
if (lpmo->size < lpr->size_required) if (lpmo->size < lpr->size_required)
goto fail; goto fail;
lpr->tex_data = lpmo->data; lpr->tex_data = lpmo->mem_alloc->cpu_addr;
} else { } else {
/* other data (vertex buffer, const buffer, etc) */ /* other data (vertex buffer, const buffer, etc) */
const uint bytes = templat->width0; const uint bytes = templat->width0;
@@ -527,7 +531,7 @@ llvmpipe_resource_from_memobj(struct pipe_screen *pscreen,
if (lpmo->size < lpr->size_required) if (lpmo->size < lpr->size_required)
goto fail; goto fail;
lpr->data = lpmo->data; lpr->data = lpmo->mem_alloc->cpu_addr;
} }
lpr->id = id_counter++; lpr->id = id_counter++;
lpr->imported_memory = &lpmo->b; lpr->imported_memory = &lpmo->b;

View File

@@ -144,7 +144,7 @@ struct llvmpipe_memory_object
{ {
struct pipe_memory_object b; struct pipe_memory_object b;
struct pipe_reference reference; struct pipe_reference reference;
struct pipe_memory_allocation *data; struct llvmpipe_memory_allocation *mem_alloc;
uint64_t size; uint64_t size;
}; };