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:
@@ -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;
|
||||||
|
@@ -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;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user