#include #include #include VK_NAMESPACE_BEGIN void Device::CreateSubpassDependency(List &subpass_dependency_list,const uint32_t count) { if(count==1) { VkSubpassDependency dependency; dependency.srcSubpass = VK_SUBPASS_EXTERNAL; dependency.dstSubpass = 0; dependency.srcStageMask = VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT; dependency.dstStageMask = VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT; dependency.srcAccessMask = VK_ACCESS_MEMORY_READ_BIT; dependency.dstAccessMask = VK_ACCESS_MEMORY_READ_BIT; dependency.dependencyFlags = VK_DEPENDENCY_BY_REGION_BIT; subpass_dependency_list.Add(dependency); } else { for(uint32_t i=0;i &ref_list,List &desc_list,const List &color_format,const VkFormat depth_format,VkImageLayout color_final_layout,VkImageLayout depth_final_layout) { if(!attr->physical_device->CheckDepthFormat(depth_format)) return(false); uint atta_count=color_format.GetCount(); desc_list.SetCount(atta_count+1); VkAttachmentDescription *desc=desc_list.GetData(); ref_list.SetCount(atta_count+1); VkAttachmentReference *ref=ref_list.GetData(); for(uint i=0;i &desc_list, const List &subpass, const List &dependency, const List &color_format, const VkFormat depth_format, const VkImageLayout color_final_layout, const VkImageLayout depth_final_layout) { VkRenderPassCreateInfo rp_info; rp_info.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO; rp_info.pNext = nullptr; rp_info.attachmentCount = desc_list.GetCount(); rp_info.pAttachments = desc_list.GetData(); rp_info.subpassCount = subpass.GetCount(); rp_info.pSubpasses = subpass.GetData(); rp_info.dependencyCount = dependency.GetCount(); rp_info.pDependencies = dependency.GetData(); VkRenderPass render_pass; if(vkCreateRenderPass(attr->device,&rp_info,nullptr,&render_pass)!=VK_SUCCESS) return(nullptr); return(new RenderPass(attr->device,render_pass,color_format,depth_format)); } RenderPass *Device::CreateRenderPass(VkFormat color_format,VkFormat depth_format,VkImageLayout color_final_layout,VkImageLayout depth_final_layout) { List ref_list; List desc_list; List color_format_list; color_format_list.Add(color_format); CreateAttachment(ref_list,desc_list,color_format_list,depth_format,color_final_layout,depth_final_layout); List subpass_desc_list; VkSubpassDescription subpass; subpass.flags = 0; subpass.pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS; subpass.inputAttachmentCount = 0; subpass.pInputAttachments = nullptr; subpass.colorAttachmentCount = 1; subpass.pColorAttachments = ref_list.GetData(); subpass.pResolveAttachments = nullptr; subpass.pDepthStencilAttachment = ref_list.GetData()+1; subpass.preserveAttachmentCount = 0; subpass.pPreserveAttachments = nullptr; subpass_desc_list.Add(subpass); List subpass_dependency_list; CreateSubpassDependency(subpass_dependency_list,1); return CreateRenderPass(desc_list,subpass_desc_list,subpass_dependency_list,color_format_list,depth_format,color_final_layout,depth_final_layout); } VK_NAMESPACE_END