45 template <
typename RenderDeviceImplType>
63 template <
typename EngineImplTraits>
64 class RenderPassBase :
public DeviceObjectBase<typename EngineImplTraits::RenderPassInterface, typename EngineImplTraits::RenderDeviceImplType, RenderPassDesc>
83 bool bIsDeviceInternal =
false) :
88 if (Desc.AttachmentCount != 0)
93 for (
Uint32 i = 0; i < Desc.AttachmentCount; ++i)
95 pAttachments[i] = Desc.pAttachments[i];
96 _CorrectAttachmentState<RenderDeviceImplType>(pAttachments[i].FinalState);
100 Uint32 TotalAttachmentReferencesCount = 0;
101 Uint32 TotalPreserveAttachmentsCount = 0;
103 if (TotalAttachmentReferencesCount != 0)
107 if (TotalPreserveAttachmentsCount != 0)
109 m_pPreserveAttachments =
ALLOCATE(
GetRawAllocator(),
"Memory for subpass preserve attachments array",
Uint32, TotalPreserveAttachmentsCount);
112 m_AttachmentStates.resize(Desc.AttachmentCount * Desc.SubpassCount);
113 m_AttachmentFirstLastUse.resize(Desc.AttachmentCount, std::pair<Uint32, Uint32>{ATTACHMENT_UNUSED, 0});
115 auto* pCurrAttachmentRef = m_pAttachmentReferences;
116 auto* pCurrPreserveAttachment = m_pPreserveAttachments;
117 VERIFY(Desc.SubpassCount != 0,
"Render pass must have at least one subpass");
121 for (
Uint32 subpass = 0; subpass < Desc.SubpassCount; ++subpass)
123 for (
Uint32 att = 0; att < Desc.AttachmentCount; ++att)
125 SetAttachmentState(subpass, att, subpass > 0 ?
GetAttachmentState(subpass - 1, att) : Desc.pAttachments[subpass].InitialState);
128 const auto& SrcSubpass = Desc.pSubpasses[subpass];
129 auto& DstSubpass = pSubpasses[subpass];
131 auto UpdateAttachmentStateAndFirstUseSubpass = [
this, subpass](
const AttachmentReference& AttRef)
135 SetAttachmentState(subpass, AttRef.AttachmentIndex, AttRef.State);
136 auto& FirstLastUse = m_AttachmentFirstLastUse[AttRef.AttachmentIndex];
138 FirstLastUse.first = subpass;
139 FirstLastUse.second = subpass;
143 DstSubpass = SrcSubpass;
144 if (SrcSubpass.InputAttachmentCount != 0)
146 DstSubpass.pInputAttachments = pCurrAttachmentRef;
147 for (
Uint32 input_attachment = 0; input_attachment < SrcSubpass.InputAttachmentCount; ++input_attachment, ++pCurrAttachmentRef)
149 *pCurrAttachmentRef = SrcSubpass.pInputAttachments[input_attachment];
150 UpdateAttachmentStateAndFirstUseSubpass(*pCurrAttachmentRef);
154 DstSubpass.pInputAttachments =
nullptr;
156 if (SrcSubpass.RenderTargetAttachmentCount != 0)
158 DstSubpass.pRenderTargetAttachments = pCurrAttachmentRef;
159 for (
Uint32 rt_attachment = 0; rt_attachment < SrcSubpass.RenderTargetAttachmentCount; ++rt_attachment, ++pCurrAttachmentRef)
161 *pCurrAttachmentRef = SrcSubpass.pRenderTargetAttachments[rt_attachment];
162 UpdateAttachmentStateAndFirstUseSubpass(*pCurrAttachmentRef);
165 if (DstSubpass.pResolveAttachments)
167 DstSubpass.pResolveAttachments = pCurrAttachmentRef;
168 for (
Uint32 rslv_attachment = 0; rslv_attachment < SrcSubpass.RenderTargetAttachmentCount; ++rslv_attachment, ++pCurrAttachmentRef)
170 *pCurrAttachmentRef = SrcSubpass.pResolveAttachments[rslv_attachment];
171 _CorrectAttachmentState<RenderDeviceImplType>(pCurrAttachmentRef->State);
172 UpdateAttachmentStateAndFirstUseSubpass(*pCurrAttachmentRef);
178 DstSubpass.pRenderTargetAttachments =
nullptr;
179 DstSubpass.pResolveAttachments =
nullptr;
182 if (SrcSubpass.pDepthStencilAttachment !=
nullptr)
184 DstSubpass.pDepthStencilAttachment = pCurrAttachmentRef;
185 *(pCurrAttachmentRef++) = *SrcSubpass.pDepthStencilAttachment;
186 UpdateAttachmentStateAndFirstUseSubpass(*SrcSubpass.pDepthStencilAttachment);
189 if (SrcSubpass.PreserveAttachmentCount != 0)
191 DstSubpass.pPreserveAttachments = pCurrPreserveAttachment;
192 for (
Uint32 prsv_attachment = 0; prsv_attachment < SrcSubpass.PreserveAttachmentCount; ++prsv_attachment)
193 *(pCurrPreserveAttachment++) = SrcSubpass.pPreserveAttachments[prsv_attachment];
196 DstSubpass.pPreserveAttachments =
nullptr;
198 VERIFY_EXPR(pCurrAttachmentRef - m_pAttachmentReferences ==
static_cast<ptrdiff_t
>(TotalAttachmentReferencesCount));
199 VERIFY_EXPR(pCurrPreserveAttachment - m_pPreserveAttachments ==
static_cast<ptrdiff_t
>(TotalPreserveAttachmentsCount));
201 if (Desc.DependencyCount != 0)
203 auto* pDependencies =
206 for (
Uint32 i = 0; i < Desc.DependencyCount; ++i)
208 pDependencies[i] = Desc.pDependencies[i];
222 if (m_pAttachmentReferences !=
nullptr)
223 RawAllocator.Free(m_pAttachmentReferences);
224 if (m_pPreserveAttachments !=
nullptr)
225 RawAllocator.Free(m_pPreserveAttachments);
239 return m_AttachmentFirstLastUse[Attachment];
244 Uint32& TotalAttachmentReferencesCount,
245 Uint32& TotalPreserveAttachmentsCount)
247 TotalAttachmentReferencesCount = 0;
248 TotalPreserveAttachmentsCount = 0;
253 TotalAttachmentReferencesCount += Subpass.RenderTargetAttachmentCount;
254 if (Subpass.pResolveAttachments !=
nullptr)
255 TotalAttachmentReferencesCount += Subpass.RenderTargetAttachmentCount;
256 if (Subpass.pDepthStencilAttachment !=
nullptr)
257 TotalAttachmentReferencesCount += 1;
258 TotalPreserveAttachmentsCount += Subpass.PreserveAttachmentCount;
271 Uint32* m_pPreserveAttachments =
nullptr;
274 std::vector<RESOURCE_STATE> m_AttachmentStates;
277 std::vector<std::pair<Uint32, Uint32>> m_AttachmentFirstLastUse;