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 <Core/Logging/LogManager.h>
#include <Core/Logging/LogTypes.h>
#include <Core/Memory/Allocator.h>
#include <Graphics/D3D12/D3D12CommandList.h>
#include <Graphics/D3D12/D3D12DescriptorHeap.h>
#include <Graphics/D3D12/D3D12GraphicsDevice.h>
#include <Graphics/D3D12/D3D12Utils.h>
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> d3d12Driver, size_t size, size_t stride, BufferUsage usage,
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)
{
return nullptr;
@@ -243,6 +263,7 @@ namespace Juliet::D3D12
{
auto d3d12Buffer = reinterpret_cast<D3D12Buffer*>(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)))
+4 -1
View File
@@ -4,7 +4,6 @@
#include <Graphics/D3D12/D3D12DescriptorHeap.h>
#include <Graphics/GraphicsBuffer.h>
namespace Juliet
{
struct CommandList;
@@ -14,9 +13,13 @@ 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;
// Anything here can be any order
D3D12Buffer* Next;
size_t Size;
};