windows显示驱动开发-浮点、围栏支持、资源管理

更改浮点控制状态

显示微型端口驱动程序和用户模式显示驱动程序的所有函数都必须在更改浮点控制状态之前保存浮点控制状态,例如舍入模式或精度,并且必须在返回之前将浮点控制状态还原到以前保存的设置。

提供围栏标识符

Microsoft DirectX 图形内核子系统在DXGKARG_PATCH的 SubmissionFenceId 成员中提供相同的围栏标识符,并在调用显示微型端口驱动程序的 DxgkDdiPatch 和 DxgkDdiSubmitCommand 函数时DXGKARG_SUBMITCOMMAND结构。 根据图形硬件的实现方式,驱动程序只需要使用传递给 DxgkDdiPatch 或 DxgkDdiSubmitCommand 函数之一的围栏标识符,原因如下:

  • 驱动程序使用传递给 DxgkDdiPatch 的围栏标识符写入直接内存访问 (DMA) 缓冲区的末尾。
  • 驱动程序使用传递给 DxgkDdiSubmitCommand 的围栏标识符写入环形缓冲区,环缓冲区是图形处理单元 (GPU 排队等待执行的缓冲区) (大多数 GPU 类型使用 DMA 缓冲区队列模型) 。
处理资源创建和销毁

若要使 Microsoft DirectX 图形内核子系统能够正确跟踪资源生存期并防止操作系统中的内存泄漏,用户模式显示驱动程序必须正确创建和销毁资源。

Microsoft Direct3D 运行时调用以下用户模式显示驱动程序函数来创建用户模式资源。

  • CreateResource 创建新的共享或非共享资源。
  • OpenResource 打开现有共享资源的视图。

在这两个调用中,Direct3D 运行时都会传递唯一 的用户模式运行时资源句柄 ,用户模式显示驱动程序使用该句柄回调运行时。 当 CreateResource 或 OpenResource 成功返回时,用户模式显示驱动程序将返回表示资源的唯一用户模式句柄。 此句柄是 用户模式驱动程序资源句柄。 运行时在后续驱动程序调用中使用用户模式驱动程序资源句柄。

用户模式运行时资源句柄与用户模式驱动程序资源句柄之间存在一对一的对应关系。 Direct3D 运行时和用户模式显示驱动程序通过D3DDDIARG_CREATERESOURCE和D3DDDIARG_OPENRESOURCE结构的 hResource 成员交换用户模式运行时和驱动程序资源句柄。

当用户模式显示驱动程序调用 Direct3D 运行时的 pfnAllocateCb 函数为用户模式资源创建分配时,驱动程序应在 pData 参数指向的 D3DDDICB_ALLOCATE 结构的 hResource 成员中指定用户模式运行时资源句柄。 Direct3D 运行时为资源生成唯一的内核模式句柄,并将其传递回 D3DDDICB_ALLOCATE hKMResource 成员中的用户模式显示驱动程序。 用户模式显示驱动程序可以在命令流中插入内核模式资源句柄,供显示微型端口驱动程序稍后使用。

注意 尽管用户模式资源句柄对于每个用户模式资源创建始终是唯一的,但内核模式资源句柄并不总是唯一的。 当 Direct3D 运行时调用用户模式显示驱动程序的 OpenResource 函数以打开现有共享资源的视图时,运行时会在 pResource 参数指向的D3DDDIARG_OPENRESOURCE结构的 hKMResource 成员中传递资源的内核模式句柄。 运行时之前在运行时调用用户模式显示驱动程序的 CreateResource 函数之后创建了此内核模式句柄。

若要销毁 CreateResource 或 OpenResource 创建的用户模式资源,Direct3D 运行时在调用用户模式显示驱动程序的 DestroyResource 函数时传递 hResource 参数中的用户模式驱动程序资源句柄。 若要释放内核模式资源句柄以及与用户模式资源关联的所有分配,用户模式显示驱动程序在调用 pfnDeallocateCb 函数时,将 pData 参数指向的 D3DDDICB_DEALLOCATE 结构的 hResource 成员中传递用户模式运行时资源句柄。

当用户模式显示驱动程序创建和销毁资源时,请考虑以下各项:

  • 对于用户模式显示驱动程序为响应共享资源而创建的分配 (即,响应在 D3DDDIARG_CREATERESOURCE) 的 Flags 成员中设置了 SharedResource 位字段标志的 CreateResource 调用,驱动程序必须为 D3DDDICB_ALLOCATE 的 hResource 成员分配非 NULL 值。
  • 对于用户模式显示驱动程序为响应非共享资源而创建的分配,驱动程序不需要将非 NULL 值分配给 D3DDDICB_ALLOCATE 的 hResource 成员。 如果驱动程序将 NULL 分配给 hResource,则分配与设备关联,而不是与特定资源关联, (和内核模式资源句柄) 。 但是,如果分配确实与资源相关,则驱动程序应将分配与该资源相关联。 注意仅当用户模式显示驱动程序将 D3DDDICB_ALLOCATE 的 hResource 成员设置为驱动程序在调用 CreateResource 时从 D3DDDIARG_CREATERESOURCE 结构的 hResource 成员接收的用户模式运行时资源句柄时,才会创建内核模式资源句柄。
  • 调用 DestroyResource 以销毁非共享用户模式资源时,仅当驱动程序从未将任何分配与资源关联时,用户模式显示驱动程序才能调用 pfnDeallocateCb,D3DDDICB_DEALLOCATE的 hResource 成员设置为 NULL。 如果用户模式显示驱动程序与资源关联的分配,驱动程序必须调用 pfnDeallocateCb ,D3DDDICB_DEALLOCATE hResource 成员设置为非 NULL 值;否则,将发生内存泄漏。
相关推荐
木心术14 小时前
Windows系统下MySQL与AI工具集成方案:数据存储与调用实践
人工智能·windows·mysql
高翔·权衡之境5 小时前
主题10:实时性——硬实时与软实时
服务器·网络·驱动开发·信息与通信·智能硬件
beyond阿亮5 小时前
Hermes Agent快速接入 QQ 完整教程|QQ聊天使用AI智能体
人工智能·windows·ai·openclaw·hermes agent
DONSEE广东东信智能读卡器5 小时前
用PowerShell实现Windows 本地 WSS/HTTPS 自签名证书配置方法
windows·网络协议·https·powershell·身份证阅读器
DogDaoDao8 小时前
Windows 下 Git 报错:`touch` 无法识别 —— 原因分析与 7 种解决方案(从入门到精通)
windows·git·程序员·npm·powershell·cmd·touch
不怕犯错,就怕不做9 小时前
ARM设备异常断电容易造成数据损坏,硬件如何设计
linux·驱动开发·嵌入式硬件
Ai.den9 小时前
Windows 安装 MinerU 3.x 实现本地批量解析 PDF
人工智能·windows·ai
xfddlm10 小时前
在Windows上配置Claude Code
windows
AI行业学习10 小时前
Notepad++ 下载+安装+插件集合 完整教程(Windows,安全无捆绑)
windows·notepad++
__zRainy__11 小时前
uni-app 全局容器实战系列(二):Vite 虚拟模块
windows·uni-app