在级别 1 线程和同步中,WDDM 不允许在特定函数类中重新进入。 也就是说,只有一个线程可以进入特定类中的驱动程序。 但是,可以同时输入来自多个一级类和 零级 调用的调用。 尽管来自不同第一级类的两个或多个线程和 来自零级 调用的线程可以同时在驱动程序中运行,但不能有两个线程属于单个进程。
WDDM 将线程处理级别 1 下对显示微型端口驱动程序的调用分类为非实体类,例如以下类。 其他类包括 VidMm、虚拟机和 vGPU。
一、指针类
WDDM 不允许以可重入的方式调用指针类函数之一。 也就是说,在给定的时间,最多可以在以下函数之一中运行一个线程:
- DxgkDdiSetPointerPosition
- DxgkDdiSetPointerShape
二、GPU 计划程序类
WDDM 不允许以可重入的方式调用某个 GPU 计划程序加载程序类函数。 也就是说,在给定的时间,最多可以在以下函数之一中运行一个线程:
- DxgkDdiBuildPagingBuffer
- DxgkDdiPatch
- DxgkDdiPreemptCommand
- DxgkDdiQueryDependentEngineGroup
- DxgkDdiQueryEngineStatus
- DxgkDdiResetEngine
- DxgkDdiSubmitCommand
以下详细描述说明了 WDDM(Windows Display Driver Model)中 一级线程同步级别(Level 1 Synchronization Level) 的行为规则,重点在于 非可重入性(Non-Reentrancy) 和 类别的隔离性。以下是关键点的解析:
三、核心概念
1、一级同步级别(Level 1)的特性:
- 禁止类内重入:在同一个函数类别(如指针类、GPU调度器类)中,同一时间只能有一个线程进入驱动程序的该类别函数。
- 允许跨类并发:不同类别的 Level 1 调用(如指针类和GPU调度器类)可以同时运行,且 Level 0 的调用也能并发执行。
- 进程内线程限制:即使来自不同类别,同一进程的两个线程不能同时在驱动程序中运行(跨进程的线程允许并发)。
2、非实体类(Non-Entity Classes):
- WDDM 将 Level 1 的调用分类为逻辑上的“非实体类”(如指针类、GPU调度器类),与 VidMm(视频内存管理)、虚拟机、vGPU 等其他类别隔离。
四、具体函数类别与规则
1. 指针类(Pointer Class)
- 功能:处理鼠标指针的位置和形状(硬件光标)。
- 不可重入函数:
- DxgkDdiSetPointerPosition(设置指针位置)
- DxgkDdiSetPointerShape(设置指针形状)
- 规则:同一时间只能有一个线程执行指针类的任一函数。
2. GPU 调度器类(GPU Scheduler Class)
功能:管理GPU命令的提交、抢占、分页缓冲等。
不可重入函数:
- DxgkDdiBuildPagingBuffer(构建分页缓冲区)
- DxgkDdiPatch(修补命令)
- DxgkDdiPreemptCommand(抢占GPU命令)
- DxgkDdiQueryDependentEngineGroup(查询引擎依赖关系)
- DxgkDdiQueryEngineStatus(查询引擎状态)
- DxgkDdiResetEngine(重置GPU引擎)
- DxgkDdiSubmitCommand(提交命令到GPU)
规则:同一时间只能有一个线程执行GPU调度器类的任一函数。
五、并发场景示例
允许的并发:
- 线程A执行 DxgkDdiSetPointerPosition(指针类),同时线程B执行 DxgkDdiSubmitCommand(GPU调度器类)。
- 线程C(进程1)执行 Level 1 调用,线程D(进程2)执行另一 Level 1 调用。
禁止的并发:
- 两个线程同时调用 DxgkDdiSetPointerShape(同属指针类)。
- 同一进程的两个线程同时进入任意 Level 1 函数。
六、开发者注意事项
1、线程同步:
- 驱动程序必须通过锁或其他机制确保类内函数的互斥访问。
- 跨类别的并发需避免共享资源冲突(如全局状态)。
2、错误处理:
- 如果违反规则(如类内重入),系统可能返回 STATUS_GRAPHICS_DRIVER_THREAD_REQUEST_FAILED 或其他错误码。
3、性能影响:
Level 1 的类间并发允许更高吞吐量(如指针更新与命令提交并行),但需谨慎处理跨类别资源竞争。
七、设计意图
- 隔离性:通过类别划分减少锁争用,提升多线程性能。
- 稳定性:避免同一类内操作因重入导致状态不一致(如指针形状与位置不同步)。
- 兼容性:支持多进程共享GPU资源(如多个应用提交命令),但限制单进程的多线程干扰。
八、典型应用场景
- 游戏与UI交互:鼠标指针(指针类)的实时更新与GPU渲染命令(调度器类)并行处理。
- 多任务调度:后台进程重置GPU引擎(DxgkDdiResetEngine)时,前台进程仍可提交命令(需跨进程并发)。
通过遵循这些规则,WDDM 驱动程序能在保证线程安全的同时,充分利用硬件并行能力。