31 #include "MemoryAllocator.h" 32 #include "STDAllocator.h" 33 #include "DebugUtilities.h" 41 typedef size_t OffsetType;
42 struct FrameTailAttribs
44 FrameTailAttribs(
Uint64 fv, OffsetType off, OffsetType sz) :
56 static const OffsetType InvalidOffset =
static_cast<OffsetType
>(-1);
59 m_CompletedFrameTails(0, FrameTailAttribs(0,0,0), STD_ALLOCATOR_RAW_MEM(FrameTailAttribs, Allocator,
"Allocator for vector<FrameNumOffsetPair>" )),
64 m_CompletedFrameTails(std::move(rhs.m_CompletedFrameTails)),
67 m_MaxSize(rhs.m_MaxSize),
68 m_UsedSize(rhs.m_UsedSize),
69 m_CurrFrameSize(rhs.m_CurrFrameSize)
75 rhs.m_CurrFrameSize = 0;
80 m_CompletedFrameTails = std::move(rhs.m_CompletedFrameTails);
83 m_MaxSize = rhs.m_MaxSize;
84 m_UsedSize = rhs.m_UsedSize;
85 m_CurrFrameSize = rhs.m_CurrFrameSize;
91 rhs.m_CurrFrameSize = 0;
101 VERIFY(m_UsedSize==0,
"All space in the ring buffer must be released");
104 OffsetType Allocate(OffsetType Size)
108 return InvalidOffset;
111 if (m_Tail >= m_Head )
118 if (m_Tail + Size <= m_MaxSize)
120 auto Offset = m_Tail;
123 m_CurrFrameSize += Size;
126 else if(Size <= m_Head)
129 OffsetType AddSize = (m_MaxSize - m_Tail) + Size;
130 m_UsedSize += AddSize;
131 m_CurrFrameSize += AddSize;
136 else if (m_Tail + Size <= m_Head )
143 auto Offset = m_Tail;
146 m_CurrFrameSize += Size;
150 return InvalidOffset;
156 void FinishCurrentFrame(
Uint64 FenceValue)
158 m_CompletedFrameTails.emplace_back(FenceValue, m_Tail, m_CurrFrameSize);
164 void ReleaseCompletedFrames(
Uint64 CompletedFenceValue)
167 while(!m_CompletedFrameTails.empty() && m_CompletedFrameTails.front().FenceValue <= CompletedFenceValue)
169 const auto &OldestFrameTail = m_CompletedFrameTails.front();
170 VERIFY_EXPR(OldestFrameTail.Size <= m_UsedSize);
171 m_UsedSize -= OldestFrameTail.Size;
172 m_Head = OldestFrameTail.Offset;
173 m_CompletedFrameTails.pop_front();
177 OffsetType GetMaxSize()
const{
return m_MaxSize;}
178 bool IsFull()
const{
return m_UsedSize==m_MaxSize; };
179 bool IsEmpty()
const{
return m_UsedSize==0; };
180 OffsetType GetUsedSize()
const{
return m_UsedSize;}
233 std::deque< FrameTailAttribs, STDAllocatorRawMem<FrameTailAttribs> > m_CompletedFrameTails;
234 OffsetType m_Head = 0;
235 OffsetType m_Tail = 0;
236 OffsetType m_MaxSize = 0;
237 OffsetType m_UsedSize = 0;
238 OffsetType m_CurrFrameSize = 0;
Graphics engine namespace.
Definition: AdaptiveFixedBlockAllocator.h:30
uint64_t Uint64
64-bit unsigned integer
Definition: BasicTypes.h:38
Base interface for a raw memory allocator.
Definition: MemoryAllocator.h:35
Implementation of a ring buffer. The class is not thread-safe.
Definition: RingBuffer.h:38