From 2a8f50134cab6100710020b5688c0863fde41157 Mon Sep 17 00:00:00 2001 From: ssdfasd <2156608475@qq.com> Date: Sun, 15 Mar 2026 18:41:27 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=AE=9E=E7=8E=B0=20D3D12PipelineState?= =?UTF-8?q?=20=E5=B9=B6=E6=9B=BF=E6=8D=A2=E5=88=B0=20tests/D3D12?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 添加 D3D12PipelineState.h/cpp - 全局变量 gPipelineState - 使用 D3D12PipelineState::Initialize 替代原生 CreateGraphicsPipelineState - 测试通过 --- engine/CMakeLists.txt | 2 ++ .../XCEngine/RHI/D3D12/D3D12PipelineState.h | 28 +++++++++++++++++++ engine/src/RHI/D3D12PipelineState.cpp | 26 +++++++++++++++++ tests/D3D12/main.cpp | 8 ++++-- 4 files changed, 61 insertions(+), 3 deletions(-) create mode 100644 engine/include/XCEngine/RHI/D3D12/D3D12PipelineState.h create mode 100644 engine/src/RHI/D3D12PipelineState.cpp diff --git a/engine/CMakeLists.txt b/engine/CMakeLists.txt index 9f0a8c73..d640fef4 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/D3D12PipelineState.h include/XCEngine/RHI/D3D12/D3D12RootSignature.h include/XCEngine/RHI/D3D12/D3D12SwapChain.h include/XCEngine/RHI/D3D12/D3D12Fence.h @@ -98,6 +99,7 @@ add_library(XCEngine STATIC src/RHI/D3D12CommandAllocator.cpp src/RHI/D3D12CommandList.cpp src/RHI/D3D12DescriptorHeap.cpp + src/RHI/D3D12PipelineState.cpp src/RHI/D3D12RootSignature.cpp src/RHI/D3D12SwapChain.cpp src/RHI/D3D12Fence.cpp diff --git a/engine/include/XCEngine/RHI/D3D12/D3D12PipelineState.h b/engine/include/XCEngine/RHI/D3D12/D3D12PipelineState.h new file mode 100644 index 00000000..dc9aa3b1 --- /dev/null +++ b/engine/include/XCEngine/RHI/D3D12/D3D12PipelineState.h @@ -0,0 +1,28 @@ +#pragma once + +#include +#include + +#include "D3D12Enum.h" + +using Microsoft::WRL::ComPtr; + +namespace XCEngine { +namespace RHI { + +class D3D12PipelineState { +public: + D3D12PipelineState(); + ~D3D12PipelineState(); + + bool Initialize(ID3D12Device* device, const D3D12_GRAPHICS_PIPELINE_STATE_DESC& desc); + void Shutdown(); + + ID3D12PipelineState* GetPipelineState() const { return m_pipelineState.Get(); } + +private: + ComPtr m_pipelineState; +}; + +} // namespace RHI +} // namespace XCEngine diff --git a/engine/src/RHI/D3D12PipelineState.cpp b/engine/src/RHI/D3D12PipelineState.cpp new file mode 100644 index 00000000..e5920e7a --- /dev/null +++ b/engine/src/RHI/D3D12PipelineState.cpp @@ -0,0 +1,26 @@ +#include "XCEngine/RHI/D3D12/D3D12PipelineState.h" + +namespace XCEngine { +namespace RHI { + +D3D12PipelineState::D3D12PipelineState() { +} + +D3D12PipelineState::~D3D12PipelineState() { + Shutdown(); +} + +bool D3D12PipelineState::Initialize(ID3D12Device* device, const D3D12_GRAPHICS_PIPELINE_STATE_DESC& desc) { + HRESULT hResult = device->CreateGraphicsPipelineState(&desc, IID_PPV_ARGS(&m_pipelineState)); + if (FAILED(hResult)) { + return false; + } + return true; +} + +void D3D12PipelineState::Shutdown() { + m_pipelineState.Reset(); +} + +} // namespace RHI +} // namespace XCEngine diff --git a/tests/D3D12/main.cpp b/tests/D3D12/main.cpp index 3a931a64..be8c95a9 100644 --- a/tests/D3D12/main.cpp +++ b/tests/D3D12/main.cpp @@ -22,6 +22,7 @@ #include "XCEngine/RHI/D3D12/D3D12Fence.h" #include "XCEngine/RHI/D3D12/D3D12SwapChain.h" #include "XCEngine/RHI/D3D12/D3D12RootSignature.h" +#include "XCEngine/RHI/D3D12/D3D12PipelineState.h" #include "XCEngine/RHI/D3D12/D3D12Screenshot.h" #include "XCEngine/Debug/Logger.h" #include "XCEngine/Debug/ConsoleLogSink.h" @@ -67,6 +68,7 @@ UINT gDSVDescriptorSize = 0; XCEngine::RHI::D3D12CommandAllocator gCommandAllocator; XCEngine::RHI::D3D12CommandList gCommandList; XCEngine::RHI::D3D12RootSignature gRootSignature; +XCEngine::RHI::D3D12PipelineState gPipelineState; // 同步对象 XCEngine::RHI::D3D12Fence gFence; @@ -556,11 +558,11 @@ ID3D12PipelineState* CreatePSO(ID3D12RootSignature* inID3D12RootSignature, psoDesc.NumRenderTargets = 1; ID3D12PipelineState* d3d12PSO = nullptr; - HRESULT hResult = gDevice.GetDevice()->CreateGraphicsPipelineState(&psoDesc, IID_PPV_ARGS(&d3d12PSO)); - if (FAILED(hResult)) { + gPipelineState.Initialize(gDevice.GetDevice(), psoDesc); + if (!gPipelineState.GetPipelineState()) { return nullptr; } - return d3d12PSO; + return gPipelineState.GetPipelineState(); } //=================================================================================