From 017bbf281d9a9722690a0c690f141a597a1f85f9 Mon Sep 17 00:00:00 2001 From: ssdfasd <2156608475@qq.com> Date: Sun, 15 Mar 2026 18:45:11 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=AE=9E=E7=8E=B0=20D3D12Texture=20?= =?UTF-8?q?=E5=92=8C=20D3D12Buffer=20=E8=B5=84=E6=BA=90=E7=B1=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 添加 D3D12Texture.h/cpp - 纹理资源封装 - 添加 D3D12Buffer.h/cpp - 缓冲区资源封装 - 支持 CreateCommittedResource 创建资源 - 测试通过 --- engine/CMakeLists.txt | 4 ++ .../include/XCEngine/RHI/D3D12/D3D12Buffer.h | 33 ++++++++++ .../include/XCEngine/RHI/D3D12/D3D12Texture.h | 36 +++++++++++ engine/src/RHI/D3D12Buffer.cpp | 60 +++++++++++++++++++ engine/src/RHI/D3D12Texture.cpp | 49 +++++++++++++++ 5 files changed, 182 insertions(+) create mode 100644 engine/include/XCEngine/RHI/D3D12/D3D12Buffer.h create mode 100644 engine/include/XCEngine/RHI/D3D12/D3D12Texture.h create mode 100644 engine/src/RHI/D3D12Buffer.cpp create mode 100644 engine/src/RHI/D3D12Texture.cpp 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