From: Erik Faye-Lund Date: Wed, 20 May 2020 13:59:26 +0000 (-0400) Subject: zink: hammer in an explicit wait when retrieving buffer contents for reading X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=0d2ec80dea8adf3089f187f8c0e9bdbcb135b4f2;p=mesa.git zink: hammer in an explicit wait when retrieving buffer contents for reading this ensures that the buffer returned is synchronized as expected, though it incurs a significant performance hit and will hopefully be improved in future patches Reviewed-by: Erik Faye-Lund Part-of: --- diff --git a/src/gallium/drivers/zink/zink_resource.c b/src/gallium/drivers/zink/zink_resource.c index b1ab56699f6..a52d8bb6c70 100644 --- a/src/gallium/drivers/zink/zink_resource.c +++ b/src/gallium/drivers/zink/zink_resource.c @@ -434,6 +434,21 @@ zink_transfer_map(struct pipe_context *pctx, void *ptr; if (pres->target == PIPE_BUFFER) { + if (usage & PIPE_TRANSFER_READ) { + /* need to wait for rendering to finish + * TODO: optimize/fix this to be much less obtrusive + * mesa/mesa#2966 + */ + struct pipe_fence_handle *fence = NULL; + pctx->flush(pctx, &fence, PIPE_FLUSH_HINT_FINISH); + if (fence) { + pctx->screen->fence_finish(pctx->screen, NULL, fence, + PIPE_TIMEOUT_INFINITE); + pctx->screen->fence_reference(pctx->screen, &fence, NULL); + } + } + + VkResult result = vkMapMemory(screen->dev, res->mem, res->offset, res->size, 0, &ptr); if (result != VK_SUCCESS) return NULL;