summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Blumenkrantz <michael.blumenkrantz@gmail.com>2020-12-10 11:13:05 -0500
committerMarge Bot <eric+marge@anholt.net>2021-03-30 00:49:43 +0000
commit812f7ecb133602bf923fb47f612dea78c5650804 (patch)
tree7d552b1f727350653aec16f7c494d0ec7142d412
parent8578adeaa68a9bc6f47244e96e2cb75b61a99de6 (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.c47
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