From 632cba821d7ea22ce31f6a65325d037afca22339 Mon Sep 17 00:00:00 2001 From: ssdfasd <2156608475@qq.com> Date: Sun, 15 Mar 2026 19:48:20 +0800 Subject: [PATCH] Replace RTV/DSV/SRV creation with wrapper classes --- .../XCEngine/RHI/D3D12/D3D12DepthStencilView.h | 1 + .../XCEngine/RHI/D3D12/D3D12RenderTargetView.h | 1 + .../XCEngine/RHI/D3D12/D3D12ShaderResourceView.h | 1 + engine/src/RHI/D3D12DepthStencilView.cpp | 6 ++++++ engine/src/RHI/D3D12RenderTargetView.cpp | 6 ++++++ engine/src/RHI/D3D12ShaderResourceView.cpp | 6 ++++++ tests/D3D12/main.cpp | 12 +++++++++--- 7 files changed, 30 insertions(+), 3 deletions(-) diff --git a/engine/include/XCEngine/RHI/D3D12/D3D12DepthStencilView.h b/engine/include/XCEngine/RHI/D3D12/D3D12DepthStencilView.h index 6e365e8f..0483cb31 100644 --- a/engine/include/XCEngine/RHI/D3D12/D3D12DepthStencilView.h +++ b/engine/include/XCEngine/RHI/D3D12/D3D12DepthStencilView.h @@ -14,6 +14,7 @@ public: ~D3D12DepthStencilView(); void Initialize(ID3D12Device* device, ID3D12Resource* resource, const D3D12_DEPTH_STENCIL_VIEW_DESC* desc = nullptr); + void InitializeAt(ID3D12Device* device, ID3D12Resource* resource, D3D12_CPU_DESCRIPTOR_HANDLE handle, const D3D12_DEPTH_STENCIL_VIEW_DESC* desc = nullptr); void Shutdown(); D3D12_CPU_DESCRIPTOR_HANDLE GetCPUDescriptorHandle() const { return m_handle; } diff --git a/engine/include/XCEngine/RHI/D3D12/D3D12RenderTargetView.h b/engine/include/XCEngine/RHI/D3D12/D3D12RenderTargetView.h index 07b6587a..eac56e7b 100644 --- a/engine/include/XCEngine/RHI/D3D12/D3D12RenderTargetView.h +++ b/engine/include/XCEngine/RHI/D3D12/D3D12RenderTargetView.h @@ -14,6 +14,7 @@ public: ~D3D12RenderTargetView(); void Initialize(ID3D12Device* device, ID3D12Resource* resource, const D3D12_RENDER_TARGET_VIEW_DESC* desc = nullptr); + void InitializeAt(ID3D12Device* device, ID3D12Resource* resource, D3D12_CPU_DESCRIPTOR_HANDLE handle, const D3D12_RENDER_TARGET_VIEW_DESC* desc = nullptr); void Shutdown(); D3D12_CPU_DESCRIPTOR_HANDLE GetCPUDescriptorHandle() const { return m_handle; } diff --git a/engine/include/XCEngine/RHI/D3D12/D3D12ShaderResourceView.h b/engine/include/XCEngine/RHI/D3D12/D3D12ShaderResourceView.h index 5720d8b7..a3262b8f 100644 --- a/engine/include/XCEngine/RHI/D3D12/D3D12ShaderResourceView.h +++ b/engine/include/XCEngine/RHI/D3D12/D3D12ShaderResourceView.h @@ -14,6 +14,7 @@ public: ~D3D12ShaderResourceView(); void Initialize(ID3D12Device* device, ID3D12Resource* resource, const D3D12_SHADER_RESOURCE_VIEW_DESC* desc = nullptr); + void InitializeAt(ID3D12Device* device, ID3D12Resource* resource, D3D12_CPU_DESCRIPTOR_HANDLE handle, const D3D12_SHADER_RESOURCE_VIEW_DESC* desc = nullptr); void Shutdown(); D3D12_CPU_DESCRIPTOR_HANDLE GetCPUDescriptorHandle() const { return m_handle; } diff --git a/engine/src/RHI/D3D12DepthStencilView.cpp b/engine/src/RHI/D3D12DepthStencilView.cpp index ab3e8bf6..63fb8b06 100644 --- a/engine/src/RHI/D3D12DepthStencilView.cpp +++ b/engine/src/RHI/D3D12DepthStencilView.cpp @@ -18,6 +18,12 @@ void D3D12DepthStencilView::Initialize(ID3D12Device* device, ID3D12Resource* res device->CreateDepthStencilView(resource, desc, m_handle); } +void D3D12DepthStencilView::InitializeAt(ID3D12Device* device, ID3D12Resource* resource, D3D12_CPU_DESCRIPTOR_HANDLE handle, const D3D12_DEPTH_STENCIL_VIEW_DESC* desc) { + m_resource = resource; + m_handle = handle; + device->CreateDepthStencilView(resource, desc, m_handle); +} + void D3D12DepthStencilView::Shutdown() { m_handle = {}; m_resource = nullptr; diff --git a/engine/src/RHI/D3D12RenderTargetView.cpp b/engine/src/RHI/D3D12RenderTargetView.cpp index 797d39b3..6184083b 100644 --- a/engine/src/RHI/D3D12RenderTargetView.cpp +++ b/engine/src/RHI/D3D12RenderTargetView.cpp @@ -18,6 +18,12 @@ void D3D12RenderTargetView::Initialize(ID3D12Device* device, ID3D12Resource* res device->CreateRenderTargetView(resource, desc, m_handle); } +void D3D12RenderTargetView::InitializeAt(ID3D12Device* device, ID3D12Resource* resource, D3D12_CPU_DESCRIPTOR_HANDLE handle, const D3D12_RENDER_TARGET_VIEW_DESC* desc) { + m_resource = resource; + m_handle = handle; + device->CreateRenderTargetView(resource, desc, m_handle); +} + void D3D12RenderTargetView::Shutdown() { m_handle = {}; m_resource = nullptr; diff --git a/engine/src/RHI/D3D12ShaderResourceView.cpp b/engine/src/RHI/D3D12ShaderResourceView.cpp index fa90fb87..8ca3a725 100644 --- a/engine/src/RHI/D3D12ShaderResourceView.cpp +++ b/engine/src/RHI/D3D12ShaderResourceView.cpp @@ -18,6 +18,12 @@ void D3D12ShaderResourceView::Initialize(ID3D12Device* device, ID3D12Resource* r device->CreateShaderResourceView(resource, desc, m_handle); } +void D3D12ShaderResourceView::InitializeAt(ID3D12Device* device, ID3D12Resource* resource, D3D12_CPU_DESCRIPTOR_HANDLE handle, const D3D12_SHADER_RESOURCE_VIEW_DESC* desc) { + m_resource = resource; + m_handle = handle; + device->CreateShaderResourceView(resource, desc, m_handle); +} + void D3D12ShaderResourceView::Shutdown() { m_handle = {}; m_resource = nullptr; diff --git a/tests/D3D12/main.cpp b/tests/D3D12/main.cpp index eb71107c..085c0399 100644 --- a/tests/D3D12/main.cpp +++ b/tests/D3D12/main.cpp @@ -25,6 +25,9 @@ #include "XCEngine/RHI/D3D12/D3D12PipelineState.h" #include "XCEngine/RHI/D3D12/D3D12Buffer.h" #include "XCEngine/RHI/D3D12/D3D12Texture.h" +#include "XCEngine/RHI/D3D12/D3D12RenderTargetView.h" +#include "XCEngine/RHI/D3D12/D3D12DepthStencilView.h" +#include "XCEngine/RHI/D3D12/D3D12ShaderResourceView.h" #include "XCEngine/RHI/D3D12/D3D12Screenshot.h" #include "XCEngine/Debug/Logger.h" #include "XCEngine/Debug/ConsoleLogSink.h" @@ -63,6 +66,8 @@ int gCurrentRTIndex = 0; // 描述符堆 XCEngine::RHI::D3D12DescriptorHeap gSwapChainRTVHeap; // RTV堆 XCEngine::RHI::D3D12DescriptorHeap gSwapChainDSVHeap; // DSV堆 +XCEngine::RHI::D3D12RenderTargetView gSwapChainRTVs[2]; +XCEngine::RHI::D3D12DepthStencilView gSwapChainDSV; UINT gRTVDescriptorSize = 0; UINT gDSVDescriptorSize = 0; @@ -79,6 +84,7 @@ XCEngine::RHI::D3D12Shader gPixelShader; XCEngine::RHI::D3D12Buffer gConstantBuffer; // matrices XCEngine::RHI::D3D12Buffer gMaterialBuffer; // material data XCEngine::RHI::D3D12Texture gTexture; // earth texture +XCEngine::RHI::D3D12ShaderResourceView gTextureSRV; // texture SRV // 同步对象 XCEngine::RHI::D3D12Fence gFence; @@ -528,13 +534,13 @@ bool InitD3D12(HWND inHWND, int inWidth, int inHeight) { gColorRTs[i] = buffer; D3D12_CPU_DESCRIPTOR_HANDLE rtvPointer; rtvPointer.ptr = rtvHeapStart.ptr + i * gRTVDescriptorSize; - device->CreateRenderTargetView(gColorRTs[i], nullptr, rtvPointer); + gSwapChainRTVs[i].InitializeAt(device, gColorRTs[i], rtvPointer, nullptr); } D3D12_DEPTH_STENCIL_VIEW_DESC d3dDSViewDesc = {}; d3dDSViewDesc.Format = DXGI_FORMAT_D24_UNORM_S8_UINT; d3dDSViewDesc.ViewDimension = D3D12_DSV_DIMENSION_TEXTURE2D; - device->CreateDepthStencilView(gDSRT, &d3dDSViewDesc, gSwapChainDSVHeap.GetCPUDescriptorHandleForHeapStart()); + gSwapChainDSV.InitializeAt(device, gDSRT, gSwapChainDSVHeap.GetCPUDescriptorHandleForHeapStart(), &d3dDSViewDesc); gCommandAllocator.Initialize(device, XCEngine::RHI::CommandQueueType::Direct); gCommandList.Initialize(device, XCEngine::RHI::CommandQueueType::Direct, gCommandAllocator.GetCommandAllocator()); @@ -760,7 +766,7 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine srvDesc.Texture2D.MipLevels = 1; D3D12_CPU_DESCRIPTOR_HANDLE srvHeapPtr = srvHeap.GetCPUDescriptorHandleForHeapStart(); - d3dDevice->CreateShaderResourceView(texture, &srvDesc, srvHeapPtr); + gTextureSRV.InitializeAt(d3dDevice, texture, srvHeapPtr, &srvDesc); srvHeapPtr.ptr += d3dDevice->GetDescriptorHandleIncrementSize(D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV); EndCommandList();