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 值;否则,将发生内存泄漏。
相关推荐
IT小哥哥呀2 分钟前
如何从 Windows SSH 进入 VirtualBox Ubuntu 虚拟机——密码认证(逐步指南)
linux·windows·ubuntu·ssh·教程·虚拟机
XI锐真的烦4 分钟前
Flutter Windows 下“Running Gradle task ‘assembleDebug‘...” 卡住一整天的终极解决办法
windows·flutter
神秘人-解说2 小时前
在Mac上安装Windows 11/10双系统(M1/M2/Intel通用)
windows·macos·mac安装双系统·mac安装虚拟机·mac安装windows
人工智能训练2 小时前
Windows中如何将Docker安装在E盘并将Docker的镜像和容器存储在E盘的安装目录下
linux·运维·前端·人工智能·windows·docker·容器
k***92164 小时前
如何在Windows系统上安装和配置Node.js及Node版本管理器(nvm)
windows·node.js
q***92515 小时前
PHP搭建开发环境(Windows系统)
开发语言·windows·php
IccBoY6 小时前
将idea快捷打开加入到鼠标右键
windows·intellij-idea·idea
WXDcsdn6 小时前
联想台式机更换硬盘(Win10转Win7)后鼠标和键盘无法使用
运维·windows·it运维
zt1985q7 小时前
本地部署 Jupyter 并实现外部访问(Windows 版本)
运维·服务器·windows
x***J3488 小时前
测试驱动开发:从单元测试到集成测试
驱动开发·单元测试·集成测试