mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-24 02:20:11 +01:00
zink: split buffer and image map functions
this is a bit nicer to read Reviewed-by: Dave Airlie <airlied@redhat.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/12422>
This commit is contained in:
parent
b19bff17f4
commit
c5a6ebc605
1 changed files with 103 additions and 100 deletions
|
|
@ -61,13 +61,6 @@ static void
|
||||||
zink_transfer_flush_region(struct pipe_context *pctx,
|
zink_transfer_flush_region(struct pipe_context *pctx,
|
||||||
struct pipe_transfer *ptrans,
|
struct pipe_transfer *ptrans,
|
||||||
const struct pipe_box *box);
|
const struct pipe_box *box);
|
||||||
static void *
|
|
||||||
zink_transfer_map(struct pipe_context *pctx,
|
|
||||||
struct pipe_resource *pres,
|
|
||||||
unsigned level,
|
|
||||||
unsigned usage,
|
|
||||||
const struct pipe_box *box,
|
|
||||||
struct pipe_transfer **transfer);
|
|
||||||
|
|
||||||
void
|
void
|
||||||
debug_describe_zink_resource_object(char *buf, const struct zink_resource_object *ptr)
|
debug_describe_zink_resource_object(char *buf, const struct zink_resource_object *ptr)
|
||||||
|
|
@ -1059,10 +1052,20 @@ create_transfer(struct zink_context *ctx, struct pipe_resource *pres, unsigned u
|
||||||
}
|
}
|
||||||
|
|
||||||
static void *
|
static void *
|
||||||
buffer_transfer_map(struct zink_context *ctx, struct zink_resource *res, unsigned usage,
|
zink_buffer_map(struct pipe_context *pctx,
|
||||||
const struct pipe_box *box, struct zink_transfer *trans)
|
struct pipe_resource *pres,
|
||||||
|
unsigned level,
|
||||||
|
unsigned usage,
|
||||||
|
const struct pipe_box *box,
|
||||||
|
struct pipe_transfer **transfer)
|
||||||
{
|
{
|
||||||
struct zink_screen *screen = zink_screen(ctx->base.screen);
|
struct zink_context *ctx = zink_context(pctx);
|
||||||
|
struct zink_screen *screen = zink_screen(pctx->screen);
|
||||||
|
struct zink_resource *res = zink_resource(pres);
|
||||||
|
struct zink_transfer *trans = create_transfer(ctx, pres, usage, box);
|
||||||
|
if (!trans)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
void *ptr = NULL;
|
void *ptr = NULL;
|
||||||
|
|
||||||
if (res->base.is_user_ptr)
|
if (res->base.is_user_ptr)
|
||||||
|
|
@ -1129,9 +1132,9 @@ buffer_transfer_map(struct zink_context *ctx, struct zink_resource *res, unsigne
|
||||||
} else if (usage & PIPE_MAP_DONTBLOCK) {
|
} else if (usage & PIPE_MAP_DONTBLOCK) {
|
||||||
/* sparse/device-local will always need to wait since it has to copy */
|
/* sparse/device-local will always need to wait since it has to copy */
|
||||||
if (!res->obj->host_visible)
|
if (!res->obj->host_visible)
|
||||||
return NULL;
|
goto success;
|
||||||
if (!zink_resource_usage_check_completion(screen, res, ZINK_RESOURCE_ACCESS_WRITE))
|
if (!zink_resource_usage_check_completion(screen, res, ZINK_RESOURCE_ACCESS_WRITE))
|
||||||
return NULL;
|
goto success;
|
||||||
usage |= PIPE_MAP_UNSYNCHRONIZED;
|
usage |= PIPE_MAP_UNSYNCHRONIZED;
|
||||||
} else if (!(usage & PIPE_MAP_UNSYNCHRONIZED) &&
|
} else if (!(usage & PIPE_MAP_UNSYNCHRONIZED) &&
|
||||||
(((usage & PIPE_MAP_READ) && !(usage & PIPE_MAP_PERSISTENT) && res->base.b.usage != PIPE_USAGE_STAGING) || !res->obj->host_visible)) {
|
(((usage & PIPE_MAP_READ) && !(usage & PIPE_MAP_PERSISTENT) && res->base.b.usage != PIPE_USAGE_STAGING) || !res->obj->host_visible)) {
|
||||||
|
|
@ -1193,11 +1196,16 @@ buffer_transfer_map(struct zink_context *ctx, struct zink_resource *res, unsigne
|
||||||
trans->base.b.usage = usage;
|
trans->base.b.usage = usage;
|
||||||
if (usage & PIPE_MAP_WRITE)
|
if (usage & PIPE_MAP_WRITE)
|
||||||
util_range_add(&res->base.b, &res->valid_buffer_range, box->x, box->x + box->width);
|
util_range_add(&res->base.b, &res->valid_buffer_range, box->x, box->x + box->width);
|
||||||
|
if ((usage & PIPE_MAP_PERSISTENT) && !(usage & PIPE_MAP_COHERENT))
|
||||||
|
res->obj->persistent_maps++;
|
||||||
|
|
||||||
|
success:
|
||||||
|
*transfer = &trans->base.b;
|
||||||
return ptr;
|
return ptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void *
|
static void *
|
||||||
zink_transfer_map(struct pipe_context *pctx,
|
zink_image_map(struct pipe_context *pctx,
|
||||||
struct pipe_resource *pres,
|
struct pipe_resource *pres,
|
||||||
unsigned level,
|
unsigned level,
|
||||||
unsigned usage,
|
unsigned usage,
|
||||||
|
|
@ -1207,7 +1215,6 @@ zink_transfer_map(struct pipe_context *pctx,
|
||||||
struct zink_context *ctx = zink_context(pctx);
|
struct zink_context *ctx = zink_context(pctx);
|
||||||
struct zink_screen *screen = zink_screen(pctx->screen);
|
struct zink_screen *screen = zink_screen(pctx->screen);
|
||||||
struct zink_resource *res = zink_resource(pres);
|
struct zink_resource *res = zink_resource(pres);
|
||||||
|
|
||||||
struct zink_transfer *trans = create_transfer(ctx, pres, usage, box);
|
struct zink_transfer *trans = create_transfer(ctx, pres, usage, box);
|
||||||
if (!trans)
|
if (!trans)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
@ -1215,9 +1222,6 @@ zink_transfer_map(struct pipe_context *pctx,
|
||||||
trans->base.b.level = level;
|
trans->base.b.level = level;
|
||||||
|
|
||||||
void *ptr, *base;
|
void *ptr, *base;
|
||||||
if (pres->target == PIPE_BUFFER) {
|
|
||||||
ptr = base = buffer_transfer_map(ctx, res, usage, box, trans);
|
|
||||||
} else {
|
|
||||||
if (usage & PIPE_MAP_WRITE && !(usage & PIPE_MAP_READ))
|
if (usage & PIPE_MAP_WRITE && !(usage & PIPE_MAP_READ))
|
||||||
/* this is like a blit, so we can potentially dump some clears or maybe we have to */
|
/* this is like a blit, so we can potentially dump some clears or maybe we have to */
|
||||||
zink_fb_clears_apply_or_discard(ctx, pres, zink_rect_from_box(box), false);
|
zink_fb_clears_apply_or_discard(ctx, pres, zink_rect_from_box(box), false);
|
||||||
|
|
@ -1303,7 +1307,6 @@ zink_transfer_map(struct pipe_context *pctx,
|
||||||
}
|
}
|
||||||
if (sizeof(void*) == 4)
|
if (sizeof(void*) == 4)
|
||||||
trans->base.b.usage |= ZINK_MAP_TEMPORARY;
|
trans->base.b.usage |= ZINK_MAP_TEMPORARY;
|
||||||
}
|
|
||||||
if ((usage & PIPE_MAP_PERSISTENT) && !(usage & PIPE_MAP_COHERENT))
|
if ((usage & PIPE_MAP_PERSISTENT) && !(usage & PIPE_MAP_COHERENT))
|
||||||
res->obj->persistent_maps++;
|
res->obj->persistent_maps++;
|
||||||
|
|
||||||
|
|
@ -1422,7 +1425,7 @@ zink_buffer_subdata(struct pipe_context *ctx, struct pipe_resource *buffer,
|
||||||
usage |= PIPE_MAP_DISCARD_RANGE;
|
usage |= PIPE_MAP_DISCARD_RANGE;
|
||||||
|
|
||||||
u_box_1d(offset, size, &box);
|
u_box_1d(offset, size, &box);
|
||||||
map = zink_transfer_map(ctx, buffer, 0, usage, &box, &transfer);
|
map = zink_buffer_map(ctx, buffer, 0, usage, &box, &transfer);
|
||||||
if (!map)
|
if (!map)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
|
@ -1593,7 +1596,7 @@ zink_resource_get_internal_format(struct pipe_resource *pres)
|
||||||
static const struct u_transfer_vtbl transfer_vtbl = {
|
static const struct u_transfer_vtbl transfer_vtbl = {
|
||||||
.resource_create = zink_resource_create,
|
.resource_create = zink_resource_create,
|
||||||
.resource_destroy = zink_resource_destroy,
|
.resource_destroy = zink_resource_destroy,
|
||||||
.transfer_map = zink_transfer_map,
|
.transfer_map = zink_image_map,
|
||||||
.transfer_unmap = zink_image_unmap,
|
.transfer_unmap = zink_image_unmap,
|
||||||
.transfer_flush_region = zink_transfer_flush_region,
|
.transfer_flush_region = zink_transfer_flush_region,
|
||||||
.get_internal_format = zink_resource_get_internal_format,
|
.get_internal_format = zink_resource_get_internal_format,
|
||||||
|
|
@ -1621,7 +1624,7 @@ zink_screen_resource_init(struct pipe_screen *pscreen)
|
||||||
void
|
void
|
||||||
zink_context_resource_init(struct pipe_context *pctx)
|
zink_context_resource_init(struct pipe_context *pctx)
|
||||||
{
|
{
|
||||||
pctx->buffer_map = zink_transfer_map;
|
pctx->buffer_map = zink_buffer_map;
|
||||||
pctx->buffer_unmap = zink_buffer_unmap;
|
pctx->buffer_unmap = zink_buffer_unmap;
|
||||||
pctx->texture_map = u_transfer_helper_deinterleave_transfer_map;
|
pctx->texture_map = u_transfer_helper_deinterleave_transfer_map;
|
||||||
pctx->texture_unmap = u_transfer_helper_deinterleave_transfer_unmap;
|
pctx->texture_unmap = u_transfer_helper_deinterleave_transfer_unmap;
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue