summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CMakeLists.txt16
-rw-r--r--Makefile76
-rw-r--r--core/abort.c24
-rw-r--r--core/alloc.c105
-rw-r--r--include/rune/core/abort.h29
-rw-r--r--include/rune/core/alloc.h41
-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.config7
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