diff --git a/src/dofpass.cpp b/src/dofpass.cpp index 7368b1b..089fd7a 100644 --- a/src/dofpass.cpp +++ b/src/dofpass.cpp @@ -113,12 +113,12 @@ void DoFPass::createDescriptorSet(RenderTarget* target) { bokehImageInfo.sampler = bokehSampler_; VkDescriptorImageInfo sceneImageInfo = {}; - sceneImageInfo.imageLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL; + sceneImageInfo.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL; sceneImageInfo.imageView = target->offscreenColorImageViews[i]; sceneImageInfo.sampler = bokehSampler_; VkDescriptorImageInfo depthImageInfo = {}; - depthImageInfo.imageLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;; + depthImageInfo.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;; depthImageInfo.imageView = target->offscreenDepthImageViews[i]; depthImageInfo.sampler = bokehSampler_; @@ -164,7 +164,7 @@ void DoFPass::createRenderPass() { colorAttachment.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE; colorAttachment.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE; colorAttachment.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED; - colorAttachment.finalLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL; + colorAttachment.finalLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL; VkAttachmentReference colorAttachmentRef = {}; colorAttachmentRef.layout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL; @@ -225,7 +225,7 @@ void DoFPass::createPipeline() { vertShaderStageInfo.stage = VK_SHADER_STAGE_VERTEX_BIT; vertShaderStageInfo.module = vertShaderModule; vertShaderStageInfo.pName = "main"; - + VkPipelineShaderStageCreateInfo fragShaderStageInfo = {}; fragShaderStageInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO; fragShaderStageInfo.stage = VK_SHADER_STAGE_FRAGMENT_BIT; diff --git a/src/postpass.cpp b/src/postpass.cpp index 7283f70..705ccbb 100644 --- a/src/postpass.cpp +++ b/src/postpass.cpp @@ -45,22 +45,22 @@ void PostPass::createDescriptorSet(RenderTarget* target) { for(uint32_t i = 0; i < target->numImages; i++) { VkDescriptorImageInfo sceneImageInfo = {}; - sceneImageInfo.imageLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL; + sceneImageInfo.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL; sceneImageInfo.imageView = target->offscreenColorImageViews[i]; sceneImageInfo.sampler = offscreenSampler_; - + VkDescriptorImageInfo depthImageInfo = {}; - depthImageInfo.imageLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;; + depthImageInfo.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;; depthImageInfo.imageView = target->offscreenDepthImageViews[i]; depthImageInfo.sampler = offscreenSampler_; - + VkDescriptorImageInfo nearFieldImageInfo = {}; - nearFieldImageInfo.imageLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL; + nearFieldImageInfo.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL; nearFieldImageInfo.imageView = target->nearFieldImageViews[i]; nearFieldImageInfo.sampler = offscreenSampler_; - + VkDescriptorImageInfo farFieldImageInfo = {}; - farFieldImageInfo.imageLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL; + farFieldImageInfo.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL; farFieldImageInfo.imageView = target->farFieldImageViews[i]; farFieldImageInfo.sampler = offscreenSampler_; @@ -70,7 +70,7 @@ void PostPass::createDescriptorSet(RenderTarget* target) { sceneDescriptorWrite.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER; sceneDescriptorWrite.dstSet = target->postSets[i]; sceneDescriptorWrite.pImageInfo = &sceneImageInfo; - + VkWriteDescriptorSet depthDescriptorWrite = {}; depthDescriptorWrite.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET; depthDescriptorWrite.descriptorCount = 1; @@ -78,7 +78,7 @@ void PostPass::createDescriptorSet(RenderTarget* target) { depthDescriptorWrite.dstBinding = 1; depthDescriptorWrite.dstSet = target->postSets[i]; depthDescriptorWrite.pImageInfo = &depthImageInfo; - + VkWriteDescriptorSet nearFieldDescriptorWrite = {}; nearFieldDescriptorWrite.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET; nearFieldDescriptorWrite.descriptorCount = 1; @@ -86,7 +86,7 @@ void PostPass::createDescriptorSet(RenderTarget* target) { nearFieldDescriptorWrite.dstBinding = 2; nearFieldDescriptorWrite.dstSet = target->postSets[i]; nearFieldDescriptorWrite.pImageInfo = &nearFieldImageInfo; - + VkWriteDescriptorSet farFieldDescriptorWrite = {}; farFieldDescriptorWrite.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET; farFieldDescriptorWrite.descriptorCount = 1; @@ -94,7 +94,7 @@ void PostPass::createDescriptorSet(RenderTarget* target) { farFieldDescriptorWrite.dstBinding = 3; farFieldDescriptorWrite.dstSet = target->postSets[i]; farFieldDescriptorWrite.pImageInfo = &farFieldImageInfo; - + const std::array descriptorWrites = { sceneDescriptorWrite, depthDescriptorWrite, @@ -111,7 +111,7 @@ void PostPass::createDescriptorSetLayout() { offscreenSamplerBinding.descriptorCount = 1; offscreenSamplerBinding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER; offscreenSamplerBinding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT; - + VkDescriptorSetLayoutBinding depthSamplerBinding = {}; depthSamplerBinding.binding = 1; depthSamplerBinding.descriptorCount = 1; @@ -123,20 +123,20 @@ void PostPass::createDescriptorSetLayout() { nearFieldSamplerBinding.descriptorCount = 1; nearFieldSamplerBinding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER; nearFieldSamplerBinding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT; - + VkDescriptorSetLayoutBinding farFieldSamplerBinding = {}; farFieldSamplerBinding.binding = 3; farFieldSamplerBinding.descriptorCount = 1; farFieldSamplerBinding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER; farFieldSamplerBinding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT; - + const std::array bindings = { offscreenSamplerBinding, depthSamplerBinding, nearFieldSamplerBinding, farFieldSamplerBinding }; - + VkDescriptorSetLayoutCreateInfo createInfo = {}; createInfo.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO; createInfo.bindingCount = bindings.size(); diff --git a/src/renderer.cpp b/src/renderer.cpp index 3585104..aafa8cc 100644 --- a/src/renderer.cpp +++ b/src/renderer.cpp @@ -1283,12 +1283,23 @@ void Renderer::createPresentationRenderPass() { subpass.colorAttachmentCount = 1; subpass.pColorAttachments = &colorAttachmentRef; + std::array dependencies; + dependencies[0].srcSubpass = VK_SUBPASS_EXTERNAL; + dependencies[0].dstSubpass = 0; + dependencies[0].srcStageMask = VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT; + dependencies[0].dstStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT; + dependencies[0].srcAccessMask = VK_ACCESS_MEMORY_READ_BIT; + dependencies[0].dstAccessMask = VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT; + dependencies[0].dependencyFlags = VK_DEPENDENCY_BY_REGION_BIT; + VkRenderPassCreateInfo renderPassInfo = {}; renderPassInfo.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO; renderPassInfo.attachmentCount = 1; renderPassInfo.pAttachments = &colorAttachment; renderPassInfo.subpassCount = 1; renderPassInfo.pSubpasses = &subpass; + renderPassInfo.dependencyCount = dependencies.size(); + renderPassInfo.pDependencies = dependencies.data(); vkCreateRenderPass(device_, &renderPassInfo, nullptr, &presentationRenderPass_); } diff --git a/src/worldpass.cpp b/src/worldpass.cpp index 79a8fba..d879b02 100644 --- a/src/worldpass.cpp +++ b/src/worldpass.cpp @@ -93,7 +93,7 @@ void WorldPass::createRenderPass() { colorAttachment.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE; colorAttachment.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE; colorAttachment.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED; - colorAttachment.finalLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL; + colorAttachment.finalLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL; VkAttachmentDescription depthAttachment = {}; depthAttachment.format = VK_FORMAT_D32_SFLOAT; @@ -103,7 +103,7 @@ void WorldPass::createRenderPass() { depthAttachment.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE; depthAttachment.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE; depthAttachment.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED; - depthAttachment.finalLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL; + depthAttachment.finalLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL; VkAttachmentReference colorAttachmentRef = {}; colorAttachmentRef.layout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL; @@ -123,12 +123,31 @@ void WorldPass::createRenderPass() { depthAttachment }; + std::array dependencies; + dependencies[0].srcSubpass = VK_SUBPASS_EXTERNAL; + dependencies[0].dstSubpass = 0; + dependencies[0].srcStageMask = VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT; + dependencies[0].dstStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT; + dependencies[0].srcAccessMask = VK_ACCESS_MEMORY_READ_BIT; + dependencies[0].dstAccessMask = VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT; + dependencies[0].dependencyFlags = VK_DEPENDENCY_BY_REGION_BIT; + + dependencies[1].srcSubpass = 0; + dependencies[1].dstSubpass = VK_SUBPASS_EXTERNAL; + dependencies[1].srcStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT; + dependencies[1].dstStageMask = VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT; + dependencies[1].srcAccessMask = VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT; + dependencies[1].dstAccessMask = VK_ACCESS_MEMORY_READ_BIT; + dependencies[1].dependencyFlags = VK_DEPENDENCY_BY_REGION_BIT; + VkRenderPassCreateInfo renderPassInfo = {}; renderPassInfo.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO; renderPassInfo.attachmentCount = attachments.size(); renderPassInfo.pAttachments = attachments.data(); renderPassInfo.subpassCount = 1; renderPassInfo.pSubpasses = &subpass; + renderPassInfo.dependencyCount = dependencies.size(); + renderPassInfo.pDependencies = dependencies.data(); vkCreateRenderPass(renderer_.getDevice(), &renderPassInfo, nullptr, &renderPass_); }