diff options
| author | Clément Sibille <clements@lisible.xyz> | 2025-12-08 12:45:47 +0100 |
|---|---|---|
| committer | Clément Sibille <clements@lisible.xyz> | 2025-12-08 12:45:47 +0100 |
| commit | 67e722c16237f935c4c7adffeb8af523efa78ccf (patch) | |
| tree | ad1d13da93abad3fc3452e7aa5d44d677b2c00c6 /src/lrhi.c | |
Diffstat (limited to 'src/lrhi.c')
| -rw-r--r-- | src/lrhi.c | 55 |
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}; +} |
