summaryrefslogtreecommitdiff
path: root/src/window.cpp
diff options
context:
space:
mode:
authorJonathan Bradley <jcb@pikum.xyz>2023-11-21 19:56:25 -0500
committerJonathan Bradley <jcb@pikum.xyz>2023-11-21 19:56:25 -0500
commitd43ef1a1c0873b235a7e7ebcfb27a5f7d2b25303 (patch)
tree803408bbdb09fcc4cb8adbf82c87c9a84aebb3f5 /src/window.cpp
parent79bb6ab8c0c7b3ecc14926cd682224ca7c01f094 (diff)
checkpoint - memory overhual including tests
Diffstat (limited to 'src/window.cpp')
-rw-r--r--src/window.cpp34
1 files changed, 21 insertions, 13 deletions
diff --git a/src/window.cpp b/src/window.cpp
index 480175a..3773643 100644
--- a/src/window.cpp
+++ b/src/window.cpp
@@ -242,6 +242,7 @@ unsigned int FindQueueFamilyIndex(VkPhysicalDevice device, short hasPresentSuppo
void PKE_vkFreeFunction(void *pUserData, void *pMemory) {
pke_vkAllocData *chunk = nullptr;
+ if (pMemory == nullptr) return;
size_t index = -1;
size_t count = vulkanAllocs->Count();
for (long i = 0; i < count; ++i) {
@@ -257,11 +258,13 @@ void PKE_vkFreeFunction(void *pUserData, void *pMemory) {
}
void *PKE_vkAllocateFunction(void *pUserData, size_t size, size_t alignment, VkSystemAllocationScope allocScope) {
- size_t alignedSize = size + ((size % alignment) == 0 ? 0 : (alignment - (size % alignment)));
- void *ptr = Pke_New(alignedSize, alignment, MemBkt_Vulkan);
+ if (size == 0) {
+ return nullptr;
+ }
+ void *ptr = Pke_New(size, alignment, MemBkt_Vulkan);
vulkanAllocs->Push({
.data = ptr,
- .size = alignedSize,
+ .size = size,
});
return ptr;
}
@@ -269,22 +272,27 @@ void *PKE_vkAllocateFunction(void *pUserData, size_t size, size_t alignment, VkS
void *PKE_vkReallocationFunction(void *pUserData, void *pOriginal, size_t size, size_t alignment, VkSystemAllocationScope allocScope) {
pke_vkAllocData *chunk = nullptr;
size_t index = -1;
- if (pOriginal) {
- size_t count = vulkanAllocs->Count();
- for (long i = 0; i < count; ++i) {
- if ((*vulkanAllocs)[i].data == pOriginal) {
- chunk = &(*vulkanAllocs)[i];
- index = i;
- break;
- }
+ if (pOriginal == nullptr) {
+ return PKE_vkAllocateFunction(pUserData, size, alignment, allocScope);
+ }
+ if (size == 0) {
+ PKE_vkFreeFunction(pUserData, pOriginal);
+ return nullptr;
+ }
+ size_t count = vulkanAllocs->Count();
+ for (long i = 0; i < count; ++i) {
+ if ((*vulkanAllocs)[i].data == pOriginal) {
+ chunk = &(*vulkanAllocs)[i];
+ index = i;
+ break;
}
}
assert(chunk != nullptr);
- if (chunk->size > size) {
+ if (chunk->size >= size) {
return pOriginal;
}
void *newPtr = PKE_vkAllocateFunction(pUserData, size, alignment, allocScope);
- memcpy(newPtr, chunk->data, chunk->size);
+ memcpy(newPtr, chunk->data, (chunk->size < size ? chunk->size : size) - 1);
Pke_Delete(chunk->data, chunk->size, MemBkt_Vulkan);
vulkanAllocs->Remove(index);
return newPtr;