summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJonathan Bradley <jcb@pikum.xyz>2023-08-08 21:30:19 -0400
committerJonathan Bradley <jcb@pikum.xyz>2023-08-08 21:30:19 -0400
commit1d3bfd616e1b00c0510d9ac00e6e9ee6b6daab83 (patch)
tree7e43796de56f19fb3d1e4eac944f403bc1bb8560 /src
parent9383af84ee02b755750bae9ce09f0de3d0d1f7c9 (diff)
memory cleanup and require size for deleting the pointer
Diffstat (limited to 'src')
-rw-r--r--src/memory.cpp41
-rw-r--r--src/memory.hpp18
-rw-r--r--src/window.cpp8
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);