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>
This commit is contained in:
Mike Blumenkrantz 2020-12-10 11:13:05 -05:00 committed by Marge Bot
parent 8578adeaa6
commit 812f7ecb13

View file

@ -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