Converted d3d12 buffers to arena. Using linked list as i'm not sure how many buffers i will use total

This commit is contained in:
2026-08-02 19:33:20 -04:00
parent 5862843a40
commit 00036950d6
2 changed files with 30 additions and 6 deletions
+25 -4
View File
@@ -1,17 +1,19 @@
#include <Core/Memory/Allocator.h>
#include <Graphics/D3D12/D3D12Buffer.h> #include <Graphics/D3D12/D3D12Buffer.h>
#include <Core/Logging/LogManager.h> #include <Core/Logging/LogManager.h>
#include <Core/Logging/LogTypes.h> #include <Core/Logging/LogTypes.h>
#include <Core/Memory/Allocator.h>
#include <Graphics/D3D12/D3D12CommandList.h> #include <Graphics/D3D12/D3D12CommandList.h>
#include <Graphics/D3D12/D3D12DescriptorHeap.h> #include <Graphics/D3D12/D3D12DescriptorHeap.h>
#include <Graphics/D3D12/D3D12GraphicsDevice.h> #include <Graphics/D3D12/D3D12GraphicsDevice.h>
#include <Graphics/D3D12/D3D12Utils.h>
namespace Juliet::D3D12 namespace Juliet::D3D12
{ {
namespace namespace
{ {
// Linked List of free buffers
D3D12Buffer* FreeBuffers = nullptr;
enum class D3D12BufferType : uint8 enum class D3D12BufferType : uint8
{ {
Base, Base,
@@ -53,18 +55,36 @@ namespace Juliet::D3D12
{ {
Internal::ReleaseDescriptor(buffer->Descriptor); Internal::ReleaseDescriptor(buffer->Descriptor);
} }
buffer->Descriptor = {};
if (buffer->Handle) if (buffer->Handle)
{ {
buffer->Handle->Release(); 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> d3d12Driver, size_t size, size_t stride, BufferUsage usage, D3D12Buffer* CreateBuffer(NonNullPtr<D3D12Driver> d3d12Driver, size_t size, size_t stride, BufferUsage usage,
D3D12BufferType type, bool isDynamic) D3D12BufferType type, bool isDynamic)
{ {
auto* buffer = static_cast<D3D12Buffer*>(Calloc(1, sizeof(D3D12Buffer))); D3D12Buffer* buffer = nullptr;
if (FreeBuffers)
{
buffer = FreeBuffers;
FreeBuffers = buffer->Next;
buffer->Next = nullptr;
}
if (!buffer)
{
buffer = ArenaPushStruct<D3D12Buffer>(d3d12Driver->DriverArena JULIET_DEBUG_PARAM("D3D12Buffer"));
}
if (!buffer) if (!buffer)
{ {
return nullptr; return nullptr;
@@ -243,6 +263,7 @@ namespace Juliet::D3D12
{ {
auto d3d12Buffer = reinterpret_cast<D3D12Buffer*>(buffer.Get()); auto d3d12Buffer = reinterpret_cast<D3D12Buffer*>(buffer.Get());
void* ptr = nullptr; void* ptr = nullptr;
// 0-0 range means we don't intend to read anything. // 0-0 range means we don't intend to read anything.
D3D12_RANGE readRange = { 0, 0 }; D3D12_RANGE readRange = { 0, 0 };
if (FAILED(d3d12Buffer->Handle->Map(0, &readRange, &ptr))) if (FAILED(d3d12Buffer->Handle->Map(0, &readRange, &ptr)))
+5 -2
View File
@@ -4,7 +4,6 @@
#include <Graphics/D3D12/D3D12DescriptorHeap.h> #include <Graphics/D3D12/D3D12DescriptorHeap.h>
#include <Graphics/GraphicsBuffer.h> #include <Graphics/GraphicsBuffer.h>
namespace Juliet namespace Juliet
{ {
struct CommandList; struct CommandList;
@@ -14,10 +13,14 @@ namespace Juliet::D3D12
{ {
struct D3D12Buffer struct D3D12Buffer
{ {
// Note: This three variables need to stay at the top and in this order
Internal::D3D12Descriptor Descriptor; Internal::D3D12Descriptor Descriptor;
ID3D12Resource* Handle; ID3D12Resource* Handle;
D3D12_RESOURCE_STATES CurrentState; D3D12_RESOURCE_STATES CurrentState;
size_t Size;
// Anything here can be any order
D3D12Buffer* Next;
size_t Size;
}; };
extern GraphicsBuffer* CreateGraphicsBuffer(NonNullPtr<GPUDriver> driver, size_t size, size_t stride, extern GraphicsBuffer* CreateGraphicsBuffer(NonNullPtr<GPUDriver> driver, size_t size, size_t stride,