#pragma once #include "basalt_defines.h" typedef u16 MEMORY_TAG; typedef enum MEMORY_TAGS { MEMORY_TAG_BITWIDTH_CLASS = 5, MEMORY_TAG_BITWIDTH_ZONE = 4, MEMORY_TAG_BITWIDTH_ALIGN = 2, MEMORY_TAG_SHIFT_CLASS = 0, MEMORY_TAG_SHIFT_ZONE = MEMORY_TAG_SHIFT_CLASS + MEMORY_TAG_BITWIDTH_CLASS, MEMORY_TAG_SHIFT_ALIGN = MEMORY_TAG_SHIFT_ZONE + MEMORY_TAG_BITWIDTH_ZONE, MEMORY_TAG_MASK_CLASS = ((1 << MEMORY_TAG_BITWIDTH_CLASS) - 1) << MEMORY_TAG_SHIFT_CLASS, MEMORY_TAG_MASK_ZONE = ((1 << MEMORY_TAG_BITWIDTH_ZONE) - 1) << MEMORY_TAG_SHIFT_ZONE, MEMORY_TAG_MASK_ALIGN = ((1 << MEMORY_TAG_BITWIDTH_ALIGN) - 1) << MEMORY_TAG_SHIFT_ALIGN, MEMORY_TAG_CLASS_UNKNOWN = 0 << MEMORY_TAG_SHIFT_CLASS, MEMORY_TAG_CLASS_ARRAY = 1 << MEMORY_TAG_SHIFT_CLASS, MEMORY_TAG_CLASS_DYNARRAY = 2 << MEMORY_TAG_SHIFT_CLASS, MEMORY_TAG_CLASS_STRING = 3 << MEMORY_TAG_SHIFT_CLASS, MEMORY_TAG_CLASS_CIRCULAR_BUFFER = 4 << MEMORY_TAG_SHIFT_CLASS, MEMORY_TAG_CLASS_DICT = 5 << MEMORY_TAG_SHIFT_CLASS, MEMORY_TAG_CLASS_BINTREE = 6 << MEMORY_TAG_SHIFT_CLASS, MEMORY_TAG_CLASS_OCTTREE = 7 << MEMORY_TAG_SHIFT_CLASS, MEMORY_TAG_CLASS_TEXTURE = 9 << MEMORY_TAG_SHIFT_CLASS, MEMORY_TAG_CLASS_JOB = 9 << MEMORY_TAG_SHIFT_CLASS, MEMORY_TAG_CLASS_TRANSFORM = 10 << MEMORY_TAG_SHIFT_CLASS, MEMORY_TAG_CLASS_RENDER_OBJECT = 11 << MEMORY_TAG_SHIFT_CLASS, MEMORY_TAG_CLASS_MATERIAL = 12 << MEMORY_TAG_SHIFT_CLASS, MEMORY_TAG_CLASS_MAX_BUILTIN = (MEMORY_TAG_CLASS_MATERIAL >> MEMORY_TAG_SHIFT_CLASS) + 1, MEMORY_TAG_CLASS_MAX = (1 << MEMORY_TAG_BITWIDTH_CLASS) - 1, MEMORY_TAG_ZONE_UNKNOWN = 0 << MEMORY_TAG_SHIFT_ZONE, MEMORY_TAG_ZONE_SCENE = 1 << MEMORY_TAG_SHIFT_ZONE, MEMORY_TAG_ZONE_APPLICATION = 2 << MEMORY_TAG_SHIFT_ZONE, MEMORY_TAG_ZONE_RENDERER = 3 << MEMORY_TAG_SHIFT_ZONE, MEMORY_TAG_ZONE_ENGINE = 4 << MEMORY_TAG_SHIFT_ZONE, MEMORY_TAG_ZONE_EVENT = 5 << MEMORY_TAG_SHIFT_ZONE, MEMORY_TAG_ZONE_DEBUG = 6 << MEMORY_TAG_SHIFT_ZONE, MEMORY_TAG_ZONE_AUDIO = 7 << MEMORY_TAG_SHIFT_ZONE, MEMORY_TAG_ZONE_MAX_BUILTIN = (MEMORY_TAG_ZONE_AUDIO >> MEMORY_TAG_SHIFT_ZONE) + 1, MEMORY_TAG_ZONE_MAX = (1 << MEMORY_TAG_BITWIDTH_ZONE) - 1, MEMORY_TAG_ALIGN_ANY = 0 << MEMORY_TAG_SHIFT_ALIGN, MEMORY_TAG_ALIGN_32 = 1 << MEMORY_TAG_SHIFT_ALIGN, MEMORY_TAG_ALIGN_64 = 2 << MEMORY_TAG_SHIFT_ALIGN, MEMORY_TAG_ALIGN_PAGE = 3 << MEMORY_TAG_SHIFT_ALIGN, MEMORY_TAG_ALIGN_MAX_BUILTIN = (MEMORY_TAG_ALIGN_PAGE >> MEMORY_TAG_SHIFT_ALIGN) + 1, MEMORY_TAG_ALIGN_MAX = (1 << MEMORY_TAG_BITWIDTH_ALIGN) - 1, } MEMORY_TAGS; namespace basalt { namespace mem { void initialize_memory(void); void terminate_memory (void); template T* allocT(u64 num_elements, MEMORY_TAG tag); void* alloc(u64 num_bytes, MEMORY_TAG tag); void dealloc(void* ptr, u64 num_bytes, MEMORY_TAG tag); template T* setzeroT(T* dst, u64 num_elements); void* setzero(void* dst, u64 num_bytes); void changetag(u64 nbytes, MEMORY_TAG prev, MEMORY_TAG next); i64 get_total_memory_usage(void); i64 get_memory_usage_for_class(MEMORY_TAG memory_class, i64 out_per_zone[MEMORY_TAG_CLASS_MAX]); i64 get_memory_usage_for_zone(MEMORY_TAG memory_zone, i64 out_per_class[MEMORY_TAG_ZONE_MAX]); // Must be freed by user via dealloc with the tags; // MEMORY_TAG_CLASS_STRING | MEMORY_TAG_ZONE_DEBUG | MEMORY_TAG_ALIGN_ANY char* get_memory_usage_string(void); i64 get_memory_tag_class_name(MEMORY_TAG memory_class, char* out_buf, u64 out_buf_size); i64 get_memory_tag_zone_name(MEMORY_TAG memory_zone, char* out_buf, u64 out_buf_size); i64 get_memory_tag_alignment_bytes(MEMORY_TAG memory_alignment); template T* allocT(u64 num_elements, MEMORY_TAG tag) { return (T*)alloc(num_elements*sizeof(T), tag); } template T* setzeroT(T * dst, u64 num_elements) { return setzero(dst, num_elements*sizeof(T)); } } }