zink: add more explicit fencing for transfer maps
authorMike Blumenkrantz <michael.blumenkrantz@gmail.com>
Mon, 29 Jun 2020 18:26:47 +0000 (14:26 -0400)
committerMike Blumenkrantz <michael.blumenkrantz@gmail.com>
Wed, 14 Oct 2020 13:20:35 +0000 (09:20 -0400)
we're using our (primitive) buffer r/w tracking here to ensure that our
src buffers are synchronized before we do any kind of read operation on them

this is pretty slow in some cases, but it fixes a bunch of piglit tests

Reviewed-by: Erik Faye-Lun <erik.faye-lund@collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/6924>

src/gallium/drivers/zink/zink_resource.c

index a811eba..eab65c6 100644 (file)
@@ -529,6 +529,8 @@ zink_transfer_map(struct pipe_context *pctx,
 
       } else {
          assert(!res->optimial_tiling);
+         if (batch_uses >= ZINK_RESOURCE_ACCESS_WRITE)
+            zink_fence_wait(pctx);
          VkResult result = vkMapMemory(screen->dev, res->mem, res->offset, res->size, 0, &ptr);
          if (result != VK_SUCCESS)
             return NULL;
@@ -565,7 +567,9 @@ 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 = get_resource_usage(res);
+         if (batch_uses >= ZINK_RESOURCE_ACCESS_WRITE)
+            zink_fence_wait(pctx);
          zink_transfer_copy_bufimage(ctx, res, staging_res, trans, true);
       }