diff options
author | Mike Blumenkrantz <michael.blumenkrantz@gmail.com> | 2020-12-10 11:13:05 -0500 |
---|---|---|
committer | Marge Bot <eric+marge@anholt.net> | 2021-03-30 00:49:43 +0000 |
commit | 812f7ecb133602bf923fb47f612dea78c5650804 (patch) | |
tree | 7d552b1f727350653aec16f7c494d0ec7142d412 | |
parent | 8578adeaa68a9bc6f47244e96e2cb75b61a99de6 (diff) |
zink: rework texture_barrier hook
we can be more precise with this and avoid flushing unnecessarily
Reviewed-by: Dave Airlie <airlied@redhat.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/9791>
-rw-r--r-- | src/gallium/drivers/zink/zink_context.c | 47 |
1 files changed, 44 insertions, 3 deletions
diff --git a/src/gallium/drivers/zink/zink_context.c b/src/gallium/drivers/zink/zink_context.c index 6772ad527f6..94c8a5101dd 100644 --- a/src/gallium/drivers/zink/zink_context.c +++ b/src/gallium/drivers/zink/zink_context.c @@ -1957,9 +1957,50 @@ static void zink_texture_barrier(struct pipe_context *pctx, unsigned flags) { struct zink_context *ctx = zink_context(pctx); - if (ctx->batch.has_work) - pctx->flush(pctx, NULL, 0); - zink_flush_queue(ctx); + if (!ctx->framebuffer || !ctx->framebuffer->state.num_attachments) + return; + + VkMemoryBarrier bmb; + bmb.sType = VK_STRUCTURE_TYPE_MEMORY_BARRIER; + bmb.pNext = NULL; + bmb.srcAccessMask = 0; + bmb.dstAccessMask = 0; + struct zink_surface *surf = zink_surface(ctx->framebuffer->surfaces[ctx->framebuffer->state.num_attachments - 1]); + struct zink_resource *res = zink_resource(surf->base.texture); + zink_batch_no_rp(ctx); + if (res->aspect != VK_IMAGE_ASPECT_COLOR_BIT) { + VkMemoryBarrier dmb; + dmb.sType = VK_STRUCTURE_TYPE_MEMORY_BARRIER; + dmb.pNext = NULL; + dmb.srcAccessMask = VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT; + dmb.dstAccessMask = VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT; + vkCmdPipelineBarrier( + ctx->batch.state->cmdbuf, + VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT | VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT, + VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT | VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT, + 0, + 1, &dmb, + 0, NULL, + 0, NULL + ); + } else { + bmb.srcAccessMask |= VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT; + bmb.dstAccessMask |= VK_ACCESS_COLOR_ATTACHMENT_READ_BIT; + } + if (ctx->framebuffer->state.num_attachments > 1) { + bmb.srcAccessMask |= VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT; + bmb.dstAccessMask |= VK_ACCESS_COLOR_ATTACHMENT_READ_BIT; + } + if (bmb.srcAccessMask) + vkCmdPipelineBarrier( + ctx->batch.state->cmdbuf, + VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, + VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, + 0, + 1, &bmb, + 0, NULL, + 0, NULL + ); } static void |