diff options
-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 |