107 lines
2.3 KiB
Markdown
107 lines
2.3 KiB
Markdown
# D3D12Fence
|
|
|
|
DirectX 12 栅栏同步对象的 D3D12 实现,封装了 `ID3D12Fence`。
|
|
|
|
## 头文件
|
|
|
|
```cpp
|
|
#include <XCEngine/RHI/D3D12/D3D12Fence.h>
|
|
```
|
|
|
|
## 继承关系
|
|
|
|
```
|
|
RHIFence (interface)
|
|
└── D3D12Fence (implementation)
|
|
```
|
|
|
|
## 公共成员函数
|
|
|
|
### 构造函数与析构函数
|
|
|
|
#### `D3D12Fence()`
|
|
默认构造函数。
|
|
|
|
#### `~D3D12Fence() override`
|
|
析构函数,确保调用 `Shutdown()`。
|
|
|
|
### 初始化与销毁
|
|
|
|
#### `bool Initialize(ID3D12Device* device, uint64_t initialValue = 0)`
|
|
初始化栅栏。
|
|
- `device`: D3D12 设备
|
|
- `initialValue`: 初始信号值
|
|
- 返回: 初始化是否成功
|
|
|
|
#### `void Shutdown() override`
|
|
关闭栅栏并释放事件句柄。
|
|
|
|
### 信号操作
|
|
|
|
#### `void Signal() override`
|
|
发送信号,将值增加 1。
|
|
|
|
#### `void Signal(uint64_t value) override`
|
|
发送信号,设置指定值。
|
|
|
|
#### `void Wait(uint64_t value) override`
|
|
等待栅栏达到指定值。
|
|
|
|
#### `uint64_t GetCompletedValue() const override`
|
|
获取当前完成值。
|
|
|
|
#### `bool IsSignaled() const override`
|
|
检查是否已达到信号值。
|
|
|
|
#### `void* GetEventHandle()`
|
|
获取事件句柄,用于自定义等待。
|
|
|
|
### 原生接口
|
|
|
|
#### `void* GetNativeHandle() override { return m_fence.Get(); }`
|
|
|
|
#### `ID3D12Fence* GetFence() const`
|
|
获取底层 `ID3D12Fence` 指针。
|
|
|
|
## 内部成员
|
|
|
|
| 成员 | 类型 | 描述 |
|
|
|------|------|------|
|
|
| `m_fence` | `ComPtr<ID3D12Fence>` | D3D12 栅栏对象 |
|
|
| `m_eventHandle` | `void*` | 同步事件句柄 |
|
|
| `m_signalValue` | `uint64_t` | 最后信号值 |
|
|
|
|
## 使用示例
|
|
|
|
```cpp
|
|
D3D12Fence fence;
|
|
fence.Initialize(device->GetDevice());
|
|
|
|
// CPU-GPU 同步
|
|
cmdQueue->Signal(fence.GetFence(), 1);
|
|
fence.Wait(1);
|
|
|
|
// 多帧同步
|
|
uint64_t frameFenceValues[3] = {0, 0, 0};
|
|
int frameIndex = 0;
|
|
|
|
void RenderFrame() {
|
|
uint64_t fenceValue = frameIndex + 1;
|
|
cmdQueue->Signal(fence.GetFence(), fenceValue);
|
|
|
|
// Wait for this frame's previous render to complete
|
|
if (fence.GetCompletedValue() < frameFenceValues[frameIndex]) {
|
|
fence.Wait(frameFenceValues[frameIndex]);
|
|
}
|
|
|
|
frameFenceValues[frameIndex] = fenceValue;
|
|
frameIndex = (frameIndex + 1) % 3;
|
|
}
|
|
```
|
|
|
|
## 备注
|
|
|
|
- 栅栏用于 CPU-GPU 和 GPU-GPU 同步
|
|
- 事件句柄可用于 `WaitForSingleObject` 等 Win32 API
|
|
- 多帧缓冲时常用栅栏确保帧间资源安全
|