From 00036950d68896b50df6ca9d7079a646278f7119 Mon Sep 17 00:00:00 2001 From: Patedam Date: Sun, 2 Aug 2026 19:33:20 -0400 Subject: [PATCH] Converted d3d12 buffers to arena. Using linked list as i'm not sure how many buffers i will use total --- Juliet/src/Graphics/D3D12/D3D12Buffer.cpp | 29 +++++++++++++++++++---- Juliet/src/Graphics/D3D12/D3D12Buffer.h | 7 ++++-- 2 files changed, 30 insertions(+), 6 deletions(-) diff --git a/Juliet/src/Graphics/D3D12/D3D12Buffer.cpp b/Juliet/src/Graphics/D3D12/D3D12Buffer.cpp index bd0c077..a6a604a 100644 --- a/Juliet/src/Graphics/D3D12/D3D12Buffer.cpp +++ b/Juliet/src/Graphics/D3D12/D3D12Buffer.cpp @@ -1,17 +1,19 @@ -#include #include #include #include +#include #include #include #include -#include namespace Juliet::D3D12 { namespace { + // Linked List of free buffers + D3D12Buffer* FreeBuffers = nullptr; + enum class D3D12BufferType : uint8 { Base, @@ -53,18 +55,36 @@ namespace Juliet::D3D12 { Internal::ReleaseDescriptor(buffer->Descriptor); } + buffer->Descriptor = {}; if (buffer->Handle) { buffer->Handle->Release(); + buffer->Handle = nullptr; } - Free(buffer); + buffer->CurrentState = D3D12_RESOURCE_STATE_COMMON; + buffer->Size = 0; + + buffer->Next = FreeBuffers; + FreeBuffers = buffer; } D3D12Buffer* CreateBuffer(NonNullPtr d3d12Driver, size_t size, size_t stride, BufferUsage usage, D3D12BufferType type, bool isDynamic) { - auto* buffer = static_cast(Calloc(1, sizeof(D3D12Buffer))); + D3D12Buffer* buffer = nullptr; + if (FreeBuffers) + { + buffer = FreeBuffers; + FreeBuffers = buffer->Next; + buffer->Next = nullptr; + } + + if (!buffer) + { + buffer = ArenaPushStruct(d3d12Driver->DriverArena JULIET_DEBUG_PARAM("D3D12Buffer")); + } + if (!buffer) { return nullptr; @@ -243,6 +263,7 @@ namespace Juliet::D3D12 { auto d3d12Buffer = reinterpret_cast(buffer.Get()); void* ptr = nullptr; + // 0-0 range means we don't intend to read anything. D3D12_RANGE readRange = { 0, 0 }; if (FAILED(d3d12Buffer->Handle->Map(0, &readRange, &ptr))) diff --git a/Juliet/src/Graphics/D3D12/D3D12Buffer.h b/Juliet/src/Graphics/D3D12/D3D12Buffer.h index af99f0b..d179b2b 100644 --- a/Juliet/src/Graphics/D3D12/D3D12Buffer.h +++ b/Juliet/src/Graphics/D3D12/D3D12Buffer.h @@ -4,7 +4,6 @@ #include #include - namespace Juliet { struct CommandList; @@ -14,10 +13,14 @@ namespace Juliet::D3D12 { struct D3D12Buffer { + // Note: This three variables need to stay at the top and in this order Internal::D3D12Descriptor Descriptor; ID3D12Resource* Handle; D3D12_RESOURCE_STATES CurrentState; - size_t Size; + + // Anything here can be any order + D3D12Buffer* Next; + size_t Size; }; extern GraphicsBuffer* CreateGraphicsBuffer(NonNullPtr driver, size_t size, size_t stride,