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 值;否则,将发生内存泄漏。
相关推荐
qq_3692243315 天前
Windows全系通用!ntdll.dll文件丢失、报错、闪退问题的完整排查与修复教程
windows·dll·dll修复·dll丢失·dll错误
阿米亚波15 天前
【Windows】QEMU 启动 openEuler aarch64/arm64 架构系统 + 离线软件源
linux·windows·经验分享·笔记·架构·arm
世微 如初15 天前
AP5125大功率LED恒流驱动实战:地摊灯项目从原理图到调试笔记
驱动开发·芯片·led电源驱动·降压恒流ic
caimouse15 天前
Reactos 第 10 章 网络操作 — 10.3.1 NIC驱动
网络·windows
ScilogyHunter15 天前
Zephyr串口驱动开发及构建完全指南
驱动开发·uart·zephyr
初圣魔门首席弟子15 天前
Node.js 详细介绍(知识库版)
windows·qt·node.js·知识库
_Emma_15 天前
【DRM&Graphic】Linux图形与显示框架
linux·驱动开发·图形渲染·显示器
董厂长15 天前
Loop Engineering:停止手动提示,开始设计自动提示的系统
大数据·人工智能·驱动开发·llm
CHENG-JustDoIt15 天前
AI工具 | 爆火开源项目Odysseus AI 工作台:从项目介绍、部署情况及其使用等多方位分析指南(含详细步骤)
大数据·人工智能·windows·python·ai·开源·github
kingbal15 天前
Windows:flutter环境搭建
windows·flutter