Module: Mesa Branch: master Commit: 911486360902ef2339c7307f09fd5cbec0d45661 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=911486360902ef2339c7307f09fd5cbec0d45661
Author: Mike Blumenkrantz <[email protected]> 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 <[email protected]> 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) { _______________________________________________ mesa-commit mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/mesa-commit
