2
3
4
5
9#include "Render/Vulkan/VulkanRenderBackend.h"
10#include "Render/Renderer/DescriptorSetManager/DescriptorSetManager.h"
18 m_SubPasses->for_each([&](
const std::string& name,
const std::shared_ptr<RendererSubPass>& subpass) {
19 const String2 s2(m_PassName, name);
20 DescriptorSetManager::UnLoad(s2);
26 const std::string& subPassName ,
33 if (m_SubPasses->has_key(subPassName))
36 ss <<
"RendererPass: " <<
m_PassName <<
": SubPass: " << subPassName <<
" already added.";
38 SPICES_CORE_WARN(ss.str());
42 auto ptr = std::make_shared<
RendererSubPass>(subPassName, index, flags);
43 m_SubPasses->push_back(subPassName, ptr);
48 const std::string& attachmentName ,
49 const VkAttachmentDescription& description ,
51 const VkClearValue& clearValue
56 if (m_AttachmentDescriptions.has_key(attachmentName))
59 m_AttachmentDescriptions.for_each([&](
const auto& K,
const auto& V) {
60 if (K == attachmentName)
73 if (attachmentName ==
"SwapChainImage")
78 m_MaxLayers = glm::max(m_MaxLayers, layers);
79 m_ClearValues.push_back(clearValue);
80 m_AttachmentDescriptions.push_back(attachmentName, description);
82 return static_cast<uint32_t>(m_AttachmentDescriptions.size() - 1);
86 const std::string& attachmentName ,
87 const VkAttachmentDescription& description ,
88 const VkClearValue& clearValue ,
90 const VkImageView& view
95 if (m_AttachmentDescriptions.has_key(attachmentName))
98 m_AttachmentDescriptions.for_each([&](
const auto& K,
const auto& V) {
99 if (K == attachmentName)
112 if (attachmentName ==
"SwapChainImage")
117 m_MaxLayers = glm::max(m_MaxLayers, layers);
118 m_ClearValues.push_back(clearValue);
119 m_AttachmentDescriptions.push_back(attachmentName, description);
120 m_ImageViews.push_back(view);
122 return static_cast<uint32_t>(m_AttachmentDescriptions.size() - 1);
129 std::vector<VkAttachmentDescription> attachmentDescription;
130 m_AttachmentDescriptions.for_each([&](
const std::string& name,
const VkAttachmentDescription& description) {
131 attachmentDescription.push_back(description);
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());
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());
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;
157 subPassDependency.push_back(outDependency);
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();
168 if (m_AttachmentDescriptions.size() != m_ImageViews.size() + 1 && m_AttachmentDescriptions.size() != m_ImageViews.size())
170 std::stringstream ss;
171 ss <<
m_PassName <<
": RendererPss Create Failed: Not enough imageview for attachment.";
173 SPICES_CORE_ERROR(ss.str())
176 m_RenderPass = std::make_unique<VulkanRenderPass>(
177 VulkanRenderBackend::GetState(),
183 m_IsSwapChainImageInUse
#define SPICES_PROFILE_ZONE
Basic interface of Queries.
std::shared_ptr< RendererSubPass > AddSubPass(const std::string &subPassName, uint32_t index, Querier::StatisticsFlags flags) const
Add a subp ass to this renderer pass.
uint32_t AddAttachment(const std::string &attachmentName, const VkAttachmentDescription &description, const VkClearValue &clearValue, uint32_t layers, const VkImageView &view)
Add a attachment to this renderer pass.
uint32_t AddAttachment(const std::string &attachmentName, const VkAttachmentDescription &description, uint32_t layers, const VkClearValue &clearValue)
Add a attachment to this renderer pass.
std::string m_PassName
RenderPass's name.
void BuildRendererPass()
Build RenderPass.
bool m_IsSwapChainImageInUse
True if the RendererPass is using swapchain image.
This class is a wrapper of VulkanRenderPass. Used during Renderer.
This Class Combines some data relative to sub pass. Usually as a member variable of RendererPass.