summaryrefslogtreecommitdiffstats
path: root/src/lrhi.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lrhi.c')
-rw-r--r--src/lrhi.c55
1 files changed, 55 insertions, 0 deletions
diff --git a/src/lrhi.c b/src/lrhi.c
new file mode 100644
index 0000000..38eed3a
--- /dev/null
+++ b/src/lrhi.c
@@ -0,0 +1,55 @@
+#include "lrhi.h"
+
+void *lrhi_allocator_allocate(struct lrhi_allocator *allocator,
+ ptrdiff_t size) {
+ return allocator->allocate(size, allocator->ctx);
+}
+void lrhi_allocator_free(struct lrhi_allocator *allocator, ptrdiff_t size,
+ void *ptr) {
+ allocator->free(ptr, size, allocator->ctx);
+}
+
+struct lrhi_arena {
+ unsigned char *data;
+ int allocated;
+ int capacity;
+};
+
+lrhi_arena *lrhi_arena_create(struct lrhi_allocator *allocator,
+ ptrdiff_t arena_size) {
+ lrhi_arena *arena = lrhi_allocator_allocate(allocator, sizeof(lrhi_arena));
+ arena->data = lrhi_allocator_allocate(allocator, arena_size);
+ arena->allocated = 0;
+ arena->capacity = arena_size;
+ return arena;
+}
+void lrhi_arena_destroy(struct lrhi_allocator *allocator, lrhi_arena *arena) {
+ lrhi_allocator_free(allocator, arena->capacity, arena->data);
+ lrhi_allocator_free(allocator, sizeof(lrhi_arena), arena);
+}
+void *lrhi_arena_allocate(lrhi_arena *arena, ptrdiff_t size) {
+ if (arena->allocated + size > arena->capacity) {
+ LRHI_PANIC("Arena is full, allocation failed");
+ }
+
+ unsigned char *ptr = arena->data + arena->allocated;
+ arena->allocated += size;
+ return ptr;
+}
+void lrhi_arena_reset(lrhi_arena *arena) { arena->allocated = 0; }
+
+static void *arena_allocator_allocate(ptrdiff_t size, void *ctx) {
+ return lrhi_arena_allocate((lrhi_arena *)ctx, size);
+}
+
+static void arena_allocator_free(void *ptr, ptrdiff_t size, void *ctx) {
+ (void)ptr;
+ (void)size;
+ (void)ctx;
+}
+
+struct lrhi_allocator lrhi_arena_allocator(lrhi_arena *arena) {
+ return (struct lrhi_allocator){.allocate = arena_allocator_allocate,
+ .free = arena_allocator_free,
+ .ctx = arena};
+}
Go back to lisible.xyz