Mesa (main): zink: rework texture_barrier hook
GitLab Mirror
gitlab-mirror at kemper.freedesktop.org
Mon Apr 11 01:21:29 UTC 2022
Module: Mesa
Branch: main
Commit: 4f6f34456af75d247c7d0008e344215cc2c57bdd
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=4f6f34456af75d247c7d0008e344215cc2c57bdd
Author: Mike Blumenkrantz <michael.blumenkrantz at gmail.com>
Date: Fri Apr 8 18:44:15 2022 -0400
zink: rework texture_barrier hook
according to spec, for fbfetch this should match the subpass self-dependency of
* stage FRAGMENT_STAGE -> FRAGMENT_STAGE
* access 0 -> INPUT_ATTACHMENT_READ
zs fbfetch doesn't seem to be a thing, so that code is left for historical
and/or future purposes
Reviewed-by: Dave Airlie <airlied at redhat.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/15831>
---
src/gallium/drivers/zink/zink_context.c | 61 ++++++++++++++++++---------------
1 file changed, 34 insertions(+), 27 deletions(-)
diff --git a/src/gallium/drivers/zink/zink_context.c b/src/gallium/drivers/zink/zink_context.c
index 363096f1c30..4db31249d26 100644
--- a/src/gallium/drivers/zink/zink_context.c
+++ b/src/gallium/drivers/zink/zink_context.c
@@ -3439,45 +3439,52 @@ static void
zink_texture_barrier(struct pipe_context *pctx, unsigned flags)
{
struct zink_context *ctx = zink_context(pctx);
+ VkAccessFlags dst = flags == PIPE_TEXTURE_BARRIER_FRAMEBUFFER ?
+ VK_ACCESS_INPUT_ATTACHMENT_READ_BIT :
+ VK_ACCESS_SHADER_READ_BIT;
+
if (!ctx->framebuffer || !ctx->framebuffer->state.num_attachments)
return;
- zink_batch_no_rp(ctx);
- if (ctx->fb_state.zsbuf) {
- VkMemoryBarrier dmb;
- dmb.sType = VK_STRUCTURE_TYPE_MEMORY_BARRIER;
+ if (zink_screen(ctx->base.screen)->info.have_KHR_synchronization2) {
+ VkDependencyInfo dep = {0};
+ dep.sType = VK_STRUCTURE_TYPE_DEPENDENCY_INFO;
+ dep.dependencyFlags = VK_DEPENDENCY_BY_REGION_BIT;
+ dep.memoryBarrierCount = 1;
+
+ VkMemoryBarrier2 dmb = {0};
+ dmb.sType = VK_STRUCTURE_TYPE_MEMORY_BARRIER_2;
dmb.pNext = NULL;
- dmb.srcAccessMask = VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
- dmb.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
+ dmb.srcAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;
+ dmb.dstAccessMask = dst;
+ dmb.srcStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT;
+ dmb.dstStageMask = VK_PIPELINE_STAGE_2_FRAGMENT_SHADER_BIT;
+ dep.pMemoryBarriers = &dmb;
+
+ /* if zs fbfetch is a thing?
+ if (ctx->fb_state.zsbuf) {
+ const VkPipelineStageFlagBits2 depth_flags = VK_PIPELINE_STAGE_2_EARLY_FRAGMENT_TESTS_BIT | VK_PIPELINE_STAGE_2_LATE_FRAGMENT_TESTS_BIT;
+ dmb.dstAccessMask |= VK_ACCESS_2_DEPTH_STENCIL_ATTACHMENT_READ_BIT;
+ dmb.srcStageMask |= depth_flags;
+ dmb.dstStageMask |= depth_flags;
+ }
+ */
+ VKCTX(CmdPipelineBarrier2)(ctx->batch.state->cmdbuf, &dep);
+ } else {
+ VkMemoryBarrier bmb = {0};
+ bmb.sType = VK_STRUCTURE_TYPE_MEMORY_BARRIER;
+ bmb.srcAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;
+ bmb.dstAccessMask = dst;
VKCTX(CmdPipelineBarrier)(
ctx->batch.state->cmdbuf,
- VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT | VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT,
+ VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT,
0,
- 1, &dmb,
+ 1, &bmb,
0, NULL,
0, NULL
);
}
- if (!ctx->fb_state.nr_cbufs)
- return;
-
- VkMemoryBarrier bmb;
- bmb.sType = VK_STRUCTURE_TYPE_MEMORY_BARRIER;
- bmb.pNext = NULL;
- bmb.srcAccessMask = 0;
- bmb.dstAccessMask = 0;
- bmb.srcAccessMask |= VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;
- bmb.dstAccessMask |= VK_ACCESS_SHADER_READ_BIT;
- VKCTX(CmdPipelineBarrier)(
- ctx->batch.state->cmdbuf,
- VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
- VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT,
- 0,
- 1, &bmb,
- 0, NULL,
- 0, NULL
- );
}
static inline void
More information about the mesa-commit
mailing list