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

83 lines
2.0 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.
# 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 操作复制到可读缓冲区
- 时间戳查询需要命令队列支持时间戳功能