diff --git a/Juliet/include/Core/Common/NonNullPtr.h b/Juliet/include/Core/Common/NonNullPtr.h index 36bdc31..e80f939 100644 --- a/Juliet/include/Core/Common/NonNullPtr.h +++ b/Juliet/include/Core/Common/NonNullPtr.h @@ -15,7 +15,7 @@ namespace Juliet class NonNullPtr { public: - NonNullPtr(Type* ptr) + inline NonNullPtr(Type* ptr) : InternalPtr(ptr) { Assert(ptr, "Tried to initialize a NonNullPtr with a null pointer"); @@ -64,7 +64,7 @@ namespace Juliet return *InternalPtr; } - Type* operator->() const + inline Type* operator->() const { Assert(InternalPtr, "NonNullPtr: Internal Pointer is Null"); return InternalPtr; diff --git a/Juliet/src/Graphics/D3D12/D3D12Buffer.cpp b/Juliet/src/Graphics/D3D12/D3D12Buffer.cpp index 358519d..78962b0 100644 --- a/Juliet/src/Graphics/D3D12/D3D12Buffer.cpp +++ b/Juliet/src/Graphics/D3D12/D3D12Buffer.cpp @@ -23,9 +23,9 @@ namespace Juliet::D3D12 { switch (type) { - case D3D12BufferType::Base: return "Base"; - case D3D12BufferType::TransferDownload: return "TransferDownload"; - case D3D12BufferType::TransferUpload: return "TransferUpload"; + case D3D12BufferType::Base: return "Base"; + case D3D12BufferType::TransferDownload: return "TransferDownload"; + case D3D12BufferType::TransferUpload: return "TransferUpload"; } return "Unknown"; } @@ -34,11 +34,11 @@ namespace Juliet::D3D12 { switch (usage) { - case BufferUsage::None: return "None"; - case BufferUsage::ConstantBuffer: return "ConstantBuffer"; - case BufferUsage::StructuredBuffer: return "StructuredBuffer"; - case BufferUsage::IndexBuffer: return "IndexBuffer"; - case BufferUsage::VertexBuffer: return "VertexBuffer"; + case BufferUsage::None: return "None"; + case BufferUsage::ConstantBuffer: return "ConstantBuffer"; + case BufferUsage::StructuredBuffer: return "StructuredBuffer"; + case BufferUsage::IndexBuffer: return "IndexBuffer"; + case BufferUsage::VertexBuffer: return "VertexBuffer"; } return "Unknown"; } @@ -107,23 +107,17 @@ namespace Juliet::D3D12 { if (d3d12Driver->GPUUploadHeapSupported) { - heapProperties.Type = D3D12_HEAP_TYPE_GPU_UPLOAD; - heapProperties.CPUPageProperty = D3D12_CPU_PAGE_PROPERTY_UNKNOWN; - heapProperties.MemoryPoolPreference = D3D12_MEMORY_POOL_UNKNOWN; + heapProperties.Type = D3D12_HEAP_TYPE_GPU_UPLOAD; } else { - heapProperties.Type = D3D12_HEAP_TYPE_UPLOAD; - heapProperties.CPUPageProperty = D3D12_CPU_PAGE_PROPERTY_UNKNOWN; - heapProperties.MemoryPoolPreference = D3D12_MEMORY_POOL_UNKNOWN; - initialState = D3D12_RESOURCE_STATE_GENERIC_READ; - heapFlags = D3D12_HEAP_FLAG_ALLOW_ONLY_BUFFERS; - } - // heapFlags = D3D12_HEAP_FLAG_NONE; // Avoid overwriting if set above - if (heapProperties.Type == D3D12_HEAP_TYPE_GPU_UPLOAD) - { - heapFlags = D3D12_HEAP_FLAG_NONE; // Or appropriate flags + heapProperties.Type = D3D12_HEAP_TYPE_UPLOAD; + heapFlags = D3D12_HEAP_FLAG_ALLOW_ONLY_BUFFERS; } + heapProperties.CPUPageProperty = D3D12_CPU_PAGE_PROPERTY_UNKNOWN; + heapProperties.MemoryPoolPreference = D3D12_MEMORY_POOL_UNKNOWN; + initialState = D3D12_RESOURCE_STATE_GENERIC_READ; + break; } } @@ -140,10 +134,17 @@ namespace Juliet::D3D12 } case D3D12BufferType::TransferUpload: { - heapProperties.Type = D3D12_HEAP_TYPE_UPLOAD; + if (d3d12Driver->GPUUploadHeapSupported) + { + heapProperties.Type = D3D12_HEAP_TYPE_GPU_UPLOAD; + } + else + { + heapProperties.Type = D3D12_HEAP_TYPE_UPLOAD; + heapFlags = D3D12_HEAP_FLAG_ALLOW_ONLY_BUFFERS; + } heapProperties.CPUPageProperty = D3D12_CPU_PAGE_PROPERTY_UNKNOWN; heapProperties.MemoryPoolPreference = D3D12_MEMORY_POOL_UNKNOWN; - heapFlags = D3D12_HEAP_FLAG_NONE; initialState = D3D12_RESOURCE_STATE_GENERIC_READ; break; } @@ -164,16 +165,18 @@ namespace Juliet::D3D12 desc.Layout = D3D12_TEXTURE_LAYOUT_ROW_MAJOR; desc.Flags = D3D12_RESOURCE_FLAG_NONE; - Log(LogLevel::Message, LogCategory::Graphics, "CreateBuffer: Device=%p, Size=%zu, Type=%s Use=%s", (void*)d3d12Driver->D3D12Device, size, D3D12BufferTypeToString(type), BufferUsageToString(usage)); + Log(LogLevel::Message, LogCategory::Graphics, "CreateBuffer: Device=%p, Size=%zu, Type=%s Use=%s", + (void*)d3d12Driver->D3D12Device, size, D3D12BufferTypeToString(type), BufferUsageToString(usage)); ID3D12Resource* handle = nullptr; - HRESULT result = d3d12Driver->D3D12Device->CreateCommittedResource(&heapProperties, heapFlags, - &desc, initialState, nullptr, - IID_ID3D12Resource, reinterpret_cast(&handle)); + HRESULT result = d3d12Driver->D3D12Device->CreateCommittedResource(&heapProperties, heapFlags, &desc, + initialState, nullptr, IID_ID3D12Resource, + reinterpret_cast(&handle)); if (FAILED(result)) { Log(LogLevel::Error, LogCategory::Graphics, "Could not create buffer! HRESULT=0x%08X", (uint32)result); - Log(LogLevel::Error, LogCategory::Graphics, "Failed Desc: Width=%llu Layout=%d HeapType=%d", (unsigned long long)desc.Width, (int)desc.Layout, (int)heapProperties.Type); - + Log(LogLevel::Error, LogCategory::Graphics, "Failed Desc: Width=%llu Layout=%d HeapType=%d", + (unsigned long long)desc.Width, (int)desc.Layout, (int)heapProperties.Type); + HRESULT removeReason = d3d12Driver->D3D12Device->GetDeviceRemovedReason(); if (FAILED(removeReason)) { @@ -305,8 +308,8 @@ namespace Juliet::D3D12 // We assume Upload buffers are always in state GENERIC_READ or similar suitable for CopySrc. // D3D12 Upload heaps start in GENERIC_READ and cannot transition. - d3d12CmdList->GraphicsCommandList.CommandList->CopyBufferRegion(d3d12Dst->Handle, - dstOffset, d3d12Src->Handle, srcOffset, size); + d3d12CmdList->GraphicsCommandList.CommandList->CopyBufferRegion(d3d12Dst->Handle, dstOffset, d3d12Src->Handle, + srcOffset, size); } void TransitionBufferToReadable(NonNullPtr commandList, NonNullPtr buffer) diff --git a/Juliet/src/Graphics/D3D12/D3D12CommandList.h b/Juliet/src/Graphics/D3D12/D3D12CommandList.h index c246f6c..2800bdf 100644 --- a/Juliet/src/Graphics/D3D12/D3D12CommandList.h +++ b/Juliet/src/Graphics/D3D12/D3D12CommandList.h @@ -98,7 +98,7 @@ namespace Juliet::D3D12 extern void SetBlendConstants(NonNullPtr commandList, FColor blendConstants); extern void SetStencilReference(NonNullPtr commandList, uint8 reference); extern void SetIndexBuffer(NonNullPtr commandList, NonNullPtr buffer, - IndexFormat format, index_t offset); + IndexFormat format, size_t indexCount, index_t offset); extern void SetPushConstants(NonNullPtr commandList, ShaderStage stage, uint32 rootParameterIndex, uint32 numConstants, const void* constants); diff --git a/Juliet/src/Graphics/D3D12/D3D12GraphicsDevice.cpp b/Juliet/src/Graphics/D3D12/D3D12GraphicsDevice.cpp index 6639864..a2e0146 100644 --- a/Juliet/src/Graphics/D3D12/D3D12GraphicsDevice.cpp +++ b/Juliet/src/Graphics/D3D12/D3D12GraphicsDevice.cpp @@ -680,14 +680,12 @@ namespace Juliet::D3D12 Internal::TextureTransitionToDefaultUsage(d3d12CommandList, d3d12Texture, D3D12_RESOURCE_STATE_COPY_DEST); } - // GetDescriptorIndex wrapper needed to adapt signature from GPUDriver* to GraphicsDevice* uint32 GetDescriptorIndex(NonNullPtr device, NonNullPtr buffer) { auto* driver = static_cast(device->Driver); return D3D12::GetDescriptorIndex(driver, buffer); } - // GetDescriptorIndexTexture provides custom logic to get SRV handle index uint32 GetDescriptorIndexTexture(NonNullPtr /*device*/, NonNullPtr texture) { auto* textureContainer = reinterpret_cast(texture.Get()); @@ -1019,42 +1017,39 @@ namespace Juliet::D3D12 device->AcquireSwapChainTexture = AcquireSwapChainTexture; device->WaitAndAcquireSwapChainTexture = WaitAndAcquireSwapChainTexture; device->GetSwapChainTextureFormat = GetSwapChainTextureFormat; - device->AcquireCommandList = D3D12::AcquireCommandList; - device->SubmitCommandLists = D3D12::SubmitCommandLists; - - device->BeginRenderPass = D3D12::BeginRenderPass; - device->EndRenderPass = D3D12::EndRenderPass; - device->SetViewPort = D3D12::SetViewPort; - device->SetScissorRect = D3D12::SetScissorRect; - device->SetBlendConstants = D3D12::SetBlendConstants; - device->SetStencilReference = D3D12::SetStencilReference; - device->BindGraphicsPipeline = D3D12::BindGraphicsPipeline; - device->DrawPrimitives = D3D12::DrawPrimitives; - device->DrawIndexedPrimitives = D3D12::DrawIndexedPrimitives; - device->SetIndexBuffer = D3D12::SetIndexBuffer; - device->WaitUntilGPUIsIdle = D3D12::WaitUntilGPUIsIdle; - - device->SetPushConstants = D3D12::SetPushConstants; - device->QueryFence = D3D12::QueryFence; - device->ReleaseFence = D3D12::ReleaseFence; - device->CreateShader = D3D12::CreateShader; - device->DestroyShader = D3D12::DestroyShader; - device->CreateGraphicsPipeline = D3D12::CreateGraphicsPipeline; - device->DestroyGraphicsPipeline = DestroyGraphicsPipeline; - device->CreateGraphicsBuffer = D3D12::CreateGraphicsBuffer; - device->DestroyGraphicsBuffer = D3D12::DestroyGraphicsBuffer; - device->CreateGraphicsTransferBuffer = D3D12::CreateGraphicsTransferBuffer; - device->DestroyGraphicsTransferBuffer = D3D12::DestroyGraphicsTransferBuffer; - device->MapGraphicsTransferBuffer = D3D12::MapBuffer; - device->UnmapGraphicsTransferBuffer = D3D12::UnmapBuffer; - device->CopyBuffer = CopyBuffer; - device->CopyBufferToTexture = CopyBufferToTexture; - device->TransitionBufferToReadable = D3D12::TransitionBufferToReadable; - - device->GetDescriptorIndex = GetDescriptorIndex; - device->GetDescriptorIndexTexture = GetDescriptorIndexTexture; - device->CreateTexture = D3D12::CreateTexture; - device->DestroyTexture = D3D12::DestroyTexture; + device->AcquireCommandList = AcquireCommandList; + device->SubmitCommandLists = SubmitCommandLists; + device->BeginRenderPass = BeginRenderPass; + device->EndRenderPass = EndRenderPass; + device->SetViewPort = SetViewPort; + device->SetScissorRect = SetScissorRect; + device->SetBlendConstants = SetBlendConstants; + device->SetStencilReference = SetStencilReference; + device->BindGraphicsPipeline = BindGraphicsPipeline; + device->DrawPrimitives = DrawPrimitives; + device->DrawIndexedPrimitives = DrawIndexedPrimitives; + device->SetIndexBuffer = SetIndexBuffer; + device->WaitUntilGPUIsIdle = WaitUntilGPUIsIdle; + device->SetPushConstants = SetPushConstants; + device->QueryFence = QueryFence; + device->ReleaseFence = ReleaseFence; + device->CreateShader = CreateShader; + device->DestroyShader = DestroyShader; + device->CreateGraphicsPipeline = CreateGraphicsPipeline; + device->DestroyGraphicsPipeline = DestroyGraphicsPipeline; + device->CreateGraphicsBuffer = CreateGraphicsBuffer; + device->DestroyGraphicsBuffer = DestroyGraphicsBuffer; + device->CreateGraphicsTransferBuffer = CreateGraphicsTransferBuffer; + device->DestroyGraphicsTransferBuffer = DestroyGraphicsTransferBuffer; + device->MapGraphicsTransferBuffer = MapBuffer; + device->UnmapGraphicsTransferBuffer = UnmapBuffer; + device->CopyBuffer = CopyBuffer; + device->CopyBufferToTexture = CopyBufferToTexture; + device->TransitionBufferToReadable = TransitionBufferToReadable; + device->GetDescriptorIndex = GetDescriptorIndex; + device->GetDescriptorIndexTexture = GetDescriptorIndexTexture; + device->CreateTexture = CreateTexture; + device->DestroyTexture = DestroyTexture; #if ALLOW_SHADER_HOT_RELOAD device->UpdateGraphicsPipelineShaders = UpdateGraphicsPipelineShaders; diff --git a/JulietApp/main.cpp b/JulietApp/main.cpp index e9aadf6..e0b8269 100644 --- a/JulietApp/main.cpp +++ b/JulietApp/main.cpp @@ -143,7 +143,7 @@ void JulietApplication::Init() BufferCreateInfo bufferCI = {}; bufferCI.Size = 1024; bufferCI.Usage = BufferUsage::StructuredBuffer; // SRV for ResourceDescriptorHeap access - ConstantBuffer = CreateGraphicsBuffer(GraphicsDevice, bufferCI); + StructuredBuffer = CreateGraphicsBuffer(GraphicsDevice, bufferCI); TransferBufferCreateInfo transferCI = {}; transferCI.Size = 1024; @@ -151,7 +151,7 @@ void JulietApplication::Init() TransferBuffer = CreateGraphicsTransferBuffer(GraphicsDevice, transferCI); // Upload Static Data for Test - if (TransferBuffer && ConstantBuffer) + if (TransferBuffer && StructuredBuffer) { void* data = MapGraphicsTransferBuffer(GraphicsDevice, TransferBuffer); if (data) @@ -165,8 +165,8 @@ void JulietApplication::Init() UnmapGraphicsTransferBuffer(GraphicsDevice, TransferBuffer); CommandList* initCmd = AcquireCommandList(GraphicsDevice); - CopyBuffer(initCmd, ConstantBuffer, TransferBuffer, 256); - TransitionBufferToReadable(initCmd, ConstantBuffer); + CopyBuffer(initCmd, StructuredBuffer, TransferBuffer, 256); + TransitionBufferToReadable(initCmd, StructuredBuffer); SubmitCommandLists(initCmd); } } @@ -220,9 +220,9 @@ void JulietApplication::Shutdown() { DestroyGraphicsPipeline(GraphicsDevice, GraphicsPipeline); } - if (ConstantBuffer) + if (StructuredBuffer) { - DestroyGraphicsBuffer(GraphicsDevice, ConstantBuffer); + DestroyGraphicsBuffer(GraphicsDevice, StructuredBuffer); } if (TransferBuffer) { @@ -366,7 +366,7 @@ void JulietApplication::OnPreRender(CommandList* cmd) index_t index = 0; // Buffer uploads - if (ConstantBuffer && TransferBuffer) + if (StructuredBuffer && TransferBuffer) { void* ptr = MapGraphicsTransferBuffer(GraphicsDevice, TransferBuffer); if (ptr) @@ -405,8 +405,8 @@ void JulietApplication::OnPreRender(CommandList* cmd) UnmapGraphicsTransferBuffer(GraphicsDevice, TransferBuffer); } - CopyBuffer(cmd, ConstantBuffer, TransferBuffer, CubeMesh->IndexByteOffset + (CubeMesh->IndexCount * sizeof(uint16))); - TransitionBufferToReadable(cmd, ConstantBuffer); + CopyBuffer(cmd, StructuredBuffer, TransferBuffer, CubeMesh->IndexByteOffset + (CubeMesh->IndexCount * sizeof(uint16))); + TransitionBufferToReadable(cmd, StructuredBuffer); } } @@ -414,7 +414,7 @@ void JulietApplication::OnRender(RenderPass* pass, CommandList* cmd) { BindGraphicsPipeline(pass, GraphicsPipeline); - uint32 descriptorIndex = GetDescriptorIndex(GraphicsDevice, ConstantBuffer); + uint32 descriptorIndex = GetDescriptorIndex(GraphicsDevice, StructuredBuffer); struct PushData { @@ -426,7 +426,7 @@ void JulietApplication::OnRender(RenderPass* pass, CommandList* cmd) SetPushConstants(cmd, ShaderStage::Vertex, 0, sizeof(pushData) / 4, &pushData); - SetIndexBuffer(cmd, ConstantBuffer, IndexFormat::UInt16, CubeMesh->IndexCount, CubeMesh->IndexByteOffset); + SetIndexBuffer(cmd, StructuredBuffer, IndexFormat::UInt16, CubeMesh->IndexCount, CubeMesh->IndexByteOffset); // DrawIndexedPrimitives(pass, static_cast(CubeMesh->IndexCount), 1, 0, 0, 0); DrawIndexedPrimitives(pass, static_cast(CubeMesh->IndexCount), 1, diff --git a/JulietApp/main.h b/JulietApp/main.h index 233bc61..32a3358 100644 --- a/JulietApp/main.h +++ b/JulietApp/main.h @@ -42,7 +42,7 @@ class JulietApplication : public Juliet::IApplication Juliet::GraphicsDevice* GraphicsDevice = {}; Juliet::HotReloadCode GameCode = {}; Juliet::GraphicsPipeline* GraphicsPipeline = {}; - Juliet::GraphicsBuffer* ConstantBuffer = {}; + Juliet::GraphicsBuffer* StructuredBuffer = {}; Juliet::GraphicsTransferBuffer* TransferBuffer = {}; Juliet::Texture* DepthBuffer = {};