From 3959f749081b0e66a3748838858a5625babf2b8c Mon Sep 17 00:00:00 2001 From: ssdfasd <2156608475@qq.com> Date: Sun, 15 Mar 2026 19:30:19 +0800 Subject: [PATCH] Add D3D12QueryHeap and D3D12UnorderedAccessView --- engine/CMakeLists.txt | 4 ++ .../XCEngine/RHI/D3D12/D3D12QueryHeap.h | 33 ++++++++++++ .../RHI/D3D12/D3D12UnorderedAccessView.h | 27 ++++++++++ engine/src/RHI/D3D12QueryHeap.cpp | 50 +++++++++++++++++++ engine/src/RHI/D3D12UnorderedAccessView.cpp | 27 ++++++++++ 5 files changed, 141 insertions(+) create mode 100644 engine/include/XCEngine/RHI/D3D12/D3D12QueryHeap.h create mode 100644 engine/include/XCEngine/RHI/D3D12/D3D12UnorderedAccessView.h create mode 100644 engine/src/RHI/D3D12QueryHeap.cpp create mode 100644 engine/src/RHI/D3D12UnorderedAccessView.cpp diff --git a/engine/CMakeLists.txt b/engine/CMakeLists.txt index 44822c7c..d0384fd4 100644 --- a/engine/CMakeLists.txt +++ b/engine/CMakeLists.txt @@ -102,6 +102,8 @@ add_library(XCEngine STATIC include/XCEngine/RHI/D3D12/D3D12DepthStencilView.h include/XCEngine/RHI/D3D12/D3D12ShaderResourceView.h include/XCEngine/RHI/D3D12/D3D12ConstantBufferView.h + include/XCEngine/RHI/D3D12/D3D12QueryHeap.h + include/XCEngine/RHI/D3D12/D3D12UnorderedAccessView.h src/RHI/D3D12Device.cpp src/RHI/D3D12CommandQueue.cpp src/RHI/D3D12CommandAllocator.cpp @@ -120,6 +122,8 @@ add_library(XCEngine STATIC src/RHI/D3D12DepthStencilView.cpp src/RHI/D3D12ShaderResourceView.cpp src/RHI/D3D12ConstantBufferView.cpp + src/RHI/D3D12QueryHeap.cpp + src/RHI/D3D12UnorderedAccessView.cpp ) target_include_directories(XCEngine PUBLIC diff --git a/engine/include/XCEngine/RHI/D3D12/D3D12QueryHeap.h b/engine/include/XCEngine/RHI/D3D12/D3D12QueryHeap.h new file mode 100644 index 00000000..6634c460 --- /dev/null +++ b/engine/include/XCEngine/RHI/D3D12/D3D12QueryHeap.h @@ -0,0 +1,33 @@ +#pragma once + +#include +#include +#include + +#include "D3D12Enum.h" + +using Microsoft::WRL::ComPtr; + +namespace XCEngine { +namespace RHI { + +class D3D12QueryHeap { +public: + D3D12QueryHeap(); + ~D3D12QueryHeap(); + + bool Initialize(ID3D12Device* device, QueryType type, uint32_t count); + void Shutdown(); + + ID3D12QueryHeap* GetQueryHeap() const { return m_queryHeap.Get(); } + QueryType GetType() const { return m_type; } + uint32_t GetCount() const { return m_count; } + +private: + ComPtr m_queryHeap; + QueryType m_type; + uint32_t m_count; +}; + +} // namespace RHI +} // namespace XCEngine diff --git a/engine/include/XCEngine/RHI/D3D12/D3D12UnorderedAccessView.h b/engine/include/XCEngine/RHI/D3D12/D3D12UnorderedAccessView.h new file mode 100644 index 00000000..475e7677 --- /dev/null +++ b/engine/include/XCEngine/RHI/D3D12/D3D12UnorderedAccessView.h @@ -0,0 +1,27 @@ +#pragma once + +#include +#include + +using Microsoft::WRL::ComPtr; + +namespace XCEngine { +namespace RHI { + +class D3D12UnorderedAccessView { +public: + D3D12UnorderedAccessView(); + ~D3D12UnorderedAccessView(); + + void Initialize(ID3D12Device* device, ID3D12Resource* resource, const D3D12_UNORDERED_ACCESS_VIEW_DESC* desc = nullptr); + void Shutdown(); + + D3D12_CPU_DESCRIPTOR_HANDLE GetCPUDescriptorHandle() const { return m_handle; } + +private: + D3D12_CPU_DESCRIPTOR_HANDLE m_handle; + ID3D12Resource* m_resource; +}; + +} // namespace RHI +} // namespace XCEngine diff --git a/engine/src/RHI/D3D12QueryHeap.cpp b/engine/src/RHI/D3D12QueryHeap.cpp new file mode 100644 index 00000000..d4a9b88b --- /dev/null +++ b/engine/src/RHI/D3D12QueryHeap.cpp @@ -0,0 +1,50 @@ +#include "XCEngine/RHI/D3D12/D3D12QueryHeap.h" + +namespace XCEngine { +namespace RHI { + +D3D12QueryHeap::D3D12QueryHeap() + : m_type(QueryType::Timestamp) + , m_count(0) { +} + +D3D12QueryHeap::~D3D12QueryHeap() { + Shutdown(); +} + +bool D3D12QueryHeap::Initialize(ID3D12Device* device, QueryType type, uint32_t count) { + D3D12_QUERY_HEAP_DESC desc = {}; + desc.Count = count; + desc.Type = D3D12_QUERY_HEAP_TYPE_TIMESTAMP; + desc.NodeMask = 0; + + switch (type) { + case QueryType::Timestamp: + desc.Type = D3D12_QUERY_HEAP_TYPE_TIMESTAMP; + break; + case QueryType::Occlusion: + desc.Type = D3D12_QUERY_HEAP_TYPE_OCCLUSION; + break; + case QueryType::PipelineStatistics: + desc.Type = D3D12_QUERY_HEAP_TYPE_PIPELINE_STATISTICS; + break; + } + + HRESULT hResult = device->CreateQueryHeap(&desc, IID_PPV_ARGS(&m_queryHeap)); + if (FAILED(hResult)) { + return false; + } + + m_type = type; + m_count = count; + return true; +} + +void D3D12QueryHeap::Shutdown() { + m_queryHeap.Reset(); + m_type = QueryType::Timestamp; + m_count = 0; +} + +} // namespace RHI +} // namespace XCEngine diff --git a/engine/src/RHI/D3D12UnorderedAccessView.cpp b/engine/src/RHI/D3D12UnorderedAccessView.cpp new file mode 100644 index 00000000..4161a6d0 --- /dev/null +++ b/engine/src/RHI/D3D12UnorderedAccessView.cpp @@ -0,0 +1,27 @@ +#include "XCEngine/RHI/D3D12/D3D12UnorderedAccessView.h" + +namespace XCEngine { +namespace RHI { + +D3D12UnorderedAccessView::D3D12UnorderedAccessView() + : m_handle({0}) + , m_resource(nullptr) { +} + +D3D12UnorderedAccessView::~D3D12UnorderedAccessView() { + Shutdown(); +} + +void D3D12UnorderedAccessView::Initialize(ID3D12Device* device, ID3D12Resource* resource, const D3D12_UNORDERED_ACCESS_VIEW_DESC* desc) { + m_resource = resource; + m_handle = {}; + device->CreateUnorderedAccessView(resource, nullptr, desc, m_handle); +} + +void D3D12UnorderedAccessView::Shutdown() { + m_handle = {}; + m_resource = nullptr; +} + +} // namespace RHI +} // namespace XCEngine