Module: Mesa Branch: master Commit: 230748d614e8498fa46f33d21ff0fc073c69da89 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=230748d614e8498fa46f33d21ff0fc073c69da89
Author: Mike Blumenkrantz <[email protected]> Date: Thu Nov 5 10:54:37 2020 -0500 zink: break out buffer mapping part of zink_transfer_map no functional changes, but this is going to get much more complex in the near future Reviewed-by: Dave Airlie <[email protected]> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/9725> --- src/gallium/drivers/zink/zink_resource.c | 117 +++++++++++++++++-------------- 1 file changed, 63 insertions(+), 54 deletions(-) diff --git a/src/gallium/drivers/zink/zink_resource.c b/src/gallium/drivers/zink/zink_resource.c index a15c8ff014e..09b578a9e20 100644 --- a/src/gallium/drivers/zink/zink_resource.c +++ b/src/gallium/drivers/zink/zink_resource.c @@ -655,62 +655,43 @@ zink_resource_has_usage(struct zink_resource *res, enum zink_resource_access usa } 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) +buffer_transfer_map(struct zink_context *ctx, struct zink_resource *res, unsigned usage, + const struct pipe_box *box, struct zink_transfer *trans) { - 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 = slab_alloc(&ctx->transfer_pool); - if (!trans) - return NULL; - - memset(trans, 0, sizeof(*trans)); - pipe_resource_reference(&trans->base.resource, pres); + struct zink_screen *screen = zink_screen(ctx->base.screen); + void *ptr; - trans->base.resource = pres; - trans->base.level = level; - trans->base.usage = usage; - trans->base.box = *box; + if (!(usage & PIPE_MAP_UNSYNCHRONIZED)) { + if (usage & PIPE_MAP_DISCARD_WHOLE_RESOURCE) { + /* Replace the backing storage with a fresh buffer for non-async maps */ + //if (!(usage & TC_TRANSFER_MAP_NO_INVALIDATE)) + zink_resource_invalidate(&ctx->base, &res->base); - void *ptr; - if (pres->target == PIPE_BUFFER) { - if (!(usage & PIPE_MAP_UNSYNCHRONIZED)) { - if (usage & PIPE_MAP_DISCARD_WHOLE_RESOURCE) { - /* Replace the backing storage with a fresh buffer for non-async maps */ - //if (!(usage & TC_TRANSFER_MAP_NO_INVALIDATE)) - zink_resource_invalidate(pctx, pres); - - /* If we can discard the whole resource, we can discard the range. */ - usage |= PIPE_MAP_DISCARD_RANGE; - } - if (util_ranges_intersect(&res->valid_buffer_range, box->x, box->x + box->width)) { - /* special case compute reads since they aren't handled by zink_fence_wait() */ - if (usage & PIPE_MAP_WRITE && zink_resource_has_usage(res, ZINK_RESOURCE_ACCESS_READ, ZINK_QUEUE_COMPUTE)) - resource_sync_reads_from_compute(ctx, res); - if (usage & PIPE_MAP_READ && zink_resource_has_usage(res, ZINK_RESOURCE_ACCESS_WRITE, ZINK_QUEUE_ANY)) - resource_sync_writes_from_batch_usage(ctx, res); - else if (usage & PIPE_MAP_WRITE && zink_resource_has_usage(res, ZINK_RESOURCE_ACCESS_RW, ZINK_QUEUE_ANY)) { - /* need to wait for all rendering to finish - * TODO: optimize/fix this to be much less obtrusive - * mesa/mesa#2966 - */ - - trans->staging_res = pipe_buffer_create(pctx->screen, 0, PIPE_USAGE_STAGING, pres->width0); - res = zink_resource(trans->staging_res); - } + /* If we can discard the whole resource, we can discard the range. */ + usage |= PIPE_MAP_DISCARD_RANGE; + } + if (util_ranges_intersect(&res->valid_buffer_range, box->x, box->x + box->width)) { + /* special case compute reads since they aren't handled by zink_fence_wait() */ + if (usage & PIPE_MAP_WRITE && zink_resource_has_usage(res, ZINK_RESOURCE_ACCESS_READ, ZINK_QUEUE_COMPUTE)) + resource_sync_reads_from_compute(ctx, res); + if (usage & PIPE_MAP_READ && zink_resource_has_usage(res, ZINK_RESOURCE_ACCESS_WRITE, ZINK_QUEUE_ANY)) + resource_sync_writes_from_batch_usage(ctx, res); + else if (usage & PIPE_MAP_WRITE && zink_resource_has_usage(res, ZINK_RESOURCE_ACCESS_RW, ZINK_QUEUE_ANY)) { + /* need to wait for all rendering to finish + * TODO: optimize/fix this to be much less obtrusive + * mesa/mesa#2966 + */ + + trans->staging_res = pipe_buffer_create(&screen->base, 0, PIPE_USAGE_STAGING, res->base.width0); + res = zink_resource(trans->staging_res); } } + } - VkResult result = vkMapMemory(screen->dev, res->obj->mem, res->obj->offset, res->obj->size, 0, &ptr); - if (result != VK_SUCCESS) - return NULL; + VkResult result = vkMapMemory(screen->dev, res->obj->mem, res->obj->offset, res->obj->size, 0, &ptr); + if (result != VK_SUCCESS) + return NULL; #if defined(__APPLE__) if (!(usage & PIPE_MAP_DISCARD_WHOLE_RESOURCE)) { @@ -731,11 +712,39 @@ zink_transfer_map(struct pipe_context *pctx, } #endif - trans->base.stride = 0; - trans->base.layer_stride = 0; - ptr = ((uint8_t *)ptr) + box->x; - if (usage & PIPE_MAP_WRITE) - util_range_add(&res->base, &res->valid_buffer_range, box->x, box->x + box->width); + ptr = ((uint8_t *)ptr) + box->x; + if (usage & PIPE_MAP_WRITE) + util_range_add(&res->base, &res->valid_buffer_range, box->x, box->x + box->width); + return ptr; +} + +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) +{ + 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 = slab_alloc(&ctx->transfer_pool); + if (!trans) + return NULL; + + memset(trans, 0, sizeof(*trans)); + pipe_resource_reference(&trans->base.resource, pres); + + trans->base.resource = pres; + trans->base.level = level; + trans->base.usage = usage; + trans->base.box = *box; + + void *ptr; + if (pres->target == PIPE_BUFFER) { + ptr = buffer_transfer_map(ctx, res, usage, box, trans); } else { 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 */ _______________________________________________ mesa-commit mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/mesa-commit
