二级线程和同步与 级别三相同,只不过视频内存不会逐出到主机 CPU 内存中。 换句话说,WDDM 保证:
显示微型端口驱动程序中只有单个线程 (调用线程) 。
图形硬件处于空闲状态。
驱动程序当前没有直接内存访问 (DMA) 缓冲区正在由驱动程序处理或通过 GPU 计划程序传递。
若要在级别 2 下进行某些调用,必须在属于 DXGKARG_ESCAPE 的 D3DDDI_ESCAPEFLAGS 结构中设置 HardwareAccess 标志。 如果未设置此标志,则调用将失败。
以下列表包含在级别 2 下对显示微型端口驱动程序进行的一些调用:
- DxgkDdiCommitVidPn
- DxgkDdiControlInterrupt
- DxgkDdiDispatchIoRequest
- DxgkDdiEscape
- DxgkDdiNotifyAcpiEvent
- DxgkDdiQueryInterface
- DxgkDdiRecommendFunctionalVidPn
- DxgkDdiRecommendMonitorModes
- DxgkDdiSetPalette
- DxgkDdiSetTimingsFromVidPn
- DxgkDdiSetVidPnSourceAddress
- DxgkDdiSetVidPnSourceVisibility
- DxgkDdiUpdateActiveVidPnPresentPath
以下是关于 Windows Display Driver Model (WDDM) 中二级线程同步级别(Level 2 Synchronization Level)的行为规范,以及与三级(Level 3)的区别。以下是关键点的解析:
核心概念
1、二级(Level 2)与三级(Level 3)的异同:
- 相同点:线程同步规则一致(如单线程调用、硬件空闲、无活跃DMA缓冲区等)。
- 关键区别:在二级下,视频内存(VRAM)不会被逐出到主机CPU内存(即WDDM保证VRAM的稳定性)。
2、调用条件:
- 必须通过 DXGKARG_ESCAPE 结构中的 D3DDDI_ESCAPEFLAGS.HardwareAccess 标志显式声明需要硬件访问权限。未设置此标志的调用会失败。
WDDM的保证(调用前提)
调用二级同步级别的函数时,系统确保以下状态:
- 单线程执行:仅调用线程能访问显示微型端口驱动程序(Display Miniport Driver)。
- 硬件空闲:图形硬件(GPU)无任何活动任务。
- 无活跃DMA缓冲区:驱动没有正在处理或通过GPU调度器传递的DMA缓冲区。
适用场景的调用函数
以下函数通常需要在二级同步级别下调用(需满足上述条件):
1、显示配置:
- DxgkDdiCommitVidPn(提交视频呈现网络配置)
- DxgkDdiSetTimingsFromVidPn(设置时序)
- DxgkDdiSetVidPnSourceAddress(设置视频源地址)
- DxgkDdiSetVidPnSourceVisibility(控制显示源可见性)
- DxgkDdiUpdateActiveVidPnPresentPath(更新当前显示路径)
2、中断与硬件控制:
- DxgkDdiControlInterrupt(中断控制)
- DxgkDdiNotifyAcpiEvent(ACPI事件通知)
3、其他操作:
- DxgkDdiEscape(扩展自定义命令)
- DxgkDdiQueryInterface(查询驱动接口)
- DxgkDdiSetPalette(调色板设置)
开发者注意事项
- 标志必要性:调用这些函数时,必须设置 HardwareAccess 标志,否则系统会拒绝请求。
- 性能影响:二级同步避免了VRAM逐出,适合对性能敏感的操作(如实时显示配置),但需确保硬件处于安全状态。
- 错误处理:若未满足调用条件(如硬件忙),函数应返回适当错误码(如 STATUS_GRAPHICS_GPU_EXCEPTION_ON_DEVICE)。
典型应用场景
- 动态分辨率切换:通过 DxgkDdiCommitVidPn 修改显示模式时,需保证VRAM不被干扰。
- 中断屏蔽:调用 DxgkDdiControlInterrupt 禁用中断期间,需确保无并发DMA操作。
通过遵循这些规则,WDDM驱动程序可以在保证系统稳定性的同时高效管理图形硬件资源。