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