From 813c361fe02643842e88b88cb9849d7addc21517 Mon Sep 17 00:00:00 2001 From: Mike Blumenkrantz Date: Tue, 11 Aug 2020 18:39:25 -0400 Subject: [PATCH] zink: wait on compute batch when necessary during transfer map now that we have the capability to wait on specific batches, we can check whether we need to sync with the compute queue here before trying to map resources Reviewed-by: Bas Nieuwenhuizen Part-of: --- src/gallium/drivers/zink/zink_resource.c | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/src/gallium/drivers/zink/zink_resource.c b/src/gallium/drivers/zink/zink_resource.c index 07c3a224fde..50c59775359 100644 --- a/src/gallium/drivers/zink/zink_resource.c +++ b/src/gallium/drivers/zink/zink_resource.c @@ -551,6 +551,9 @@ zink_transfer_map(struct pipe_context *pctx, * TODO: optimize/fix this to be much less obtrusive * mesa/mesa#2966 */ + if (batch_uses & ((ZINK_RESOURCE_ACCESS_READ << ZINK_COMPUTE_BATCH_ID) | + ZINK_RESOURCE_ACCESS_WRITE << ZINK_COMPUTE_BATCH_ID)) + zink_wait_on_batch(ctx, ZINK_COMPUTE_BATCH_ID); zink_fence_wait(pctx); } } @@ -612,6 +615,9 @@ zink_transfer_map(struct pipe_context *pctx, struct zink_resource *staging_res = zink_resource(trans->staging_res); if (usage & PIPE_MAP_READ) { + /* TODO: can probably just do a full cs copy if it's already in a cs batch */ + if (batch_uses & (ZINK_RESOURCE_ACCESS_WRITE << ZINK_COMPUTE_BATCH_ID)) + zink_wait_on_batch(ctx, ZINK_COMPUTE_BATCH_ID); struct zink_context *ctx = zink_context(pctx); bool ret = zink_transfer_copy_bufimage(ctx, res, staging_res, trans, @@ -631,8 +637,11 @@ zink_transfer_map(struct pipe_context *pctx, } else { assert(!res->optimal_tiling); - if (batch_uses >= ZINK_RESOURCE_ACCESS_WRITE) + if (batch_uses >= ZINK_RESOURCE_ACCESS_WRITE) { + if (batch_uses & (ZINK_RESOURCE_ACCESS_WRITE << ZINK_COMPUTE_BATCH_ID)) + zink_wait_on_batch(ctx, ZINK_COMPUTE_BATCH_ID); zink_fence_wait(pctx); + } VkResult result = vkMapMemory(screen->dev, res->mem, res->offset, res->size, 0, &ptr); if (result != VK_SUCCESS) return NULL; @@ -673,8 +682,11 @@ zink_transfer_unmap(struct pipe_context *pctx, if (trans->base.usage & PIPE_MAP_WRITE) { struct zink_context *ctx = zink_context(pctx); uint32_t batch_uses = zink_get_resource_usage(res); - if (batch_uses >= ZINK_RESOURCE_ACCESS_WRITE) + if (batch_uses >= ZINK_RESOURCE_ACCESS_WRITE) { + if (batch_uses & (ZINK_RESOURCE_ACCESS_WRITE << ZINK_COMPUTE_BATCH_ID)) + zink_wait_on_batch(ctx, ZINK_COMPUTE_BATCH_ID); zink_fence_wait(pctx); + } zink_transfer_copy_bufimage(ctx, res, staging_res, trans, true); }