从 Windows 7 开始,显示微型端口驱动程序可以在 DXGK_PRESENTATIONCAPS 结构中设置其他成员,以指示驱动程序可以或不能支持的某些呈现操作。
从 Windows 7 开始,显示微型端口驱动程序可以通过 DXGK_PRESENTATIONCAPS 结构进一步声明其支持的呈现(Presentation)功能。这些设置直接影响 DirectX 图形子系统(DWM/GDI/Direct3D)如何优化合成和渲染流程
1. 核心作用
功能声明:驱动程序通过此结构明确告知 Windows:
- 支持哪些 呈现技术(如翻转模型、Direct Flip、MPO)。
- 是否支持 特定优化(如无撕裂呈现、HDR 合成)。
- 硬件限制(如最大可支持的平面数)。
影响范围:
- 桌面窗口管理器(DWM)的合成策略。
- Direct3D 交换链的呈现模式选择。
- GDI 硬件加速的兼容性行为。
2. 关键成员及配置
以下是 DXGK_PRESENTATIONCAPS 中重要的成员及其用途:
成员 | 类型 | 说明 |
---|---|---|
SupportKernelModeCommandBuffer |
BOOLEAN | 是否支持内核模式命令缓冲区(通常为 TRUE )。 |
SupportSoftwareDevice |
BOOLEAN | 是否支持软件模拟设备(如 WARP 回退)。 |
MaxPlaneCount |
UINT | 硬件支持的最大叠加平面数(Multiplane Overlay, MPO)。 |
FlipOnVSyncWithNoWait |
BOOLEAN | 是否支持在垂直同步(VSync)时立即翻转(无等待)。 |
FlipOnVSyncMmIo |
BOOLEAN | 是否支持通过 MMIO 触发的 VSync 翻转。 |
DisableTearing |
BOOLEAN | 是否禁用撕裂(启用垂直同步强制同步)。 |
SupportDirectFlip |
BOOLEAN | 是否支持 Direct Flip(跳过合成器的直接翻转)。 |
SupportMultiPlaneOverlay |
BOOLEAN | 是否支持多平面叠加(MPO)。 |
SupportIndependentFlip |
BOOLEAN | 是否支持独立翻转(每个平面独立控制)。 |
3. 典型配置场景
(1) 基础 GDI 加速支持
DXGK_PRESENTATIONCAPS Caps = {0};
Caps.SupportKernelModeCommandBuffer = TRUE; // 必需
Caps.SupportSoftwareDevice = FALSE; // 假设硬件完全加速
Caps.MaxPlaneCount = 1; // 单平面(传统模式)
(2) 高级 DWM 合成优化(Windows 10+)
Caps.SupportDirectFlip = TRUE; // 启用 Direct Flip
Caps.SupportMultiPlaneOverlay = TRUE; // 支持 MPO
Caps.MaxPlaneCount = 3; // 例如:3 个叠加层
Caps.DisableTearing = TRUE; // 强制 VSync 防撕裂
(3) 兼容性限制
Caps.FlipOnVSyncWithNoWait = FALSE; // 需要等待 VSync
Caps.SupportIndependentFlip = FALSE; // 平面必须同步更新
4. 实现位置
驱动程序通常在以下函数中填充 DXGK_PRESENTATIONCAPS:
- DxgkDdiQueryAdapterInfo
- 响应 KMDTARGET_ADAPTER_INFO_TYPE_PRESENTATIONCAPS 查询时返回结构。
- DxgkDdiStartDevice
- 初始化硬件后设置静态功能。
5. 注意事项
性能权衡:
- 声明过多功能可能导致 Windows 尝试使用不稳定的路径(如 MPO 兼容性问题)。
- 声明不足会回退到低效路径(如 BitBlt 合成)。
版本适配:
- Windows 7 仅支持基础成员(如 FlipOnVSyncMmIo)。
- Windows 10+ 扩展了 MPO 和 Direct Flip 相关成员。
6. 伪代码示例
NTSTATUS DxgkDdiQueryAdapterInfo(
CONST HANDLE hAdapter,
CONST DXGKARG_QUERYADAPTERINFO* pArgs
) {
if (pArgs->Type == KMDTARGET_ADAPTER_INFO_TYPE_PRESENTATIONCAPS) {
DXGK_PRESENTATIONCAPS* pCaps = (DXGK_PRESENTATIONCAPS*)pArgs->pOutputData;
pCaps->SupportKernelModeCommandBuffer = TRUE;
pCaps->SupportDirectFlip = TRUE; // 假设硬件支持
pCaps->MaxPlaneCount = 2; // 双平面叠加
// ... 其他设置 ...
return STATUS_SUCCESS;
}
}
7. 总结
关键结构:DXGK_PRESENTATIONCAPS 是驱动程序声明硬件能力的核心接口。
优化方向:
- 正确配置可启用 MPO、Direct Flip 等现代合成技术。
- 错误配置可能导致 性能下降 或 渲染错误。
向后兼容:需根据 Windows 版本选择可用的成员。
适用于 WDDM v1.2+ 驱动程序开发,尤其是需要优化 DWM 合成或多显示器场景的 GPU 驱动。