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 值;否则,将发生内存泄漏。
相关推荐
欢乐熊嵌入式编程11 小时前
嵌入式 LCD 驱动开发全流程详解
驱动开发·嵌入式开发·嵌入式学习·嵌入式如何快速入门
yuanmenghao11 小时前
CAN系列 — (6) CAN FD 带宽、CPU、中断:工程上是如何一起算的?
网络·驱动开发·单片机·mcu·自动驾驶·信息与通信
码农水水12 小时前
中国邮政Java面试:热点Key的探测和本地缓存方案
java·开发语言·windows·缓存·面试·职场和发展·kafka
沫离痕13 小时前
windows安装docker实例
windows·docker·容器
桌面运维家14 小时前
vDisk VOI架构IO瓶颈怎么办?Windows优化实战
windows·架构
非凡ghost17 小时前
MPC-QT视频播放器(基于Qt框架播放器)
开发语言·windows·qt·音视频·软件需求
ysy164806723917 小时前
Docker安装(Windows版)
windows·docker·容器
珂玥c19 小时前
windows系统nfs挂载
运维·windows·ssh·remmina·cygwin
wok15720 小时前
Windows 上使用 Docker Desktop 教程
windows·docker·容器
希赛网20 小时前
网工备考,华为ENSP基础配置命令(下)
windows·计算机网络·网络工程师·华为认证·ensp·路由交换·网工备考