diff options
| author | Jonathan Bradley <jcb@pikum.xyz> | 2023-11-21 19:56:25 -0500 |
|---|---|---|
| committer | Jonathan Bradley <jcb@pikum.xyz> | 2023-11-21 19:56:25 -0500 |
| commit | d43ef1a1c0873b235a7e7ebcfb27a5f7d2b25303 (patch) | |
| tree | 803408bbdb09fcc4cb8adbf82c87c9a84aebb3f5 /src/window.cpp | |
| parent | 79bb6ab8c0c7b3ecc14926cd682224ca7c01f094 (diff) | |
checkpoint - memory overhual including tests
Diffstat (limited to 'src/window.cpp')
| -rw-r--r-- | src/window.cpp | 34 |
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; |
