feat: 实现 D3D12DescriptorHeap 描述符堆类
- 添加 D3D12DescriptorHeap.h 头文件 - 实现 ID3D12DescriptorHeap 封装 - 支持 RTV、DSV、CBV_SRV_UAV、Sampler 堆类型 - 支持 GPU 可见描述符堆 - 添加 GetCPUDescriptorHandle、GetGPUDescriptorHandle 等方法 - 测试通过
This commit is contained in:
@@ -88,12 +88,14 @@ add_library(XCEngine STATIC
|
|||||||
include/XCEngine/RHI/D3D12/D3D12CommandQueue.h
|
include/XCEngine/RHI/D3D12/D3D12CommandQueue.h
|
||||||
include/XCEngine/RHI/D3D12/D3D12CommandAllocator.h
|
include/XCEngine/RHI/D3D12/D3D12CommandAllocator.h
|
||||||
include/XCEngine/RHI/D3D12/D3D12CommandList.h
|
include/XCEngine/RHI/D3D12/D3D12CommandList.h
|
||||||
|
include/XCEngine/RHI/D3D12/D3D12DescriptorHeap.h
|
||||||
include/XCEngine/RHI/D3D12/D3D12Fence.h
|
include/XCEngine/RHI/D3D12/D3D12Fence.h
|
||||||
include/XCEngine/RHI/D3D12/D3D12Screenshot.h
|
include/XCEngine/RHI/D3D12/D3D12Screenshot.h
|
||||||
src/RHI/D3D12Device.cpp
|
src/RHI/D3D12Device.cpp
|
||||||
src/RHI/D3D12CommandQueue.cpp
|
src/RHI/D3D12CommandQueue.cpp
|
||||||
src/RHI/D3D12CommandAllocator.cpp
|
src/RHI/D3D12CommandAllocator.cpp
|
||||||
src/RHI/D3D12CommandList.cpp
|
src/RHI/D3D12CommandList.cpp
|
||||||
|
src/RHI/D3D12DescriptorHeap.cpp
|
||||||
src/RHI/D3D12Fence.cpp
|
src/RHI/D3D12Fence.cpp
|
||||||
src/RHI/D3D12Screenshot.cpp
|
src/RHI/D3D12Screenshot.cpp
|
||||||
)
|
)
|
||||||
|
|||||||
43
engine/include/XCEngine/RHI/D3D12/D3D12DescriptorHeap.h
Normal file
43
engine/include/XCEngine/RHI/D3D12/D3D12DescriptorHeap.h
Normal file
@@ -0,0 +1,43 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <d3d12.h>
|
||||||
|
#include <wrl/client.h>
|
||||||
|
|
||||||
|
#include "../Enums.h"
|
||||||
|
#include "D3D12Enum.h"
|
||||||
|
|
||||||
|
using Microsoft::WRL::ComPtr;
|
||||||
|
|
||||||
|
namespace XCEngine {
|
||||||
|
namespace RHI {
|
||||||
|
|
||||||
|
class D3D12DescriptorHeap {
|
||||||
|
public:
|
||||||
|
D3D12DescriptorHeap();
|
||||||
|
~D3D12DescriptorHeap();
|
||||||
|
|
||||||
|
bool Initialize(ID3D12Device* device, DescriptorHeapType type, uint32_t numDescriptors, bool shaderVisible = false);
|
||||||
|
void Shutdown();
|
||||||
|
|
||||||
|
ID3D12DescriptorHeap* GetDescriptorHeap() const { return m_descriptorHeap.Get(); }
|
||||||
|
|
||||||
|
D3D12_CPU_DESCRIPTOR_HANDLE GetCPUDescriptorHandle(uint32_t index) const;
|
||||||
|
D3D12_GPU_DESCRIPTOR_HANDLE GetGPUDescriptorHandle(uint32_t index) const;
|
||||||
|
|
||||||
|
uint32_t GetDescriptorCount() const { return m_numDescriptors; }
|
||||||
|
DescriptorHeapType GetType() const { return m_type; }
|
||||||
|
uint32_t GetDescriptorSize() const { return m_descriptorSize; }
|
||||||
|
|
||||||
|
D3D12_CPU_DESCRIPTOR_HANDLE GetCPUDescriptorHandleForHeapStart() const;
|
||||||
|
D3D12_GPU_DESCRIPTOR_HANDLE GetGPUDescriptorHandleForHeapStart() const;
|
||||||
|
|
||||||
|
private:
|
||||||
|
ComPtr<ID3D12DescriptorHeap> m_descriptorHeap;
|
||||||
|
DescriptorHeapType m_type;
|
||||||
|
uint32_t m_numDescriptors;
|
||||||
|
uint32_t m_descriptorSize;
|
||||||
|
bool m_shaderVisible;
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace RHI
|
||||||
|
} // namespace XCEngine
|
||||||
62
engine/src/RHI/D3D12DescriptorHeap.cpp
Normal file
62
engine/src/RHI/D3D12DescriptorHeap.cpp
Normal file
@@ -0,0 +1,62 @@
|
|||||||
|
#include "XCEngine/RHI/D3D12/D3D12DescriptorHeap.h"
|
||||||
|
|
||||||
|
namespace XCEngine {
|
||||||
|
namespace RHI {
|
||||||
|
|
||||||
|
D3D12DescriptorHeap::D3D12DescriptorHeap()
|
||||||
|
: m_type(DescriptorHeapType::CBV_SRV_UAV)
|
||||||
|
, m_numDescriptors(0)
|
||||||
|
, m_descriptorSize(0)
|
||||||
|
, m_shaderVisible(false) {
|
||||||
|
}
|
||||||
|
|
||||||
|
D3D12DescriptorHeap::~D3D12DescriptorHeap() {
|
||||||
|
Shutdown();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool D3D12DescriptorHeap::Initialize(ID3D12Device* device, DescriptorHeapType type, uint32_t numDescriptors, bool shaderVisible) {
|
||||||
|
D3D12_DESCRIPTOR_HEAP_DESC desc = {};
|
||||||
|
desc.Type = ToD3D12(type);
|
||||||
|
desc.NumDescriptors = numDescriptors;
|
||||||
|
desc.Flags = shaderVisible ? D3D12_DESCRIPTOR_HEAP_FLAG_SHADER_VISIBLE : D3D12_DESCRIPTOR_HEAP_FLAG_NONE;
|
||||||
|
desc.NodeMask = 0;
|
||||||
|
|
||||||
|
HRESULT hResult = device->CreateDescriptorHeap(&desc, IID_PPV_ARGS(&m_descriptorHeap));
|
||||||
|
if (FAILED(hResult)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
m_type = type;
|
||||||
|
m_numDescriptors = numDescriptors;
|
||||||
|
m_shaderVisible = shaderVisible;
|
||||||
|
m_descriptorSize = device->GetDescriptorHandleIncrementSize(ToD3D12(type));
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void D3D12DescriptorHeap::Shutdown() {
|
||||||
|
m_descriptorHeap.Reset();
|
||||||
|
}
|
||||||
|
|
||||||
|
D3D12_CPU_DESCRIPTOR_HANDLE D3D12DescriptorHeap::GetCPUDescriptorHandle(uint32_t index) const {
|
||||||
|
D3D12_CPU_DESCRIPTOR_HANDLE handle = m_descriptorHeap->GetCPUDescriptorHandleForHeapStart();
|
||||||
|
handle.ptr += index * m_descriptorSize;
|
||||||
|
return handle;
|
||||||
|
}
|
||||||
|
|
||||||
|
D3D12_GPU_DESCRIPTOR_HANDLE D3D12DescriptorHeap::GetGPUDescriptorHandle(uint32_t index) const {
|
||||||
|
D3D12_GPU_DESCRIPTOR_HANDLE handle = m_descriptorHeap->GetGPUDescriptorHandleForHeapStart();
|
||||||
|
handle.ptr += index * m_descriptorSize;
|
||||||
|
return handle;
|
||||||
|
}
|
||||||
|
|
||||||
|
D3D12_CPU_DESCRIPTOR_HANDLE D3D12DescriptorHeap::GetCPUDescriptorHandleForHeapStart() const {
|
||||||
|
return m_descriptorHeap->GetCPUDescriptorHandleForHeapStart();
|
||||||
|
}
|
||||||
|
|
||||||
|
D3D12_GPU_DESCRIPTOR_HANDLE D3D12DescriptorHeap::GetGPUDescriptorHandleForHeapStart() const {
|
||||||
|
return m_descriptorHeap->GetGPUDescriptorHandleForHeapStart();
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace RHI
|
||||||
|
} // namespace XCEngine
|
||||||
Reference in New Issue
Block a user