A 3D game engine from scratch.
at main 110 lines 2.8 kB view raw
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}