35 #include "../../../Primitives/interface/MemoryAllocator.h"
36 #include "../../../Platforms/Basic/interface/DebugUtilities.hpp"
37 #include "../../../Common/interface/Align.hpp"
38 #include "../../../Common/interface/STDAllocator.hpp"
72 m_CompletedFrameHeads{std::move(rhs.m_CompletedFrameHeads)},
75 m_MaxSize {rhs.m_MaxSize },
76 m_UsedSize {rhs.m_UsedSize },
77 m_CurrFrameSize {rhs.m_CurrFrameSize}
84 rhs.m_CurrFrameSize = 0;
89 m_CompletedFrameHeads = std::move(rhs.m_CompletedFrameHeads);
92 m_MaxSize = rhs.m_MaxSize;
93 m_UsedSize = rhs.m_UsedSize;
94 m_CurrFrameSize = rhs.m_CurrFrameSize;
100 rhs.m_CurrFrameSize = 0;
112 VERIFY(m_UsedSize == 0,
"All space in the ring buffer must be released");
119 Size =
AlignUp(Size, Alignment);
121 if (m_UsedSize + Size > m_MaxSize)
126 auto AlignedHead =
AlignUp(m_Head, Alignment);
127 if (m_Head >= m_Tail)
135 if (AlignedHead + Size <= m_MaxSize)
137 auto Offset = AlignedHead;
138 auto AdjustedSize = Size + (AlignedHead - m_Head);
139 m_Head += AdjustedSize;
140 m_UsedSize += AdjustedSize;
141 m_CurrFrameSize += AdjustedSize;
144 else if (Size <= m_Tail)
153 OffsetType AddSize = (m_MaxSize - m_Head) + Size;
154 m_UsedSize += AddSize;
155 m_CurrFrameSize += AddSize;
160 else if (AlignedHead + Size <= m_Tail)
167 auto Offset = AlignedHead;
168 auto AdjustedSize = Size + (AlignedHead - m_Head);
169 m_Head += AdjustedSize;
170 m_UsedSize += AdjustedSize;
171 m_CurrFrameSize += AdjustedSize;
183 #ifdef DILIGENT_DEBUG
184 if (!m_CompletedFrameHeads.empty())
185 VERIFY(FenceValue >= m_CompletedFrameHeads.back().FenceValue,
"Current frame fence value (", FenceValue,
") is lower than the fence value of the previous frame (", m_CompletedFrameHeads.back().FenceValue,
")");
188 if (m_CurrFrameSize != 0)
190 m_CompletedFrameHeads.emplace_back(FenceValue, m_Head, m_CurrFrameSize);
200 while (!m_CompletedFrameHeads.empty() && m_CompletedFrameHeads.front().FenceValue <= CompletedFenceValue)
202 const auto& OldestFrameHead = m_CompletedFrameHeads.front();
204 m_UsedSize -= OldestFrameHead.Size;
205 m_Tail = OldestFrameHead.Offset;
206 m_CompletedFrameHeads.pop_front();
211 #ifdef DILIGENT_DEBUG
212 VERIFY(m_CompletedFrameHeads.empty(),
"Zero-size heads are not added to the list, and since the buffer is empty, there must be no heads in the list");
213 for (
const auto& head : m_CompletedFrameHeads)
214 VERIFY(head.Size == 0,
"Non zero-size head found");
216 m_CompletedFrameHeads.clear();
226 bool IsFull()
const {
return m_UsedSize==m_MaxSize; };
227 bool IsEmpty()
const {
return m_UsedSize==0; };
232 std::deque<FrameHeadAttribs, STDAllocatorRawMem<FrameHeadAttribs>> m_CompletedFrameHeads;