A 3D game engine from scratch.
1// (c) 2020 Vlad-Stefan Harbuz <vlad@vladh.net>
2
3#include "logs.hpp"
4#include "util.hpp"
5#include "constants.hpp"
6#include "memory.hpp"
7#include "intrinsics.hpp"
8
9
10void *
11memory::push(
12 Pool *pool,
13 size_t item_size,
14 const char *item_debug_name
15) {
16 // If we had just init'd an empty pool, let's just give it some size.
17 if (pool->size == 0) {
18 pool->size = util::mb_to_b(256);
19 }
20
21 // If we haven't allocated anything in the pool, let's allocate something now.
22 if (pool->memory == nullptr) {
23 if (SETTINGS.memory_debug_logs_on) {
24 logs::info("Allocating memory pool: %.2fMB (%dB)",
25 util::b_to_mb((f64)pool->size), pool->size);
26 }
27
28 pool->memory = (u8*)calloc(1, pool->size);
29 if (!pool->memory) {
30 logs::fatal("Could not allocate memory. Buy more RAM!");
31 assert(false); // A little hint for the compiler
32 }
33
34 assert(pool->memory);
35 }
36 assert(pool->used + item_size <= pool->size);
37
38#if USE_MEMORYPOOL_ITEM_DEBUG
39 assert(pool->n_items < MAX_N_MEMORYPOOL_ITEMS);
40 pool->item_debug_names[pool->n_items] = item_debug_name;
41 pool->item_debug_sizes[pool->n_items] = item_size;
42#endif
43
44 void *new_memory = pool->memory + pool->used;
45 pool->used += item_size;
46 pool->n_items++;
47
48 if (SETTINGS.memory_debug_logs_on) {
49 logs::info("Pusing to memory pool: %.2fMB (%dB) for %s, now at %.2fMB (%dB)",
50 util::b_to_mb((f64)item_size),
51 item_size, item_debug_name,
52 util::b_to_mb((f64)pool->used),
53 pool->used);
54 }
55
56 return new_memory;
57}
58
59
60void
61memory::print_memory_pool(Pool *pool)
62{
63 logs::info("memory::Pool:");
64 logs::info(" Used: %.2fMB (%dB)", util::b_to_mb((u32)pool->used), pool->used);
65 logs::info(" Size: %.2fMB (%dB)", util::b_to_mb((u32)pool->size), pool->size);
66 logs::info(" Items:");
67 if (pool->n_items == 0) {
68 logs::info(" (none)");
69 }
70 #if USE_MEMORYPOOL_ITEM_DEBUG
71 for (u32 idx = 0; idx < pool->n_items; idx++) {
72 logs::info(" %02d. %s, %.2fMB (%dB)",
73 idx,
74 pool->item_debug_names[idx],
75 util::b_to_mb((f64)pool->item_debug_sizes[idx]),
76 pool->item_debug_sizes[idx]);
77 }
78 #endif
79}
80
81
82void
83memory::destroy_memory_pool(Pool *memory_pool)
84{
85 if (SETTINGS.memory_debug_logs_on) {
86 logs::info("destroy_memory_pool");
87 }
88 reset_memory_pool(memory_pool);
89 free(memory_pool->memory);
90}
91
92
93void
94memory::reset_memory_pool(Pool *pool)
95{
96 if (SETTINGS.memory_debug_logs_on) {
97 logs::info("Resetting memory pool");
98 }
99 pool->used = 0;
100 pool->n_items = 0;
101}
102
103
104void
105memory::zero_out_memory_pool(Pool *pool)
106{
107 memset(pool->memory, 0, pool->size);
108 pool->used = 0;
109 pool->n_items = 0;
110}