diff --git a/engine/CMakeLists.txt b/engine/CMakeLists.txt index 0b884cce..8fcbb46b 100644 --- a/engine/CMakeLists.txt +++ b/engine/CMakeLists.txt @@ -88,12 +88,14 @@ add_library(XCEngine STATIC include/XCEngine/RHI/D3D12/D3D12CommandQueue.h include/XCEngine/RHI/D3D12/D3D12CommandAllocator.h include/XCEngine/RHI/D3D12/D3D12CommandList.h + include/XCEngine/RHI/D3D12/D3D12DescriptorHeap.h include/XCEngine/RHI/D3D12/D3D12Fence.h include/XCEngine/RHI/D3D12/D3D12Screenshot.h src/RHI/D3D12Device.cpp src/RHI/D3D12CommandQueue.cpp src/RHI/D3D12CommandAllocator.cpp src/RHI/D3D12CommandList.cpp + src/RHI/D3D12DescriptorHeap.cpp src/RHI/D3D12Fence.cpp src/RHI/D3D12Screenshot.cpp ) diff --git a/engine/include/XCEngine/RHI/D3D12/D3D12DescriptorHeap.h b/engine/include/XCEngine/RHI/D3D12/D3D12DescriptorHeap.h new file mode 100644 index 00000000..b0e467f9 --- /dev/null +++ b/engine/include/XCEngine/RHI/D3D12/D3D12DescriptorHeap.h @@ -0,0 +1,43 @@ +#pragma once + +#include +#include + +#include "../Enums.h" +#include "D3D12Enum.h" + +using Microsoft::WRL::ComPtr; + +namespace XCEngine { +namespace RHI { + +class D3D12DescriptorHeap { +public: + D3D12DescriptorHeap(); + ~D3D12DescriptorHeap(); + + bool Initialize(ID3D12Device* device, DescriptorHeapType type, uint32_t numDescriptors, bool shaderVisible = false); + void Shutdown(); + + ID3D12DescriptorHeap* GetDescriptorHeap() const { return m_descriptorHeap.Get(); } + + D3D12_CPU_DESCRIPTOR_HANDLE GetCPUDescriptorHandle(uint32_t index) const; + D3D12_GPU_DESCRIPTOR_HANDLE GetGPUDescriptorHandle(uint32_t index) const; + + uint32_t GetDescriptorCount() const { return m_numDescriptors; } + DescriptorHeapType GetType() const { return m_type; } + uint32_t GetDescriptorSize() const { return m_descriptorSize; } + + D3D12_CPU_DESCRIPTOR_HANDLE GetCPUDescriptorHandleForHeapStart() const; + D3D12_GPU_DESCRIPTOR_HANDLE GetGPUDescriptorHandleForHeapStart() const; + +private: + ComPtr m_descriptorHeap; + DescriptorHeapType m_type; + uint32_t m_numDescriptors; + uint32_t m_descriptorSize; + bool m_shaderVisible; +}; + +} // namespace RHI +} // namespace XCEngine diff --git a/engine/src/RHI/D3D12DescriptorHeap.cpp b/engine/src/RHI/D3D12DescriptorHeap.cpp new file mode 100644 index 00000000..de4d1e57 --- /dev/null +++ b/engine/src/RHI/D3D12DescriptorHeap.cpp @@ -0,0 +1,62 @@ +#include "XCEngine/RHI/D3D12/D3D12DescriptorHeap.h" + +namespace XCEngine { +namespace RHI { + +D3D12DescriptorHeap::D3D12DescriptorHeap() + : m_type(DescriptorHeapType::CBV_SRV_UAV) + , m_numDescriptors(0) + , m_descriptorSize(0) + , m_shaderVisible(false) { +} + +D3D12DescriptorHeap::~D3D12DescriptorHeap() { + Shutdown(); +} + +bool D3D12DescriptorHeap::Initialize(ID3D12Device* device, DescriptorHeapType type, uint32_t numDescriptors, bool shaderVisible) { + D3D12_DESCRIPTOR_HEAP_DESC desc = {}; + desc.Type = ToD3D12(type); + desc.NumDescriptors = numDescriptors; + desc.Flags = shaderVisible ? D3D12_DESCRIPTOR_HEAP_FLAG_SHADER_VISIBLE : D3D12_DESCRIPTOR_HEAP_FLAG_NONE; + desc.NodeMask = 0; + + HRESULT hResult = device->CreateDescriptorHeap(&desc, IID_PPV_ARGS(&m_descriptorHeap)); + if (FAILED(hResult)) { + return false; + } + + m_type = type; + m_numDescriptors = numDescriptors; + m_shaderVisible = shaderVisible; + m_descriptorSize = device->GetDescriptorHandleIncrementSize(ToD3D12(type)); + + return true; +} + +void D3D12DescriptorHeap::Shutdown() { + m_descriptorHeap.Reset(); +} + +D3D12_CPU_DESCRIPTOR_HANDLE D3D12DescriptorHeap::GetCPUDescriptorHandle(uint32_t index) const { + D3D12_CPU_DESCRIPTOR_HANDLE handle = m_descriptorHeap->GetCPUDescriptorHandleForHeapStart(); + handle.ptr += index * m_descriptorSize; + return handle; +} + +D3D12_GPU_DESCRIPTOR_HANDLE D3D12DescriptorHeap::GetGPUDescriptorHandle(uint32_t index) const { + D3D12_GPU_DESCRIPTOR_HANDLE handle = m_descriptorHeap->GetGPUDescriptorHandleForHeapStart(); + handle.ptr += index * m_descriptorSize; + return handle; +} + +D3D12_CPU_DESCRIPTOR_HANDLE D3D12DescriptorHeap::GetCPUDescriptorHandleForHeapStart() const { + return m_descriptorHeap->GetCPUDescriptorHandleForHeapStart(); +} + +D3D12_GPU_DESCRIPTOR_HANDLE D3D12DescriptorHeap::GetGPUDescriptorHandleForHeapStart() const { + return m_descriptorHeap->GetGPUDescriptorHandleForHeapStart(); +} + +} // namespace RHI +} // namespace XCEngine