llvmpipe: fix userptr for texture resources.

This is needed for CL image hostptr support, but it's possible
it could hit these paths from GL/Vulkan

Fixes: 9a57dceeb7 ("llvmpipe: add support for user memory pointers")
Reviewed-By: Mike Blumenkrantz <michael.blumenkrantz@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/13375>
This commit is contained in:
Dave Airlie
2021-10-13 14:49:50 +10:00
committed by Dave Airlie
parent d31ca63527
commit 17a565e0cf
2 changed files with 15 additions and 8 deletions

View File

@@ -440,7 +440,7 @@ llvmpipe_resource_destroy(struct pipe_screen *pscreen,
struct llvmpipe_screen *screen = llvmpipe_screen(pscreen); struct llvmpipe_screen *screen = llvmpipe_screen(pscreen);
struct llvmpipe_resource *lpr = llvmpipe_resource(pt); struct llvmpipe_resource *lpr = llvmpipe_resource(pt);
if (!lpr->backable) { if (!lpr->backable && !lpr->user_ptr) {
if (lpr->dt) { if (lpr->dt) {
/* display target */ /* display target */
struct sw_winsys *winsys = screen->winsys; struct sw_winsys *winsys = screen->winsys;
@@ -454,11 +454,9 @@ llvmpipe_resource_destroy(struct pipe_screen *pscreen,
lpr->tex_data = NULL; lpr->tex_data = NULL;
} }
} }
else if (!lpr->userBuffer) { else if (lpr->data) {
if (lpr->data) {
if (!lpr->imported_memory) if (!lpr->imported_memory)
align_free(lpr->data); align_free(lpr->data);
}
} }
} }
#ifdef DEBUG #ifdef DEBUG
@@ -651,9 +649,18 @@ llvmpipe_resource_from_user_memory(struct pipe_screen *_screen,
pipe_reference_init(&lpr->base.reference, 1); pipe_reference_init(&lpr->base.reference, 1);
lpr->base.screen = _screen; lpr->base.screen = _screen;
lpr->data = user_memory; if (llvmpipe_resource_is_texture(&lpr->base)) {
lpr->userBuffer = TRUE; if (!llvmpipe_texture_layout(screen, lpr, false))
goto fail;
lpr->tex_data = user_memory;
} else
lpr->data = user_memory;
lpr->user_ptr = true;
return &lpr->base; return &lpr->base;
fail:
FREE(lpr);
return NULL;
} }
void * void *
@@ -875,7 +882,7 @@ llvmpipe_user_buffer_create(struct pipe_screen *screen,
buffer->base.height0 = 1; buffer->base.height0 = 1;
buffer->base.depth0 = 1; buffer->base.depth0 = 1;
buffer->base.array_size = 1; buffer->base.array_size = 1;
buffer->userBuffer = TRUE; buffer->user_ptr = true;
buffer->data = ptr; buffer->data = ptr;
return &buffer->base; return &buffer->base;

View File

@@ -89,7 +89,7 @@ struct llvmpipe_resource
*/ */
void *data; void *data;
boolean userBuffer; /** Is this a user-space buffer? */ bool user_ptr; /** Is this a user-space buffer? */
unsigned timestamp; unsigned timestamp;
unsigned id; /**< temporary, for debugging */ unsigned id; /**< temporary, for debugging */