diff --git a/Game/Entity/EntityManager.cpp b/Game/Entity/EntityManager.cpp index f7f467a..f09696d 100644 --- a/Game/Entity/EntityManager.cpp +++ b/Game/Entity/EntityManager.cpp @@ -14,7 +14,7 @@ namespace Game void InitEntityManager(Juliet::NonNullPtr arena) { Manager.Arena = arena.Get(); - Manager.Entities.Create(arena); + Manager.Entities.Create(arena JULIET_DEBUG_PARAM("Entities")); } void ShutdownEntityManager() diff --git a/Juliet/include/Core/Container/Vector.h b/Juliet/include/Core/Container/Vector.h index aa4867e..c63c7d7 100644 --- a/Juliet/include/Core/Container/Vector.h +++ b/Juliet/include/Core/Container/Vector.h @@ -9,24 +9,28 @@ namespace Juliet template struct VectorArena { - void Create(JULIET_DEBUG_ONLY(const char* name = "VectorArena")) + void Create(JULIET_DEBUG_PARAM_FIRST(const char* name = nullptr)) { Assert(!Arena); static_assert(AllowRealloc == false); DataFirst = DataLast = nullptr; Count = 0; - ArenaParams params{ .AllowRealloc = AllowRealloc JULIET_DEBUG_ONLY(, .CanReserveMore = false) }; - Arena = ArenaAllocate(params JULIET_DEBUG_ONLY(, name)); + + JULIET_DEBUG_ONLY(Name = name ? name : Name); + ArenaParams params{ .AllowRealloc = AllowRealloc JULIET_DEBUG_PARAM(.CanReserveMore = false) }; + Arena = ArenaAllocate(params JULIET_DEBUG_PARAM(Name)); InternalArena = true; Reserve(ReserveSize); } - void Create(NonNullPtr arena) + void Create(NonNullPtr arena JULIET_DEBUG_PARAM(const char* name = nullptr)) { Assert(!Arena); + JULIET_DEBUG_ONLY(Name = name ? name : Name); + DataFirst = DataLast = nullptr; Count = 0; Arena = arena.Get(); @@ -53,7 +57,7 @@ namespace Juliet { if (Data == nullptr) { - Data = ArenaPushArray(Arena, newCapacity); + Data = ArenaPushArray(Arena, newCapacity JULIET_DEBUG_PARAM(Name)); } else if constexpr (AllowRealloc) { @@ -61,7 +65,7 @@ namespace Juliet { DataFirst = Data = static_cast(ArenaReallocate(Arena, Data, Capacity * sizeof(Type), newCapacity * sizeof(Type), - AlignOf(Type), true JULIET_DEBUG_ONLY(, "VectorRealloc"))); + AlignOf(Type), true JULIET_DEBUG_PARAM("VectorRealloc"))); DataLast = Data + Count - 1; } } @@ -192,6 +196,7 @@ namespace Juliet size_t Count; size_t Capacity; bool InternalArena : 1; + JULIET_DEBUG_ONLY(const char* Name = "VectorArena"); }; static_assert(std::is_standard_layout_v>, "VectorArena must have a standard layout to remain POD-like."); diff --git a/Juliet/include/Core/Memory/MemoryArena.h b/Juliet/include/Core/Memory/MemoryArena.h index 204c9e1..55e158a 100644 --- a/Juliet/include/Core/Memory/MemoryArena.h +++ b/Juliet/include/Core/Memory/MemoryArena.h @@ -60,7 +60,6 @@ namespace Juliet bool AllowRealloc = false; // When false, will assert if a new block is reserved. - // Useful for Vectors as they are guaranteed to be linear and i wont need to implement memcopy to increase capacity JULIET_DEBUG_ONLY(bool CanReserveMore : 1 = true;) }; @@ -72,12 +71,12 @@ namespace Juliet // Raw Push, can be used but templated helpers exists below [[nodiscard]] JULIET_API void* ArenaPush(NonNullPtr arena, size_t size, size_t align, bool shouldBeZeroed JULIET_DEBUG_ONLY(, const char* tag)); - [[nodiscard]] void* ArenaReallocate(NonNullPtr arena, void* oldPtr, size_t oldSize, size_t newSize, - size_t align, bool shouldBeZeroed JULIET_DEBUG_ONLY(, const char* tag)); - void ArenaPopTo(NonNullPtr arena, size_t position); - void ArenaPop(NonNullPtr arena, size_t amount); - void ArenaClear(NonNullPtr arena); - [[nodiscard]] size_t ArenaPos(NonNullPtr arena); + [[nodiscard]] JULIET_API void* ArenaReallocate(NonNullPtr arena, void* oldPtr, size_t oldSize, size_t newSize, + size_t align, bool shouldBeZeroed JULIET_DEBUG_ONLY(, const char* tag)); + JULIET_API void ArenaPopTo(NonNullPtr arena, size_t position); + JULIET_API void ArenaPop(NonNullPtr arena, size_t amount); + JULIET_API void ArenaClear(NonNullPtr arena); + [[nodiscard]] JULIET_API size_t ArenaPos(NonNullPtr arena); template [[nodiscard]] Type* ArenaPushStruct(NonNullPtr arena) @@ -86,10 +85,11 @@ namespace Juliet ArenaPush(arena, sizeof(Type) * 1, AlignOf(Type), true JULIET_DEBUG_ONLY(, typeid(Type).name()))); } - // #define push_array_no_zero_aligned(a, T, c, align) (T *)arena_push((a), sizeof(T)*(c), (align), (0)) - // #define push_array_aligned(a, T, c, align) (T *)arena_push((a), sizeof(T)*(c), (align), (1)) - // #define push_array_no_zero(a, T, c) push_array_no_zero_aligned(a, T, c, Max(8, AlignOf(T))) - // #define push_array(a, T, c) push_array_aligned(a, T, c, Max(8, AlignOf(T))) + template + [[nodiscard]] Type* ArenaPushArray(NonNullPtr arena, size_t count JULIET_DEBUG_ONLY(, const char* tag)) + { + return static_cast(ArenaPush(arena, sizeof(Type) * count, Max(8ull, AlignOf(Type)), true JULIET_DEBUG_ONLY(, tag))); + } template [[nodiscard]] Type* ArenaPushArray(NonNullPtr arena, size_t count) diff --git a/Juliet/include/Juliet.h b/Juliet/include/Juliet.h index 7f9f266..3f4ac02 100644 --- a/Juliet/include/Juliet.h +++ b/Juliet/include/Juliet.h @@ -22,9 +22,13 @@ #ifdef DEBUG #define JULIET_DEBUG 1 #define JULIET_DEBUG_ONLY(...) __VA_ARGS__ +#define JULIET_DEBUG_PARAM_FIRST(...) __VA_ARGS__ +#define JULIET_DEBUG_PARAM(...) , __VA_ARGS__ #else #define JULIET_DEBUG 0 #define JULIET_DEBUG_ONLY(...) +#define JULIET_DEBUG_PARAM_FIRST(...) +#define JULIET_DEBUG_PARAM(...) #endif // Manual override to disable ImGui diff --git a/Juliet/src/Graphics/D3D12/D3D12DescriptorHeap.cpp b/Juliet/src/Graphics/D3D12/D3D12DescriptorHeap.cpp index 338fdbb..e1462d5 100644 --- a/Juliet/src/Graphics/D3D12/D3D12DescriptorHeap.cpp +++ b/Juliet/src/Graphics/D3D12/D3D12DescriptorHeap.cpp @@ -44,7 +44,7 @@ namespace Juliet::D3D12::Internal heap->CurrentDescriptorIndex = 0; - heap->FreeIndices.Create(JULIET_DEBUG_ONLY("DescriptorHeap FreeIndices")); + heap->FreeIndices.Create(arena JULIET_DEBUG_PARAM("DescriptorHeap Free Indices")); heap->FreeIndices.Resize(16); heap->CurrentFreeIndex = 0; diff --git a/JulietApp/main.cpp b/JulietApp/main.cpp index 68c0df3..90d722d 100644 --- a/JulietApp/main.cpp +++ b/JulietApp/main.cpp @@ -198,8 +198,8 @@ void JulietApplication::Init() if ((Running = GameCode.IsValid)) { GameInitParams params; - params.GameArena = ArenaAllocate({} JULIET_DEBUG_ONLY(, "Game Arena")); - params.ScratchArena = ArenaAllocate({} JULIET_DEBUG_ONLY(, "Scratch Arena")); + params.GameArena = GameArena = ArenaAllocate({} JULIET_DEBUG_ONLY(, "Game Arena")); + params.ScratchArena = GameScratchArena = ArenaAllocate({} JULIET_DEBUG_ONLY(, "Scratch Arena")); Game.Init(¶ms); } } @@ -356,6 +356,8 @@ void JulietApplication::Update() Debug::DebugDrawMemoryArena(); #endif } + + ArenaClear(GameScratchArena); } void JulietApplication::OnPreRender(CommandList* cmd) diff --git a/JulietApp/main.h b/JulietApp/main.h index a94a7e4..3a8b170 100644 --- a/JulietApp/main.h +++ b/JulietApp/main.h @@ -26,11 +26,11 @@ class JulietApplication : public Juliet::IApplication Juliet::GraphicsDevice* GetGraphicsDevice() override { return GraphicsDevice; } // Render Lifecycle - void OnPreRender(Juliet::CommandList* cmd) override; - void OnRender(Juliet::RenderPass* pass, Juliet::CommandList* cmd) override; - Juliet::ColorTargetInfo GetColorTargetInfo(Juliet::Texture* swapchainTexture) override; - Juliet::DepthStencilTargetInfo* GetDepthTargetInfo() override; - Juliet::Camera GetDebugCamera() override; + void OnPreRender(Juliet::CommandList* cmd) override; + void OnRender(Juliet::RenderPass* pass, Juliet::CommandList* cmd) override; + Juliet::ColorTargetInfo GetColorTargetInfo(Juliet::Texture* swapchainTexture) override; + Juliet::DepthStencilTargetInfo* GetDepthTargetInfo() override; + Juliet::Camera GetDebugCamera() override; public: void SetAutoCloseFrameCount(int count) { AutoCloseFrameCount = count; } @@ -45,7 +45,10 @@ class JulietApplication : public Juliet::IApplication Juliet::GraphicsTransferBuffer* TransferBuffer = {}; Juliet::Texture* DepthBuffer = {}; - bool Running = false; + Juliet::Arena* GameArena = nullptr; + Juliet::Arena* GameScratchArena = nullptr; + + bool Running = false; int AutoCloseFrameCount = -1; };