Files
XCEngine/docs/api/rhi/d3d12/d3d12-descriptor-heap.md

115 lines
3.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# D3D12DescriptorHeap
DirectX 12 描述符堆的 D3D12 实现,封装了 `ID3D12DescriptorHeap`
## 头文件
```cpp
#include <XCEngine/RHI/D3D12/D3D12DescriptorHeap.h>
```
## 继承关系
```
RHIDescriptorPool (interface)
└── D3D12DescriptorHeap (implementation)
```
## 公共成员函数
### 构造函数与析构函数
#### `D3D12DescriptorHeap()`
默认构造函数。
#### `~D3D12DescriptorHeap() override`
析构函数,确保调用 `Shutdown()`
### 初始化
#### `bool Initialize(ID3D12Device* device, DescriptorHeapType type, uint32_t numDescriptors, bool shaderVisible = false)`
使用参数初始化。
- `device`: D3D12 设备
- `type`: 描述符堆类型
- `numDescriptors`: 描述符数量
- `shaderVisible`: 是否对 GPU 可见CBV_SRV_UAV 和 Sampler 堆需要)
- 返回: 初始化是否成功
#### `bool Initialize(const DescriptorPoolDesc& desc) override`
使用统一描述符初始化。
#### `void Shutdown() override`
释放描述符堆。
### 描述符句柄
#### `ID3D12DescriptorHeap* GetDescriptorHeap() const`
获取底层 `ID3D12DescriptorHeap` 指针。
#### `CPUDescriptorHandle GetCPUDescriptorHandle(uint32_t index)`
获取指定索引的 CPU 描述符句柄。
#### `GPUDescriptorHandle GetGPUDescriptorHandle(uint32_t index)`
获取指定索引的 GPU 描述符句柄。
#### `D3D12_CPU_DESCRIPTOR_HANDLE GetCPUDescriptorHandleForHeapStart() const`
获取堆起始 CPU 句柄。
#### `D3D12_GPU_DESCRIPTOR_HANDLE GetGPUDescriptorHandleForHeapStart() const`
获取堆起始 GPU 句柄。
### 属性
#### `uint32_t GetDescriptorCount() const override`
获取描述符总数。
#### `DescriptorHeapType GetType() const override`
获取描述符堆类型。
#### `uint32_t GetDescriptorSize() const`
获取单个描述符大小(增量大小)。
#### `void* GetNativeHandle() override`
返回原生句柄。
### 静态辅助函数
#### `static D3D12_DESCRIPTOR_HEAP_DESC CreateDesc(DescriptorHeapType type, uint32_t numDescriptors, bool shaderVisible = false)`
创建 D3D12 描述符堆描述。
## 内部成员
| 成员 | 类型 | 描述 |
|------|------|------|
| `m_descriptorHeap` | `ComPtr<ID3D12DescriptorHeap>` | D3D12 描述符堆 |
| `m_type` | `DescriptorHeapType` | 堆类型 |
| `m_numDescriptors` | `uint32_t` | 描述符数量 |
| `m_descriptorSize` | `uint32_t` | 增量大小 |
| `m_shaderVisible` | `bool` | 是否 shader visible |
## 使用示例
```cpp
// Create RTV heap
D3D12DescriptorHeap rtvHeap;
rtvHeap.Initialize(device->GetDevice(), DescriptorHeapType::RTV, 10, false);
// Create SRV/CBV/UAV heap
D3D12DescriptorHeap cbvHeap;
cbvHeap.Initialize(device->GetDevice(), DescriptorHeapType::CBV_SRV_UAV, 100, true);
// Get handle for creating views
D3D12_CPU_DESCRIPTOR_HANDLE rtvHandle = rtvHeap.GetCPUDescriptorHandle(0);
// Create RTV
D3D12RenderTargetView rtv;
rtv.InitializeAt(device->GetDevice(), texture->GetResource(), rtvHandle, nullptr);
```
## 备注
- 四种描述符堆类型: CBV_SRV_UAV, Sampler, RTV, DSV
- RTV 和 DSV 堆通常不需要 shader visible
- CBV_SRV_UAV 和 Sampler 堆如需在 shader 中访问必须 shader visible
- 描述符堆创建后大小固定,不能调整