Files
basalt/include/core/basalt_memory.h
Riley King-Saunders 105edea0f3 Updated memory interface for get_memory_usage_string. It now takes a pointer to a uint and optionally a char* to write the output buffers size to and the buffer pointer. It still returns the buffer pointer.
Fixed bug in dealloc where it would add to the memory used rather than subtract.
Added a zero-check to source-private get_eng_unit function to prevent dropping the unit to the minimum for a value of 0
Changed padding calculation to happen on every call to get_memory_usage_string rather than on the first call. As a result, it will now use minimum padding and ignore zero components. Merged zone and class name alignment values into one.
Fixed bug where the length of a user class/zone was not accounting for the prefix "USER_" by adding 5 to the result.
Made formatting change where by zone/class is tab indented and the values are double tab indented
2025-06-24 15:43:06 +10:00

88 lines
3.8 KiB
C++

#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 <typename T>
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 <typename T>
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(u32* slen, char** memstr=nullptr);
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<typename T>
T* allocT(u64 num_elements, MEMORY_TAG tag)
{ return (T*)alloc(num_elements*sizeof(T), tag); }
template<typename T>
T* setzeroT(T * dst, u64 num_elements)
{ return setzero(dst, num_elements*sizeof(T)); }
}
}