From 2bdd6d319913191faef7a28963f3424389f7d18a Mon Sep 17 00:00:00 2001 From: ssdfasd <2156608475@qq.com> Date: Sun, 15 Mar 2026 18:36:11 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=AE=9E=E7=8E=B0=20D3D12RootSignature?= =?UTF-8?q?=20=E6=A0=B9=E7=AD=BE=E5=90=8D=E7=B1=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 添加 D3D12RootSignature.h 头文件 - 实现 ID3D12RootSignature 封装 - 支持序列化根签名描述符 - 测试通过 --- engine/CMakeLists.txt | 2 + .../XCEngine/RHI/D3D12/D3D12RootSignature.h | 29 +++++++++++++ engine/src/RHI/D3D12RootSignature.cpp | 41 +++++++++++++++++++ 3 files changed, 72 insertions(+) create mode 100644 engine/include/XCEngine/RHI/D3D12/D3D12RootSignature.h create mode 100644 engine/src/RHI/D3D12RootSignature.cpp diff --git a/engine/CMakeLists.txt b/engine/CMakeLists.txt index 64b641d7..9f0a8c73 100644 --- a/engine/CMakeLists.txt +++ b/engine/CMakeLists.txt @@ -89,6 +89,7 @@ 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/D3D12RootSignature.h include/XCEngine/RHI/D3D12/D3D12SwapChain.h include/XCEngine/RHI/D3D12/D3D12Fence.h include/XCEngine/RHI/D3D12/D3D12Screenshot.h @@ -97,6 +98,7 @@ add_library(XCEngine STATIC src/RHI/D3D12CommandAllocator.cpp src/RHI/D3D12CommandList.cpp src/RHI/D3D12DescriptorHeap.cpp + src/RHI/D3D12RootSignature.cpp src/RHI/D3D12SwapChain.cpp src/RHI/D3D12Fence.cpp src/RHI/D3D12Screenshot.cpp diff --git a/engine/include/XCEngine/RHI/D3D12/D3D12RootSignature.h b/engine/include/XCEngine/RHI/D3D12/D3D12RootSignature.h new file mode 100644 index 00000000..a6b4c595 --- /dev/null +++ b/engine/include/XCEngine/RHI/D3D12/D3D12RootSignature.h @@ -0,0 +1,29 @@ +#pragma once + +#include +#include + +#include "../Enums.h" +#include "D3D12Enum.h" + +using Microsoft::WRL::ComPtr; + +namespace XCEngine { +namespace RHI { + +class D3D12RootSignature { +public: + D3D12RootSignature(); + ~D3D12RootSignature(); + + bool Initialize(ID3D12Device* device, const D3D12_ROOT_SIGNATURE_DESC& desc); + void Shutdown(); + + ID3D12RootSignature* GetRootSignature() const { return m_rootSignature.Get(); } + +private: + ComPtr m_rootSignature; +}; + +} // namespace RHI +} // namespace XCEngine diff --git a/engine/src/RHI/D3D12RootSignature.cpp b/engine/src/RHI/D3D12RootSignature.cpp new file mode 100644 index 00000000..92d304b6 --- /dev/null +++ b/engine/src/RHI/D3D12RootSignature.cpp @@ -0,0 +1,41 @@ +#include "XCEngine/RHI/D3D12/D3D12RootSignature.h" + +namespace XCEngine { +namespace RHI { + +D3D12RootSignature::D3D12RootSignature() { +} + +D3D12RootSignature::~D3D12RootSignature() { + Shutdown(); +} + +bool D3D12RootSignature::Initialize(ID3D12Device* device, const D3D12_ROOT_SIGNATURE_DESC& desc) { + ID3DBlob* signature = nullptr; + ID3DBlob* error = nullptr; + + HRESULT hResult = D3D12SerializeRootSignature(&desc, D3D_ROOT_SIGNATURE_VERSION_1, &signature, &error); + if (FAILED(hResult)) { + if (error) { + error->Release(); + } + return false; + } + + hResult = device->CreateRootSignature(0, signature->GetBufferPointer(), signature->GetBufferSize(), IID_PPV_ARGS(&m_rootSignature)); + + signature->Release(); + + if (FAILED(hResult)) { + return false; + } + + return true; +} + +void D3D12RootSignature::Shutdown() { + m_rootSignature.Reset(); +} + +} // namespace RHI +} // namespace XCEngine