Mesa (master): zink: use explicit subpass deps
GitLab Mirror
gitlab-mirror at kemper.freedesktop.org
Thu Apr 8 04:12:12 UTC 2021
Module: Mesa
Branch: master
Commit: 911486360902ef2339c7307f09fd5cbec0d45661
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=911486360902ef2339c7307f09fd5cbec0d45661
Author: Mike Blumenkrantz <michael.blumenkrantz at gmail.com>
Date: Wed Mar 3 14:54:05 2021 -0500
zink: use explicit subpass deps
this lets us avoid the spec-mandated barrier and use flags based on
what we'll actually be doing in the pass
Reviewed-by: Dave Airlie <airlied at redhat.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/9986>
---
src/gallium/drivers/zink/zink_render_pass.c | 19 +++++++++++++++++++
1 file changed, 19 insertions(+)
diff --git a/src/gallium/drivers/zink/zink_render_pass.c b/src/gallium/drivers/zink/zink_render_pass.c
index a6dc8b4095e..f62f5c47994 100644
--- a/src/gallium/drivers/zink/zink_render_pass.c
+++ b/src/gallium/drivers/zink/zink_render_pass.c
@@ -34,6 +34,8 @@ create_render_pass(VkDevice dev, struct zink_render_pass_state *state)
VkAttachmentReference color_refs[PIPE_MAX_COLOR_BUFS], zs_ref;
VkAttachmentDescription attachments[PIPE_MAX_COLOR_BUFS + 1];
+ VkPipelineStageFlags dep_pipeline = 0;
+ VkAccessFlags dep_access = 0;
for (int i = 0; i < state->num_cbufs; i++) {
struct zink_rt_attrib *rt = state->rts + i;
@@ -48,6 +50,10 @@ create_render_pass(VkDevice dev, struct zink_render_pass_state *state)
attachments[i].finalLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
color_refs[i].attachment = i;
color_refs[i].layout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
+ dep_pipeline |= VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT;
+ dep_access |= VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;
+ if (attachments[i].loadOp == VK_ATTACHMENT_LOAD_OP_LOAD)
+ dep_access |= VK_ACCESS_COLOR_ATTACHMENT_READ_BIT;
}
int num_attachments = state->num_cbufs;
@@ -63,10 +69,21 @@ create_render_pass(VkDevice dev, struct zink_render_pass_state *state)
attachments[num_attachments].initialLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
attachments[num_attachments].finalLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
+ dep_pipeline |= VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT | VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT;
+ dep_pipeline |= VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
+ if (attachments[num_attachments].loadOp == VK_ATTACHMENT_LOAD_OP_LOAD ||
+ attachments[num_attachments].stencilLoadOp == VK_ATTACHMENT_LOAD_OP_LOAD)
+ dep_access |= VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT;
+
zs_ref.attachment = num_attachments++;
zs_ref.layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
}
+ VkSubpassDependency deps[] = {
+ [0] = {VK_SUBPASS_EXTERNAL, 0, dep_pipeline, dep_pipeline, 0, dep_access, VK_DEPENDENCY_BY_REGION_BIT},
+ [1] = {0, VK_SUBPASS_EXTERNAL, dep_pipeline, VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT, dep_access, 0, VK_DEPENDENCY_BY_REGION_BIT}
+ };
+
VkSubpassDescription subpass = {};
subpass.pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS;
subpass.colorAttachmentCount = state->num_cbufs;
@@ -79,6 +96,8 @@ create_render_pass(VkDevice dev, struct zink_render_pass_state *state)
rpci.pAttachments = attachments;
rpci.subpassCount = 1;
rpci.pSubpasses = &subpass;
+ rpci.dependencyCount = 2;
+ rpci.pDependencies = deps;
VkRenderPass render_pass;
if (vkCreateRenderPass(dev, &rpci, NULL, &render_pass) != VK_SUCCESS) {
More information about the mesa-commit
mailing list