126 {
128
129 std::vector<VkAttachmentDescription> attachmentDescription;
131 attachmentDescription.push_back(description);
132 return false;
133 });
134
135 std::vector<VkSubpassDescription> subPassDescription;
136 m_SubPasses->for_each([&](
const std::string& name,
const std::shared_ptr<RendererSubPass>& subpass) {
137 subPassDescription.push_back(subpass->GetDescription());
138 return false;
139 });
140
141 std::vector<VkSubpassDependency> subPassDependency;
142 (*
m_SubPasses->first())->AddFirstSubPassDependency();
143 m_SubPasses->for_each([&](
const std::string& name,
const std::shared_ptr<RendererSubPass>& subpass) {
144 subPassDependency.insert(subPassDependency.end(), subpass->GetDependency().begin(), subpass->GetDependency().end());
145 return false;
146 });
147
148 VkSubpassDependency outDependency{};
149 outDependency.srcSubpass =
static_cast<uint32_t
>(
m_SubPasses->size() - 1);
150 outDependency.dstSubpass = VK_SUBPASS_EXTERNAL;
151 outDependency.srcStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT;
152 outDependency.dstStageMask = VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT;
153 outDependency.srcAccessMask = VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;
154 outDependency.dstAccessMask = VK_ACCESS_MEMORY_READ_BIT;
155 outDependency.dependencyFlags = VK_DEPENDENCY_BY_REGION_BIT;
156
157 subPassDependency.push_back(outDependency);
158
159 VkRenderPassCreateInfo renderPassInfo{};
160 renderPassInfo.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
161 renderPassInfo.attachmentCount = static_cast<uint32_t>(attachmentDescription.size());
162 renderPassInfo.pAttachments = attachmentDescription.data();
163 renderPassInfo.subpassCount = static_cast<uint32_t>(subPassDescription.size());
164 renderPassInfo.pSubpasses = subPassDescription.data();
165 renderPassInfo.dependencyCount = static_cast<uint32_t>(subPassDependency.size());
166 renderPassInfo.pDependencies = subPassDependency.data();
167
169 {
170 std::stringstream ss;
171 ss <<
m_PassName <<
": RendererPss Create Failed: Not enough imageview for attachment.";
172
173 SPICES_CORE_ERROR(ss.str())
174 }
175
180 renderPassInfo,
184 );
185 }
#define SPICES_PROFILE_ZONE
uint32_t m_MaxLayers
Max Attachment layer.
scl::linked_unordered_map< std::string, VkAttachmentDescription > m_AttachmentDescriptions
VkAttachmentDescription this RenderPass handled.
std::vector< VkImageView > m_ImageViews
VkImageView this RenderPass handled.
std::shared_ptr< VulkanDevice > m_Device
VulkanDevice.
std::string m_PassName
RenderPass's name.
std::unique_ptr< VulkanRenderPass > m_RenderPass
VulkanRenderPass this RenderPass handled.
std::shared_ptr< scl::linked_unordered_map< std::string, std::shared_ptr< RendererSubPass > > > m_SubPasses
SubPass this RenderPass handled.
bool m_IsSwapChainImageInUse
True if the RendererPass is using swapchain image.
static VulkanState & GetState()
Get VulkanState in use.
size_t size()
The container's element size.
void for_each(F &fn)
Iter the container in order.