fix entities arena not growing
This commit is contained in:
parent
6cdcb60784
commit
76c609f8d5
13
src/arena.c
13
src/arena.c
@ -50,7 +50,6 @@ void arena_release(struct arena *arena)
|
|||||||
/* NOTE: Application will exit if arena fails to commit memory */
|
/* NOTE: Application will exit if arena fails to commit memory */
|
||||||
void *_arena_push_bytes(struct arena *arena, u64 size, u64 align)
|
void *_arena_push_bytes(struct arena *arena, u64 size, u64 align)
|
||||||
{
|
{
|
||||||
__prof;
|
|
||||||
ASSERT(align > 0);
|
ASSERT(align > 0);
|
||||||
|
|
||||||
void *start = NULL;
|
void *start = NULL;
|
||||||
@ -62,6 +61,7 @@ void *_arena_push_bytes(struct arena *arena, u64 size, u64 align)
|
|||||||
|
|
||||||
u64 new_pos = aligned_start_pos + size;
|
u64 new_pos = aligned_start_pos + size;
|
||||||
if (new_pos > arena->committed) {
|
if (new_pos > arena->committed) {
|
||||||
|
__profscope(_arena_push_bytes_COMMIT);
|
||||||
/* Commit new block(s) */
|
/* Commit new block(s) */
|
||||||
u64 blocks_needed = (new_pos - arena->committed + ARENA_BLOCK_SIZE - 1) / ARENA_BLOCK_SIZE;
|
u64 blocks_needed = (new_pos - arena->committed + ARENA_BLOCK_SIZE - 1) / ARENA_BLOCK_SIZE;
|
||||||
u64 commit_bytes = blocks_needed * ARENA_BLOCK_SIZE;
|
u64 commit_bytes = blocks_needed * ARENA_BLOCK_SIZE;
|
||||||
@ -95,17 +95,14 @@ void *_arena_push_bytes(struct arena *arena, u64 size, u64 align)
|
|||||||
void arena_copy_replace(struct arena *dest, struct arena *src)
|
void arena_copy_replace(struct arena *dest, struct arena *src)
|
||||||
{
|
{
|
||||||
arena_reset(dest);
|
arena_reset(dest);
|
||||||
if (dest->committed < src->committed) {
|
u64 data_size = src->pos;
|
||||||
u64 diff = src->committed - dest->committed;
|
u8 *data_src = src->base;
|
||||||
_arena_push_bytes(dest, diff, 1);
|
u8 *data_dest = _arena_push_bytes(dest, data_size, 1);
|
||||||
}
|
MEMCPY(data_dest, data_src, data_size);
|
||||||
MEMCPY(dest->base, src->base, src->committed);
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void arena_decommit_unused_blocks(struct arena *arena)
|
void arena_decommit_unused_blocks(struct arena *arena)
|
||||||
{
|
{
|
||||||
__prof;
|
|
||||||
u64 next_block_pos = ARENA_BLOCK_SIZE * ((arena->pos + (ARENA_BLOCK_SIZE - 1)) / ARENA_BLOCK_SIZE);
|
u64 next_block_pos = ARENA_BLOCK_SIZE * ((arena->pos + (ARENA_BLOCK_SIZE - 1)) / ARENA_BLOCK_SIZE);
|
||||||
if (arena->committed > next_block_pos) {
|
if (arena->committed > next_block_pos) {
|
||||||
u8 *decommit_start = arena->base + next_block_pos;
|
u8 *decommit_start = arena->base + next_block_pos;
|
||||||
|
|||||||
@ -34,18 +34,13 @@ void arena_decommit_unused_blocks(struct arena *arena);
|
|||||||
|
|
||||||
INLINE void *_arena_push_bytes_zero(struct arena *arena, u64 size, u64 align)
|
INLINE void *_arena_push_bytes_zero(struct arena *arena, u64 size, u64 align)
|
||||||
{
|
{
|
||||||
__prof;
|
|
||||||
void *p = _arena_push_bytes(arena, size, align);
|
void *p = _arena_push_bytes(arena, size, align);
|
||||||
{
|
|
||||||
__profscope(_arena_push_bytes_zero_MEMZERO);
|
|
||||||
MEMZERO(p, size);
|
MEMZERO(p, size);
|
||||||
}
|
|
||||||
return p;
|
return p;
|
||||||
}
|
}
|
||||||
|
|
||||||
INLINE void arena_pop_to(struct arena *arena, u64 pos)
|
INLINE void arena_pop_to(struct arena *arena, u64 pos)
|
||||||
{
|
{
|
||||||
__prof;
|
|
||||||
ASSERT(arena->pos >= pos);
|
ASSERT(arena->pos >= pos);
|
||||||
ASAN_POISON(arena->base + pos, arena->pos - pos);
|
ASAN_POISON(arena->base + pos, arena->pos - pos);
|
||||||
arena->pos = pos;
|
arena->pos = pos;
|
||||||
@ -53,7 +48,6 @@ INLINE void arena_pop_to(struct arena *arena, u64 pos)
|
|||||||
|
|
||||||
INLINE struct temp_arena arena_push_temp(struct arena *arena)
|
INLINE struct temp_arena arena_push_temp(struct arena *arena)
|
||||||
{
|
{
|
||||||
__prof;
|
|
||||||
struct temp_arena t;
|
struct temp_arena t;
|
||||||
t.arena = arena;
|
t.arena = arena;
|
||||||
t.start_pos = arena->pos;
|
t.start_pos = arena->pos;
|
||||||
|
|||||||
@ -109,8 +109,6 @@ u64 asset_cache_hash(struct string key)
|
|||||||
* */
|
* */
|
||||||
struct asset *asset_cache_touch(struct string key, u64 hash, b32 *is_first_touch)
|
struct asset *asset_cache_touch(struct string key, u64 hash, b32 *is_first_touch)
|
||||||
{
|
{
|
||||||
__prof;
|
|
||||||
|
|
||||||
struct asset *asset = NULL;
|
struct asset *asset = NULL;
|
||||||
if (is_first_touch) {
|
if (is_first_touch) {
|
||||||
*is_first_touch = false;
|
*is_first_touch = false;
|
||||||
@ -196,7 +194,6 @@ void asset_cache_set_work(struct asset *asset, struct work_handle *handle)
|
|||||||
|
|
||||||
void asset_cache_wait(struct asset *asset)
|
void asset_cache_wait(struct asset *asset)
|
||||||
{
|
{
|
||||||
__prof;
|
|
||||||
if (asset->status != ASSET_STATUS_READY) {
|
if (asset->status != ASSET_STATUS_READY) {
|
||||||
/* Wait for work to be set */
|
/* Wait for work to be set */
|
||||||
sync_flag_wait(&asset->work_ready_sf);
|
sync_flag_wait(&asset->work_ready_sf);
|
||||||
@ -228,7 +225,6 @@ void *asset_cache_get_store_data(struct asset *asset)
|
|||||||
/* Asset store should be opened to allocate memory to the store arena */
|
/* Asset store should be opened to allocate memory to the store arena */
|
||||||
struct asset_cache_store asset_cache_store_open(void)
|
struct asset_cache_store asset_cache_store_open(void)
|
||||||
{
|
{
|
||||||
__prof;
|
|
||||||
struct asset_cache_store store = {
|
struct asset_cache_store store = {
|
||||||
.rw_mutex = &L.store_rw_mutex,
|
.rw_mutex = &L.store_rw_mutex,
|
||||||
.arena = &L.store_arena
|
.arena = &L.store_arena
|
||||||
@ -239,6 +235,5 @@ struct asset_cache_store asset_cache_store_open(void)
|
|||||||
|
|
||||||
void asset_cache_store_close(struct asset_cache_store *store)
|
void asset_cache_store_close(struct asset_cache_store *store)
|
||||||
{
|
{
|
||||||
__prof;
|
|
||||||
sys_rw_mutex_unlock_exclusive(store->rw_mutex);
|
sys_rw_mutex_unlock_exclusive(store->rw_mutex);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -208,7 +208,6 @@ struct font *font_load(struct string path, f32 point_size)
|
|||||||
|
|
||||||
struct font_glyph *font_get_glyph(struct font *font, u8 c)
|
struct font_glyph *font_get_glyph(struct font *font, u8 c)
|
||||||
{
|
{
|
||||||
__prof;
|
|
||||||
struct font_glyph *g;
|
struct font_glyph *g;
|
||||||
u16 index = font->lookup[c];
|
u16 index = font->lookup[c];
|
||||||
if (index < LOOKUP_TABLE_SIZE) {
|
if (index < LOOKUP_TABLE_SIZE) {
|
||||||
|
|||||||
15
src/game.c
15
src/game.c
@ -68,6 +68,7 @@ INTERNAL struct game_cmd_array pop_cmds(struct arena *arena)
|
|||||||
INTERNAL void publish_game_tick(void)
|
INTERNAL void publish_game_tick(void)
|
||||||
{
|
{
|
||||||
__prof;
|
__prof;
|
||||||
|
|
||||||
sys_mutex_lock(&L.published_tick_mutex);
|
sys_mutex_lock(&L.published_tick_mutex);
|
||||||
L.world.tick_published_ts = sys_timestamp();
|
L.world.tick_published_ts = sys_timestamp();
|
||||||
world_copy_replace(&L.published_tick, &L.world);
|
world_copy_replace(&L.published_tick, &L.world);
|
||||||
@ -213,8 +214,8 @@ INTERNAL void game_update(void)
|
|||||||
L.world.player_move_dir = V2(0, 0);
|
L.world.player_move_dir = V2(0, 0);
|
||||||
|
|
||||||
struct game_cmd_array game_cmds = pop_cmds(scratch.arena);
|
struct game_cmd_array game_cmds = pop_cmds(scratch.arena);
|
||||||
for (u64 i = 0; i < game_cmds.count; ++i) {
|
for (u64 cmd_index = 0; cmd_index < game_cmds.count; ++cmd_index) {
|
||||||
struct game_cmd cmd = game_cmds.cmds[i];
|
struct game_cmd cmd = game_cmds.cmds[cmd_index];
|
||||||
|
|
||||||
switch (cmd.kind) {
|
switch (cmd.kind) {
|
||||||
/* Movement */
|
/* Movement */
|
||||||
@ -229,6 +230,16 @@ INTERNAL void game_update(void)
|
|||||||
L.world.player_focus = cmd.pos;
|
L.world.player_focus = cmd.pos;
|
||||||
} break;
|
} break;
|
||||||
|
|
||||||
|
/* Clear level */
|
||||||
|
case GAME_CMD_KIND_CLEAR_ALL: {
|
||||||
|
for (u64 i = 0; i < L.world.entities_count; ++i) {
|
||||||
|
struct entity *ent = &L.world.entities[i];
|
||||||
|
if (ent->valid) {
|
||||||
|
world_release_entity(&L.world, ent);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} break;
|
||||||
|
|
||||||
default: break;
|
default: break;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
@ -7,9 +7,11 @@ enum game_cmd_kind {
|
|||||||
GAME_CMD_KIND_NONE,
|
GAME_CMD_KIND_NONE,
|
||||||
|
|
||||||
GAME_CMD_KIND_PLAYER_MOVE,
|
GAME_CMD_KIND_PLAYER_MOVE,
|
||||||
|
|
||||||
GAME_CMD_KIND_PLAYER_FOCUS,
|
GAME_CMD_KIND_PLAYER_FOCUS,
|
||||||
|
|
||||||
|
/* Testing */
|
||||||
|
GAME_CMD_KIND_CLEAR_ALL,
|
||||||
|
|
||||||
GAME_CMD_KIND_COUNT
|
GAME_CMD_KIND_COUNT
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@ -5,7 +5,6 @@
|
|||||||
__attribute((section(".text.memcpy")))
|
__attribute((section(".text.memcpy")))
|
||||||
void *memcpy(void *restrict dest, const void *restrict src, u64 n)
|
void *memcpy(void *restrict dest, const void *restrict src, u64 n)
|
||||||
{
|
{
|
||||||
__prof;
|
|
||||||
/* TODO: Faster memcpy */
|
/* TODO: Faster memcpy */
|
||||||
for (u64 i = 0; i < n; ++i) {
|
for (u64 i = 0; i < n; ++i) {
|
||||||
((u8 *)dest)[i] = ((u8 *)src)[i];
|
((u8 *)dest)[i] = ((u8 *)src)[i];
|
||||||
@ -16,7 +15,6 @@ void *memcpy(void *restrict dest, const void *restrict src, u64 n)
|
|||||||
__attribute((section(".text.memset")))
|
__attribute((section(".text.memset")))
|
||||||
void *memset(void *dest, int c, u64 n)
|
void *memset(void *dest, int c, u64 n)
|
||||||
{
|
{
|
||||||
__prof;
|
|
||||||
/* TODO: Faster memset */
|
/* TODO: Faster memset */
|
||||||
for (u64 i = 0; i < (n); ++i) {
|
for (u64 i = 0; i < (n); ++i) {
|
||||||
((u8 *)dest)[i] = c;
|
((u8 *)dest)[i] = c;
|
||||||
|
|||||||
@ -659,8 +659,6 @@ void renderer_canvas_set_view(struct renderer_canvas *canvas, struct xform view)
|
|||||||
|
|
||||||
u32 renderer_canvas_push_vertices(struct renderer_canvas *canvas, u8 **vertices_out, vidx **indices_out, u32 vertices_count, u32 indices_count)
|
u32 renderer_canvas_push_vertices(struct renderer_canvas *canvas, u8 **vertices_out, vidx **indices_out, u32 vertices_count, u32 indices_count)
|
||||||
{
|
{
|
||||||
__prof;
|
|
||||||
|
|
||||||
struct renderer_cmd *cmd = canvas->cpu_cmd_store.cmd_last;
|
struct renderer_cmd *cmd = canvas->cpu_cmd_store.cmd_last;
|
||||||
|
|
||||||
if (!cmd) {
|
if (!cmd) {
|
||||||
@ -692,8 +690,6 @@ u32 renderer_canvas_push_vertices(struct renderer_canvas *canvas, u8 **vertices_
|
|||||||
|
|
||||||
void renderer_canvas_ensure_texture_cmd(struct renderer_canvas *canvas, struct texture_shader_parameters params)
|
void renderer_canvas_ensure_texture_cmd(struct renderer_canvas *canvas, struct texture_shader_parameters params)
|
||||||
{
|
{
|
||||||
__prof;
|
|
||||||
|
|
||||||
struct renderer_cmd *last_cmd = canvas->cpu_cmd_store.cmd_last;
|
struct renderer_cmd *last_cmd = canvas->cpu_cmd_store.cmd_last;
|
||||||
if (!last_cmd || last_cmd->shader->kind != SHADER_TEXTURE || !handle_eq(last_cmd->texture, params.texture)) {
|
if (!last_cmd || last_cmd->shader->kind != SHADER_TEXTURE || !handle_eq(last_cmd->texture, params.texture)) {
|
||||||
/* Command parameters are not the same, insert new command */
|
/* Command parameters are not the same, insert new command */
|
||||||
|
|||||||
25
src/user.c
25
src/user.c
@ -31,7 +31,7 @@ struct view {
|
|||||||
};
|
};
|
||||||
|
|
||||||
struct bind_state {
|
struct bind_state {
|
||||||
b32 pressed; /* Is this bind held down this frame */
|
b32 is_held; /* Is this bind held down this frame */
|
||||||
u32 num_presses; /* How many times was this bind pressed since last frame */
|
u32 num_presses; /* How many times was this bind pressed since last frame */
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -82,6 +82,7 @@ GLOBAL READONLY enum user_bind_kind g_binds[SYS_BTN_COUNT] = {
|
|||||||
|
|
||||||
/* Testing */
|
/* Testing */
|
||||||
|
|
||||||
|
[SYS_BTN_C] = USER_BIND_KIND_DEBUG_CLEAR,
|
||||||
[SYS_BTN_F6] = USER_BIND_KIND_DEBUG_DRAW,
|
[SYS_BTN_F6] = USER_BIND_KIND_DEBUG_DRAW,
|
||||||
[SYS_BTN_F7] = USER_BIND_KIND_DEBUG_CAMERA,
|
[SYS_BTN_F7] = USER_BIND_KIND_DEBUG_CAMERA,
|
||||||
[SYS_BTN_MWHEELUP] = USER_BIND_KIND_ZOOM_IN,
|
[SYS_BTN_MWHEELUP] = USER_BIND_KIND_ZOOM_IN,
|
||||||
@ -319,7 +320,7 @@ INTERNAL void user_update(void)
|
|||||||
/* Reset bind states "was_pressed" */
|
/* Reset bind states "was_pressed" */
|
||||||
for (u32 i = 0; i < ARRAY_COUNT(L.bind_states); ++i) {
|
for (u32 i = 0; i < ARRAY_COUNT(L.bind_states); ++i) {
|
||||||
L.bind_states[i] = (struct bind_state) {
|
L.bind_states[i] = (struct bind_state) {
|
||||||
.pressed = L.bind_states[i].pressed
|
.is_held = L.bind_states[i].is_held
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -374,7 +375,7 @@ INTERNAL void user_update(void)
|
|||||||
enum user_bind_kind bind = g_binds[button];
|
enum user_bind_kind bind = g_binds[button];
|
||||||
if (bind) {
|
if (bind) {
|
||||||
b32 pressed = event->kind == SYS_EVENT_KIND_BUTTON_DOWN;
|
b32 pressed = event->kind == SYS_EVENT_KIND_BUTTON_DOWN;
|
||||||
L.bind_states[bind].pressed = pressed;
|
L.bind_states[bind].is_held = pressed;
|
||||||
if (pressed) {
|
if (pressed) {
|
||||||
++L.bind_states[bind].num_presses;
|
++L.bind_states[bind].num_presses;
|
||||||
}
|
}
|
||||||
@ -392,7 +393,7 @@ INTERNAL void user_update(void)
|
|||||||
for (enum user_bind_kind bind = 0; bind < (i32)ARRAY_COUNT(L.bind_states); ++bind) {
|
for (enum user_bind_kind bind = 0; bind < (i32)ARRAY_COUNT(L.bind_states); ++bind) {
|
||||||
struct bind_state state = L.bind_states[bind];
|
struct bind_state state = L.bind_states[bind];
|
||||||
|
|
||||||
if (!state.pressed && state.num_presses <= 0) {
|
if (!state.is_held && state.num_presses <= 0) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -423,6 +424,20 @@ INTERNAL void user_update(void)
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* ========================== *
|
||||||
|
* Debug commands
|
||||||
|
* ========================== */
|
||||||
|
|
||||||
|
/* Test clear world */
|
||||||
|
{
|
||||||
|
struct bind_state state = L.bind_states[USER_BIND_KIND_DEBUG_CLEAR];
|
||||||
|
if (state.num_presses || state.is_held) {
|
||||||
|
queue_game_cmd(&cmd_list, (struct game_cmd) {
|
||||||
|
.kind = GAME_CMD_KIND_CLEAR_ALL
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* ========================== *
|
/* ========================== *
|
||||||
* Update view from debug camera
|
* Update view from debug camera
|
||||||
* ========================== */
|
* ========================== */
|
||||||
@ -589,6 +604,8 @@ INTERNAL void user_update(void)
|
|||||||
|
|
||||||
/* Iterate entities */
|
/* Iterate entities */
|
||||||
for (u64 entity_index = 0; entity_index < L.world.entities_count; ++entity_index) {
|
for (u64 entity_index = 0; entity_index < L.world.entities_count; ++entity_index) {
|
||||||
|
__profscope(user_entity_iter);
|
||||||
|
|
||||||
struct entity *ent = &L.world.entities[entity_index];
|
struct entity *ent = &L.world.entities[entity_index];
|
||||||
if (!ent->valid) continue;
|
if (!ent->valid) continue;
|
||||||
|
|
||||||
|
|||||||
@ -13,6 +13,7 @@ enum user_bind_kind {
|
|||||||
|
|
||||||
/* Testing */
|
/* Testing */
|
||||||
|
|
||||||
|
USER_BIND_KIND_DEBUG_CLEAR,
|
||||||
USER_BIND_KIND_DEBUG_DRAW,
|
USER_BIND_KIND_DEBUG_DRAW,
|
||||||
USER_BIND_KIND_DEBUG_CAMERA,
|
USER_BIND_KIND_DEBUG_CAMERA,
|
||||||
USER_BIND_KIND_ZOOM_IN,
|
USER_BIND_KIND_ZOOM_IN,
|
||||||
|
|||||||
@ -40,7 +40,7 @@ struct entity *world_alloc_entity(struct world *world)
|
|||||||
} else {
|
} else {
|
||||||
/* Make new */
|
/* Make new */
|
||||||
u64 idx = world->entities_count++;
|
u64 idx = world->entities_count++;
|
||||||
entity = &world->entities[idx];
|
entity = arena_push(&world->entities_arena, struct entity);
|
||||||
*entity = (struct entity) {
|
*entity = (struct entity) {
|
||||||
.handle = { .gen = 1, .idx = idx }
|
.handle = { .gen = 1, .idx = idx }
|
||||||
};
|
};
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user