diff --git a/engine/CMakeLists.txt b/engine/CMakeLists.txt index d640fef4..b5c5ae26 100644 --- a/engine/CMakeLists.txt +++ b/engine/CMakeLists.txt @@ -89,7 +89,9 @@ add_library(XCEngine STATIC include/XCEngine/RHI/D3D12/D3D12CommandAllocator.h include/XCEngine/RHI/D3D12/D3D12CommandList.h include/XCEngine/RHI/D3D12/D3D12DescriptorHeap.h + include/XCEngine/RHI/D3D12/D3D12Buffer.h include/XCEngine/RHI/D3D12/D3D12PipelineState.h + include/XCEngine/RHI/D3D12/D3D12Texture.h include/XCEngine/RHI/D3D12/D3D12RootSignature.h include/XCEngine/RHI/D3D12/D3D12SwapChain.h include/XCEngine/RHI/D3D12/D3D12Fence.h @@ -99,7 +101,9 @@ add_library(XCEngine STATIC src/RHI/D3D12CommandAllocator.cpp src/RHI/D3D12CommandList.cpp src/RHI/D3D12DescriptorHeap.cpp + src/RHI/D3D12Buffer.cpp src/RHI/D3D12PipelineState.cpp + src/RHI/D3D12Texture.cpp src/RHI/D3D12RootSignature.cpp src/RHI/D3D12SwapChain.cpp src/RHI/D3D12Fence.cpp diff --git a/engine/include/XCEngine/RHI/D3D12/D3D12Buffer.h b/engine/include/XCEngine/RHI/D3D12/D3D12Buffer.h new file mode 100644 index 00000000..8de9c5d1 --- /dev/null +++ b/engine/include/XCEngine/RHI/D3D12/D3D12Buffer.h @@ -0,0 +1,33 @@ +#pragma once + +#include +#include + +#include "D3D12Enum.h" + +using Microsoft::WRL::ComPtr; + +namespace XCEngine { +namespace RHI { + +class D3D12Buffer { +public: + D3D12Buffer(); + ~D3D12Buffer(); + + bool Initialize(ID3D12Device* device, uint64_t size, D3D12_RESOURCE_STATES initialState = D3D12_RESOURCE_STATE_COMMON); + bool InitializeFromExisting(ID3D12Resource* resource); + void Shutdown(); + + ID3D12Resource* GetResource() const { return m_resource.Get(); } + D3D12_RESOURCE_DESC GetDesc() const { return m_resource->GetDesc(); } + + uint64_t GetSize() const { return GetDesc().Width; } + D3D12_GPU_VIRTUAL_ADDRESS GetGPUVirtualAddress() const { return m_resource->GetGPUVirtualAddress(); } + +private: + ComPtr m_resource; +}; + +} // namespace RHI +} // namespace XCEngine diff --git a/engine/include/XCEngine/RHI/D3D12/D3D12Texture.h b/engine/include/XCEngine/RHI/D3D12/D3D12Texture.h new file mode 100644 index 00000000..dfba0e07 --- /dev/null +++ b/engine/include/XCEngine/RHI/D3D12/D3D12Texture.h @@ -0,0 +1,36 @@ +#pragma once + +#include +#include + +#include "D3D12Enum.h" + +using Microsoft::WRL::ComPtr; + +namespace XCEngine { +namespace RHI { + +class D3D12Texture { +public: + D3D12Texture(); + ~D3D12Texture(); + + bool Initialize(ID3D12Device* device, const D3D12_RESOURCE_DESC& desc, D3D12_RESOURCE_STATES initialState = D3D12_RESOURCE_STATE_COMMON); + bool InitializeFromExisting(ID3D12Resource* resource); + void Shutdown(); + + ID3D12Resource* GetResource() const { return m_resource.Get(); } + D3D12_RESOURCE_DESC GetDesc() const { return m_resource->GetDesc(); } + + uint32_t GetWidth() const { return static_cast(GetDesc().Width); } + uint32_t GetHeight() const { return GetDesc().Height; } + uint32_t GetDepth() const { return GetDesc().DepthOrArraySize; } + uint32_t GetMipLevels() const { return GetDesc().MipLevels; } + DXGI_FORMAT GetFormat() const { return GetDesc().Format; } + +private: + ComPtr m_resource; +}; + +} // namespace RHI +} // namespace XCEngine diff --git a/engine/src/RHI/D3D12Buffer.cpp b/engine/src/RHI/D3D12Buffer.cpp new file mode 100644 index 00000000..54c1438c --- /dev/null +++ b/engine/src/RHI/D3D12Buffer.cpp @@ -0,0 +1,60 @@ +#include "XCEngine/RHI/D3D12/D3D12Buffer.h" + +namespace XCEngine { +namespace RHI { + +D3D12Buffer::D3D12Buffer() { +} + +D3D12Buffer::~D3D12Buffer() { + Shutdown(); +} + +bool D3D12Buffer::Initialize(ID3D12Device* device, uint64_t size, D3D12_RESOURCE_STATES initialState) { + D3D12_HEAP_PROPERTIES heapProperties = {}; + heapProperties.Type = D3D12_HEAP_TYPE_DEFAULT; + heapProperties.CPUPageProperty = D3D12_CPU_PAGE_PROPERTY_UNKNOWN; + heapProperties.MemoryPoolPreference = D3D12_MEMORY_POOL_UNKNOWN; + heapProperties.CreationNodeMask = 0; + heapProperties.VisibleNodeMask = 0; + + D3D12_RESOURCE_DESC bufferDesc = {}; + bufferDesc.Dimension = D3D12_RESOURCE_DIMENSION_BUFFER; + bufferDesc.Alignment = 0; + bufferDesc.Width = size; + bufferDesc.Height = 1; + bufferDesc.DepthOrArraySize = 1; + bufferDesc.MipLevels = 1; + bufferDesc.Format = DXGI_FORMAT_UNKNOWN; + bufferDesc.SampleDesc.Count = 1; + bufferDesc.SampleDesc.Quality = 0; + bufferDesc.Layout = D3D12_TEXTURE_LAYOUT_ROW_MAJOR; + bufferDesc.Flags = D3D12_RESOURCE_FLAG_NONE; + + HRESULT hResult = device->CreateCommittedResource( + &heapProperties, + D3D12_HEAP_FLAG_NONE, + &bufferDesc, + initialState, + nullptr, + IID_PPV_ARGS(&m_resource) + ); + + if (FAILED(hResult)) { + return false; + } + + return true; +} + +bool D3D12Buffer::InitializeFromExisting(ID3D12Resource* resource) { + m_resource = resource; + return true; +} + +void D3D12Buffer::Shutdown() { + m_resource.Reset(); +} + +} // namespace RHI +} // namespace XCEngine diff --git a/engine/src/RHI/D3D12Texture.cpp b/engine/src/RHI/D3D12Texture.cpp new file mode 100644 index 00000000..45cc03b5 --- /dev/null +++ b/engine/src/RHI/D3D12Texture.cpp @@ -0,0 +1,49 @@ +#include "XCEngine/RHI/D3D12/D3D12Texture.h" + +namespace XCEngine { +namespace RHI { + +D3D12Texture::D3D12Texture() { +} + +D3D12Texture::~D3D12Texture() { + Shutdown(); +} + +bool D3D12Texture::Initialize(ID3D12Device* device, const D3D12_RESOURCE_DESC& desc, D3D12_RESOURCE_STATES initialState) { + D3D12_HEAP_PROPERTIES heapProperties = {}; + heapProperties.Type = D3D12_HEAP_TYPE_DEFAULT; + heapProperties.CPUPageProperty = D3D12_CPU_PAGE_PROPERTY_UNKNOWN; + heapProperties.MemoryPoolPreference = D3D12_MEMORY_POOL_UNKNOWN; + heapProperties.CreationNodeMask = 0; + heapProperties.VisibleNodeMask = 0; + + D3D12_CLEAR_VALUE* pOptimizedClearValue = nullptr; + + HRESULT hResult = device->CreateCommittedResource( + &heapProperties, + D3D12_HEAP_FLAG_NONE, + &desc, + initialState, + pOptimizedClearValue, + IID_PPV_ARGS(&m_resource) + ); + + if (FAILED(hResult)) { + return false; + } + + return true; +} + +bool D3D12Texture::InitializeFromExisting(ID3D12Resource* resource) { + m_resource = resource; + return true; +} + +void D3D12Texture::Shutdown() { + m_resource.Reset(); +} + +} // namespace RHI +} // namespace XCEngine