-
Notifications
You must be signed in to change notification settings - Fork 3
Expand file tree
/
Copy pathFrameMemoryManager.cpp
More file actions
81 lines (59 loc) · 2.14 KB
/
Copy pathFrameMemoryManager.cpp
File metadata and controls
81 lines (59 loc) · 2.14 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
#include "stdafx.h"
#include "FrameMemoryManager.h"
#include "GameMain.h"
//////////////////////////////////////////////////////////////////////////
FrameMemoryManager gFrameMemoryManager;
//////////////////////////////////////////////////////////////////////////
FrameMemoryManager::arena_buffer_resource::arena_buffer_resource(void* buffer, const size_t bufferSize) noexcept
: mBufferPtr(buffer)
, mCursorPtr(buffer)
, mSpaceAvailable(bufferSize)
, mBufferSize(bufferSize)
{
}
void FrameMemoryManager::arena_buffer_resource::restart() noexcept
{
mCursorPtr = mBufferPtr;
mSpaceAvailable = mBufferSize;
cxx_assert(mAllocationsCounter == mDeallocationsCounter);
mAllocationsCounter = 0;
mDeallocationsCounter = 0;
}
void* FrameMemoryManager::arena_buffer_resource::do_allocate(const size_t dataBytes, const size_t dataAlign)
{
if (!_STD align(dataAlign, dataBytes, mCursorPtr, mSpaceAvailable))
{
gConsole.LogMessage(eLogLevel_Error, "Fatal error: frame memory budget exceeded");
gGame.Terminate();
return nullptr;
}
void* resultPtr = mCursorPtr;
mCursorPtr = reinterpret_cast<char *>(mCursorPtr) + dataBytes;
mSpaceAvailable -= dataBytes;
++mAllocationsCounter;
return (resultPtr);
}
void FrameMemoryManager::arena_buffer_resource::do_deallocate(void * ptr, size_t dataBytes, size_t dataAlign)
{
++mDeallocationsCounter;
}
//////////////////////////////////////////////////////////////////////////
bool FrameMemoryManager::Initialize()
{
mBuffer = std::make_unique<std::byte[]>(FrameBufferCapacity);
mDefaultMemoryResource = std::pmr::get_default_resource();
mArenaBufferResource.emplace(mBuffer.get(), FrameBufferCapacity);
std::pmr::set_default_resource(&*mArenaBufferResource);
return true;
}
void FrameMemoryManager::Shutdown()
{
std::pmr::set_default_resource(mDefaultMemoryResource);
mDefaultMemoryResource = nullptr;
mArenaBufferResource.reset();
mBuffer.reset();
}
void FrameMemoryManager::ResetFrameMemory()
{
mArenaBufferResource->restart();
}