window 显示驱动开发-线程和同步级别一级(一)

在级别 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)

  • 功能:处理鼠标指针的位置和形状(硬件光标)。
  • 不可重入函数:
  1. DxgkDdiSetPointerPosition(设置指针位置)
  2. 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 驱动程序能在保证线程安全的同时,充分利用硬件并行能力。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值