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:
Mike Blumenkrantz 2021-07-30 10:22:55 -04:00
parent b19bff17f4
commit c5a6ebc605

View file

@ -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;