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 值;否则,将发生内存泄漏。
相关推荐
Hello.Reader7 小时前
Flink State V2 实战从同步到异步的跃迁
网络·windows·flink
mucheni9 小时前
迅为RK3568开发板OpenHarmony系统南向驱动开发手册-实操-HDF驱动配置LED-新增topeet子系统
驱动开发
皓月盈江11 小时前
Windows系统如何批量添加防火墙策略禁止端口入和出?
windows·netsh·批量添加防火墙策略·禁止端口入和出
EnCi Zheng21 小时前
SpringBoot + PostgreSQL 密码认证失败 Windows 系统解决方案
windows·spring boot·postgresql
Damon小智1 天前
玩转CodeX:CodeX安装教程(Windows+Linux+MacOS)
linux·windows·macos·ai·ai编程·codex·gpt-5
用户31187945592181 天前
DOpusInstall-13.2.exe 安装方法,简单几步完成
windows
张某人的胡思乱想1 天前
Create/Assemble/Link x64 Windows
windows
ThisIsMirror1 天前
CompletableFuture并行任务超时处理模板
java·windows·python
say_fall1 天前
精通C语言(2.结构体)(内含彩虹)
c语言·开发语言·windows