83 lines
2.0 KiB
Markdown
83 lines
2.0 KiB
Markdown
# D3D12QueryHeap
|
||
|
||
DirectX 12 查询堆的 D3D12 实现,封装了 `ID3D12QueryHeap`。
|
||
|
||
## 头文件
|
||
|
||
```cpp
|
||
#include <XCEngine/RHI/D3D12/D3D12QueryHeap.h>
|
||
```
|
||
|
||
## 公共成员函数
|
||
|
||
### 构造函数与析构函数
|
||
|
||
#### `D3D12QueryHeap()`
|
||
默认构造函数。
|
||
|
||
#### `~D3D12QueryHeap()`
|
||
析构函数,确保调用 `Shutdown()`。
|
||
|
||
### 初始化
|
||
|
||
#### `bool Initialize(ID3D12Device* device, QueryType type, uint32_t count)`
|
||
初始化查询堆。
|
||
- `device`: D3D12 设备
|
||
- `type`: 查询类型
|
||
- `count`: 查询数量
|
||
- 返回: 初始化是否成功
|
||
|
||
#### `void Shutdown()`
|
||
释放查询堆。
|
||
|
||
### 属性
|
||
|
||
#### `ID3D12QueryHeap* GetQueryHeap() const`
|
||
获取底层 `ID3D12QueryHeap` 指针。
|
||
|
||
#### `void* GetNativeHandle() const`
|
||
返回原生句柄。
|
||
|
||
#### `QueryType GetType() const`
|
||
获取查询类型。
|
||
|
||
#### `uint32_t GetCount() const`
|
||
获取查询数量。
|
||
|
||
## 内部成员
|
||
|
||
| 成员 | 类型 | 描述 |
|
||
|------|------|------|
|
||
| `m_queryHeap` | `ComPtr<ID3D12QueryHeap>` | D3D12 查询堆 |
|
||
| `m_type` | `QueryType` | 查询类型 |
|
||
| `m_count` | `uint32_t` | 查询数量 |
|
||
|
||
## 使用示例
|
||
|
||
```cpp
|
||
// Create query heap for occlusion
|
||
D3D12QueryHeap queryHeap;
|
||
queryHeap.Initialize(device->GetDevice(), QueryType::Occlusion, 2);
|
||
|
||
// Create readback buffer for results
|
||
D3D12Buffer readbackBuffer;
|
||
readbackBuffer.Initialize(device->GetDevice(), sizeof(uint64_t) * 2,
|
||
D3D12_RESOURCE_STATE_COPY_DEST, D3D12_HEAP_TYPE_READBACK);
|
||
|
||
// In render pass
|
||
cmdList->BeginQuery(queryHeap.GetQueryHeap(), QueryType::Occlusion, 0);
|
||
// Draw bounding box
|
||
cmdList->Draw(8);
|
||
cmdList->EndQuery(queryHeap.GetQueryHeap(), QueryType::Occlusion, 0);
|
||
|
||
// Resolve to readback buffer
|
||
cmdList->ResolveQueryData(queryHeap.GetQueryHeap(), QueryType::Occlusion, 0, 1,
|
||
readbackBuffer.GetResource(), 0);
|
||
```
|
||
|
||
## 备注
|
||
|
||
- 三种查询类型: Occlusion(遮挡)、Timestamp(时间戳)、PipelineStatistics(管线统计)
|
||
- 查询数据需要通过 resolve 操作复制到可读缓冲区
|
||
- 时间戳查询需要命令队列支持时间戳功能
|