diff options
| -rw-r--r-- | src/memory.cpp | 41 | ||||
| -rw-r--r-- | src/memory.hpp | 18 | ||||
| -rw-r--r-- | src/window.cpp | 8 |
3 files changed, 35 insertions, 32 deletions
diff --git a/src/memory.cpp b/src/memory.cpp index 83f8483..abaea00 100644 --- a/src/memory.cpp +++ b/src/memory.cpp @@ -21,6 +21,13 @@ int64_t InitNewBucket(int64_t sz) { return bucketHead++; } +void *pke::PkeNew(std::size_t sz, pke::MemBucket *bkt) { + void *ptr = bkt->ptr + bkt->head; + bkt->head += sz; + bkt->allocs++; + return ptr; +} + void *pke::PkeNew(std::size_t sz) { MemBucket *bkt = nullptr; for (long i = 0; i < bucketHead; ++i) { @@ -31,20 +38,20 @@ void *pke::PkeNew(std::size_t sz) { if (bkt == nullptr) { bkt = &buckets[InitNewBucket(DEFAULT_BUCKET_SIZE)]; } - void *ptr = bkt->ptr + bkt->head; - bkt->head += sz; - bkt->allocs++; - return ptr; + return PkeNew(sz, bkt); } -void *pke::PkeNew(std::size_t sz, pke::MemBucket *bkt) { - void *ptr = bkt->ptr + bkt->head; - bkt->head += sz; - bkt->allocs++; - return ptr; +void pke::PkeDelete(const void *ptr, std::size_t sz, pke::MemBucket *bkt) { + bkt->allocs--; + bkt->free += sz; + if (ptr == bkt->ptr + bkt->head - sz) bkt->head -= sz; + if (bkt->allocs == 0) { + bkt->head = 0; + bkt->free = 0; + } } -void pke::PkeDelete(void *ptr) { +void pke::PkeDelete(const void *ptr, std::size_t sz) { pke::MemBucket *bkt = nullptr; for (long i = 0; i < bucketHead; ++i) { bkt = &buckets[i]; @@ -54,19 +61,7 @@ void pke::PkeDelete(void *ptr) { std::printf("bad pointer %llu", reinterpret_cast<unsigned long long>(ptr)); throw "bad pointer"; } - bkt->allocs--; - if (bkt->allocs == 0) { - bkt->head = 0; - bkt->free = 0; - } -} - -void pke::PkeDelete(void *ptr, pke::MemBucket *bkt) { - bkt->allocs--; - if (bkt->allocs == 0) { - bkt->head = 0; - bkt->free = 0; - } + PkeDelete(ptr, sz, bkt); } pke::MemBucket *pke::BeginTransientBucket(int64_t sz) { diff --git a/src/memory.hpp b/src/memory.hpp index 43ada0f..fe93cc7 100644 --- a/src/memory.hpp +++ b/src/memory.hpp @@ -14,19 +14,27 @@ struct MemBucket; void *PkeNew(std::size_t sz); void *PkeNew(std::size_t sz, MemBucket *bkt); -void PkeDelete(void *ptr); -void PkeDelete(void *ptr, MemBucket *bkt); +void PkeDelete(const void *ptr, std::size_t sz); +void PkeDelete(const void *ptr, std::size_t sz, MemBucket *bkt); MemBucket *BeginTransientBucket(int64_t sz = DEFAULT_BUCKET_SIZE); // 256MB void EndTransientBucket(MemBucket *bkt); template <typename T> -T *PkeNew() { +inline T *PkeNew() { return reinterpret_cast<T *>(PkeNew(sizeof(T))); } template <typename T> -T *PkeNew(std::size_t sz) { - return reinterpret_cast<T *>(PkeNew(sz)); +inline T *PkeNew(long count) { + return reinterpret_cast<T *>(PkeNew(sizeof(T) * count)); +} +template <typename T> +inline void PkeDelete(const void *ptr) { + return PkeDelete(ptr, sizeof(T)); +} +template <typename T> +inline void PkeDelete(const void *ptr, long count) { + return PkeDelete(ptr, sizeof(T) * count); } } /* pke */ diff --git a/src/window.cpp b/src/window.cpp index ef65c5d..0c4d316 100644 --- a/src/window.cpp +++ b/src/window.cpp @@ -346,7 +346,7 @@ void CreateSwapchain() { break; } - pke::PkeDelete(surfaceFormats); + pke::PkeDelete<VkSurfaceFormatKHR>(surfaceFormats, surfaceFormatCounts); } int width, height; @@ -375,7 +375,7 @@ void CreateSwapchain() { } selectedPresentIndex = mailboxIndex != -1ul ? mailboxIndex : fifoRelaxedIndex; vkPresentModeKHR = presentModes[selectedPresentIndex]; - pke::PkeDelete(presentModes); + pke::PkeDelete<VkPresentModeKHR>(presentModes, presentModeCount); } VkSwapchainCreateInfoKHR vkSwapchainCreateInfo{}; @@ -441,8 +441,8 @@ void DestroySwapchain() { for (long i = 0; i < swapchainLength; ++i) { vkDestroyImageView(vkDevice, swapchainImageViews[i], vkAllocator); } - pke::PkeDelete(swapchainImageViews); - pke::PkeDelete(swapchainImages); + pke::PkeDelete<VkImageView>(swapchainImageViews, swapchainLength); + pke::PkeDelete<VkImage>(swapchainImages, swapchainLength); } vkDestroySwapchainKHR(vkDevice, vkSwapchainKHR, vkAllocator); swapchainImages = reinterpret_cast<VkImage *>(0xCAFEBABE); |
