diff options
-rw-r--r-- | CMakeLists.txt | 16 | ||||
-rw-r--r-- | Makefile | 76 | ||||
-rw-r--r-- | core/abort.c | 24 | ||||
-rw-r--r-- | core/alloc.c | 105 | ||||
-rw-r--r-- | include/rune/core/abort.h | 29 | ||||
-rw-r--r-- | include/rune/core/alloc.h | 41 | ||||
-rw-r--r-- | include/rune/core/logging.h (renamed from include/rune/logging.h) | 6 | ||||
-rw-r--r-- | include/rune/util/list.h (renamed from include/rune/list.h) | 10 | ||||
-rw-r--r-- | include/rune/util/types.h (renamed from include/rune/types.h) | 6 | ||||
-rw-r--r-- | include/rune/util/util.h (renamed from include/rune/util.h) | 4 | ||||
-rw-r--r-- | network/make.config | 7 |
11 files changed, 228 insertions, 96 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..551cf1f --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,16 @@ +cmake_minimum_required(VERSION 3.20) + +set(CMAKE_C_STANDARD 23) +set(CMAKE_C_STANDARD_REQUIRED ON) +set(CMAKE_C_EXTENSIONS ON) + +project(rune-engine VERSION 0.60.0 DESCRIPTION "High performance game engine designed for Quake-style shooters") + +list(APPEND SOURCE_FILES core/abort.c core/alloc.c core/callbacks.c core/init.c core/logging.c core/network.c) + +add_compile_definitions(VERSION="${PROJECT_VERSION}") + +add_library(${PROJECT_NAME} SHARED ${SOURCE_FILES}) +set_target_properties(${PROJECT_NAME} PROPERTIES VERSION ${PROJECT_VERSION}) +set_target_properties(${PROJECT_NAME} PROPERTIES SOVERSION ${PROJECT_VERSION_MAJOR}) +target_include_directories(${PROJECT_NAME} PRIVATE include) diff --git a/Makefile b/Makefile deleted file mode 100644 index b8f8a08..0000000 --- a/Makefile +++ /dev/null @@ -1,76 +0,0 @@ -CC?=gcc -LD?=ld -INCLUDE?=-Iinclude -CFLAGS?=-O0 -LDFLAGS?= -LIBS?= -PREFIX?=/usr/local/ - -HEADLESS?=0 -RENDER_API?=vulkan -NETWORK?=1 - -# -- Do not edit below this line -- - -MAJOR:=0 -MINOR:=55 -REV:= -VERSION:="$(MAJOR).$(MINOR)$(REV)" - -LIBRARY:=librune.so.$(MAJOR).$(MINOR) -SONAME:=librune.so.$(MAJOR) -SYMFILE:=librune.sym - -LIBDIR:=$(DESTDIR)$(PREFIX)lib/ -BINDIR:=$(DESTDIR)$(PREFIX)bin/ -INCLUDEDIR:=$(DESTDIR)$(PREFIX)include/rune/ - -CC:=$(CC) -INCLUDE:=$(INCLUDE) -CFLAGS:=$(CFLAGS) $(INCLUDE) -Wall -Wextra -DVERSION=\"$(VERSION)\" -ggdb -fstack-protector-all -fPIC -LDFLAGS:=$(LDFLAGS) -shared - -.PHONY: all check clean install -.SUFFIXES: .o .c - -OBJS:=core/callbacks.o \ - core/init.o \ - core/logging.o \ - --include graphics/make.config --include sound/make.config --include network/make.config - -all: $(LIBRARY) - -$(LIBRARY): $(OBJS) - @$(LD) -soname $(SONAME) -o $@ $(LIBS) $(LDFLAGS) $? - @echo [LD] $@ - @objcopy --only-keep-debug $(LIBRARY) $(SYMFILE) - @objcopy --add-gnu-debuglink=$(SYMFILE) $(LIBRARY) - @strip -s $(LIBRARY) - @echo [strip] $(LIBRARY) - -.c.o: - @$(CC) -MD -c $< -o $@ $(CFLAGS) $(INCLUDE) - @echo [CC] $@ - -check: - -clean: - $(RM) $(OBJS) $(OBJS:.o=.d) $(LIBRARY) $(SYMFILE) tags TAGS - -install: - install -d $(LIBDIR) - install -d $(BINDIR) - install -d $(INCLUDEDIR) - install -d $(INCLUDEDIR)$(RENDER_API) - install -p -m 644 include/rune/*.h $(INCLUDEDIR) - install -p -m 644 include/rune/$(RENDER_API)/*.h $(INCLUDEDIR)$(RENDER_API) - install -p -m 755 $(LIBRARY) $(LIBDIR) - ln -s $(LIBDIR)$(LIBRARY) $(LIBDIR)$(SONAME) - -tags: - ctags -R --kinds-c=+pLl --fields=+S include/ core/ render-vulkan/ - --include $(OBJS:.o=.d) diff --git a/core/abort.c b/core/abort.c new file mode 100644 index 0000000..3b8e536 --- /dev/null +++ b/core/abort.c @@ -0,0 +1,24 @@ +#include <rune/core/abort.h> +#include <rune/core/init.h> +#include <rune/core/logging.h> +#include <execinfo.h> +#include <stdlib.h> + +#define MAX_TRACE_ITEMS 30 + +void _stack_trace(void) { + void* buffer[MAX_TRACE_ITEMS]; + int num_links = backtrace(buffer, MAX_TRACE_ITEMS); + char** symbuf = backtrace_symbols(buffer, num_links); + + for (int i = 0; i < num_links; i++) + log_output(LOG_INFO, "#%d: %s", i, symbuf[i]); + + free(symbuf); +} + +void rune_abort(void) { + log_output(LOG_INFO, "Abort called, printing stack trace"); + _stack_trace(); + rune_exit(); +} diff --git a/core/alloc.c b/core/alloc.c new file mode 100644 index 0000000..88ebb8f --- /dev/null +++ b/core/alloc.c @@ -0,0 +1,105 @@ +#include <rune/core/alloc.h> +#include <rune/core/logging.h> +#include <stdlib.h> + +// TODO: implement block coalescing so we can reuse freed blocks + +#define DEADBLOCK ((void*)0xDEADBEEF) + +static struct mem_block first_block; + +static struct mem_block* _find_free_block(size_t sz) { + struct list_head *temp = &first_block.list; + struct mem_block *block; + while (temp != NULL) { + block = (struct mem_block*)((void*)temp - offsetof(struct mem_block, list)); + if (block->sz == sz && block->free == 1) + return block; + temp = temp->next; + } + return NULL; +} + +static struct mem_block* _find_block(void *ptr) { + struct list_head *temp = &first_block.list; + struct mem_block *block; + while (temp != NULL) { + block = (struct mem_block*)((void*)temp - offsetof(struct mem_block, list)); + if (block->ptr == ptr) + return block; + temp = temp->next; + } + return NULL; +} + +void* rune_alloc(size_t sz) { + if (sz == 0) + return NULL; + + if (first_block.ptr == NULL) { + first_block.ptr = DEADBLOCK; + first_block.sz = 0; + } + + struct mem_block *block = _find_free_block(sz); + if (block != NULL) { + block->free = 0; + return block->ptr; + } + + block = malloc(sizeof(struct mem_block)); + if (block == NULL) { + log_output(LOG_ERROR, "Cannot allocate block of size %d", sz); + return NULL; + } + block->ptr = malloc(sz); + block->sz = sz; + block->free = 0; + list_add(&block->list, &first_block.list); + log_output(LOG_DEBUG, "Alloc'd block of size %d", sz); + return block->ptr; +} + +void* rune_calloc(size_t nmemb, size_t sz) { + void *ret = rune_alloc(sz); + for (size_t *i = (size_t*)ret; i < (size_t*)ret+sz; i++) + *i = nmemb; + return ret; +} + +void* rune_realloc(void *ptr, size_t sz) { + if (ptr == NULL || sz == 0) + return NULL; + + struct mem_block *block = _find_block(ptr); + if (block == NULL) + return rune_alloc(sz); + return block->ptr; +} + +void rune_free(void *ptr) { + if (ptr == NULL) + return; + + struct mem_block *block = _find_block(ptr); + if (block->free == 1) + return; + block->free = 1; + log_output(LOG_DEBUG, "Freed block of size %d", block->sz); +} + +void rune_free_all(void) { + struct list_head *temp = &first_block.list; + struct mem_block *block; + while (temp != NULL) { + block = (struct mem_block*)((void*)temp - offsetof(struct mem_block, list)); + if (block->ptr == DEADBLOCK) { + temp = temp->next; + continue; + } + + if (block->ptr != NULL) + free(block->ptr); + temp = temp->next; + } +} diff --git a/include/rune/core/abort.h b/include/rune/core/abort.h new file mode 100644 index 0000000..60f368e --- /dev/null +++ b/include/rune/core/abort.h @@ -0,0 +1,29 @@ +/* + * Rune Game Engine + * Copyright 2024 Danny Holman <dholman@gymli.org> + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * 3. This notice may not be removed or altered from any source distribution. + */ + +#ifndef RUNE_ABORT_H +#define RUNE_ABORT_H + +#include <rune/util/types.h> + +RAPI void rune_abort(void); + +#endif diff --git a/include/rune/core/alloc.h b/include/rune/core/alloc.h new file mode 100644 index 0000000..35170d8 --- /dev/null +++ b/include/rune/core/alloc.h @@ -0,0 +1,41 @@ +/* + * Rune Game Engine + * Copyright 2024 Danny Holman <dholman@gymli.org> + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * 3. This notice may not be removed or altered from any source distribution. + */ + +#ifndef RUNE_ALLOC_H +#define RUNE_ALLOC_H + +#include <rune/util/types.h> +#include <rune/util/list.h> + +struct mem_block { + void *ptr; + size_t sz; + int free; + struct list_head list; +}; + +RAPI void* rune_alloc(size_t sz); +RAPI void* rune_calloc(size_t nmemb, size_t sz); +RAPI void* rune_realloc(void *ptr, size_t sz); +RAPI void rune_free(void *ptr); +RAPI void rune_free_all(void); + +#endif diff --git a/include/rune/logging.h b/include/rune/core/logging.h index 5b9aabf..6bb6470 100644 --- a/include/rune/logging.h +++ b/include/rune/core/logging.h @@ -19,10 +19,10 @@ * 3. This notice may not be removed or altered from any source distribution. */ -#ifndef RUNE_LOGGING_H -#define RUNE_LOGGING_H +#ifndef RUNE_CORE_LOGGING_H +#define RUNE_CORE_LOGGING_H -#include <rune/util.h> +#include <rune/util/types.h> enum log_level { LOG_FATAL, diff --git a/include/rune/list.h b/include/rune/util/list.h index 1107491..ed6db5e 100644 --- a/include/rune/list.h +++ b/include/rune/util/list.h @@ -19,17 +19,17 @@ * 3. This notice may not be removed or altered from any source distribution. */ -#ifndef RUNE_LIST_H -#define RUNE_LIST_H +#ifndef RUNE_UTIL_LIST_H +#define RUNE_UTIL_LIST_H #include <stddef.h> -struct list_head { +RAPI struct list_head { struct list_head *next; struct list_head *prev; }; -static inline void list_add(struct list_head *new, struct list_head *head) { +RAPI static inline void list_add(struct list_head *new, struct list_head *head) { struct list_head *temp = head; while (temp->next != NULL) temp = temp->next; @@ -39,7 +39,7 @@ static inline void list_add(struct list_head *new, struct list_head *head) { new->next = NULL; } -static inline void list_del(struct list_head *item) { +RAPI static inline void list_del(struct list_head *item) { struct list_head *next = item->next; struct list_head *prev = item->prev; if (next != NULL) diff --git a/include/rune/types.h b/include/rune/util/types.h index 03e3edb..ac92ecb 100644 --- a/include/rune/types.h +++ b/include/rune/util/types.h @@ -19,10 +19,10 @@ * 3. This notice may not be removed or altered from any source distribution. */ -#ifndef RUNE_TYPES_H -#define RUNE_TYPES_H +#ifndef RUNE_UTIL_TYPES_H +#define RUNE_UTIL_TYPES_H -#include <rune/util.h> +#include <rune/util/util.h> STATIC_ASSERT(sizeof(uint8_t) == 1, "Expected uint8_t to be 1 byte"); STATIC_ASSERT(sizeof(uint16_t) == 2, "Expected uint16_t to be 2 bytes"); diff --git a/include/rune/util.h b/include/rune/util/util.h index 04429c4..dcf45e4 100644 --- a/include/rune/util.h +++ b/include/rune/util/util.h @@ -19,8 +19,8 @@ * 3. This notice may not be removed or altered from any source distribution. */ -#ifndef RUNE_UTIL_H -#define RUNE_UTIL_H +#ifndef RUNE_UTIL_UTIL_H +#define RUNE_UTIL_UTIL_H #include <assert.h> #include <stdint.h> diff --git a/network/make.config b/network/make.config deleted file mode 100644 index 9abce28..0000000 --- a/network/make.config +++ /dev/null @@ -1,7 +0,0 @@ -ifeq ("$(NETWORK)", 1) - -LIBS += - -OBJS += - -endif |