diff options
author | Tony-LunarG <tony@lunarg.com> | 2019-06-13 15:32:05 -0600 |
---|---|---|
committer | Tony Barbour <tony@lunarg.com> | 2019-06-17 13:08:41 -0600 |
commit | 495604b6aa704fe961ef59d69e69bb39c1aaa9ee (patch) | |
tree | 912910730a72f8c1992f6439244804fe7040613f | |
parent | 122ac06d314c391d12d05f96aa8420010b123da2 (diff) | |
download | vulkan-tools-495604b6aa704fe961ef59d69e69bb39c1aaa9ee.tar.gz |
cube: Add subpass dependencies
Shared depth buffer and image layout transition both
need to be accounted for
Change-Id: Id26bc47798c58e4435a5585def3161105b7fffd1
-rw-r--r-- | cube/cube.c | 36 | ||||
-rw-r--r-- | cube/cube.cpp | 30 |
2 files changed, 56 insertions, 10 deletions
diff --git a/cube/cube.c b/cube/cube.c index 1d210342..644f3df4 100644 --- a/cube/cube.c +++ b/cube/cube.c @@ -1,7 +1,7 @@ /* - * Copyright (c) 2015-2016 The Khronos Group Inc. - * Copyright (c) 2015-2016 Valve Corporation - * Copyright (c) 2015-2016 LunarG, Inc. + * Copyright (c) 2015-2019 The Khronos Group Inc. + * Copyright (c) 2015-2019 Valve Corporation + * Copyright (c) 2015-2019 LunarG, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -1892,6 +1892,32 @@ static void demo_prepare_render_pass(struct demo *demo) { .preserveAttachmentCount = 0, .pPreserveAttachments = NULL, }; + + VkSubpassDependency attachmentDependencies[2] = { + [0] = + { + // Depth buffer is shared between swapchain images + .srcSubpass = VK_SUBPASS_EXTERNAL, + .dstSubpass = 0, + .srcStageMask = VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT | VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT, + .dstStageMask = VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT | VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT, + .srcAccessMask = VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT, + .dstAccessMask = VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT, + .dependencyFlags = 0, + }, + [1] = + { + // Image Layout Transition + .srcSubpass = VK_SUBPASS_EXTERNAL, + .dstSubpass = 0, + .srcStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, + .dstStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, + .srcAccessMask = 0, + .dstAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT | VK_ACCESS_COLOR_ATTACHMENT_READ_BIT, + .dependencyFlags = 0, + }, + }; + const VkRenderPassCreateInfo rp_info = { .sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, .pNext = NULL, @@ -1900,8 +1926,8 @@ static void demo_prepare_render_pass(struct demo *demo) { .pAttachments = attachments, .subpassCount = 1, .pSubpasses = &subpass, - .dependencyCount = 0, - .pDependencies = NULL, + .dependencyCount = 2, + .pDependencies = attachmentDependencies, }; VkResult U_ASSERT_ONLY err; diff --git a/cube/cube.cpp b/cube/cube.cpp index 4f3032af..04447fcd 100644 --- a/cube/cube.cpp +++ b/cube/cube.cpp @@ -1,7 +1,7 @@ /* - * Copyright (c) 2015-2016 The Khronos Group Inc. - * Copyright (c) 2015-2016 Valve Corporation - * Copyright (c) 2015-2016 LunarG, Inc. + * Copyright (c) 2015-2019 The Khronos Group Inc. + * Copyright (c) 2015-2019 Valve Corporation + * Copyright (c) 2015-2019 LunarG, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -1975,13 +1975,33 @@ void Demo::prepare_render_pass() { .setPreserveAttachmentCount(0) .setPPreserveAttachments(nullptr); + vk::PipelineStageFlags stages = vk::PipelineStageFlagBits::eEarlyFragmentTests | vk::PipelineStageFlagBits::eLateFragmentTests; + vk::SubpassDependency const dependencies[2] = { + vk::SubpassDependency() // Depth buffer is shared between swapchain images + .setSrcSubpass(VK_SUBPASS_EXTERNAL) + .setDstSubpass(0) + .setSrcStageMask(stages) + .setDstStageMask(stages) + .setSrcAccessMask(vk::AccessFlagBits::eDepthStencilAttachmentWrite) + .setDstAccessMask(vk::AccessFlagBits::eDepthStencilAttachmentRead | vk::AccessFlagBits::eDepthStencilAttachmentWrite) + .setDependencyFlags(vk::DependencyFlags()), + vk::SubpassDependency() // Image layout transition + .setSrcSubpass(VK_SUBPASS_EXTERNAL) + .setDstSubpass(0) + .setSrcStageMask(vk::PipelineStageFlagBits::eColorAttachmentOutput) + .setDstStageMask(vk::PipelineStageFlagBits::eColorAttachmentOutput) + .setSrcAccessMask(vk::AccessFlagBits()) + .setDstAccessMask(vk::AccessFlagBits::eColorAttachmentWrite | vk::AccessFlagBits::eColorAttachmentRead) + .setDependencyFlags(vk::DependencyFlags()), + }; + auto const rp_info = vk::RenderPassCreateInfo() .setAttachmentCount(2) .setPAttachments(attachments) .setSubpassCount(1) .setPSubpasses(&subpass) - .setDependencyCount(0) - .setPDependencies(nullptr); + .setDependencyCount(2) + .setPDependencies(dependencies); auto result = device.createRenderPass(&rp_info, nullptr, &render_pass); VERIFY(result == vk::Result::eSuccess); |