Windows 图形显示驱动开发-WDDM的操作流

news/2025/2/22 14:10:44/

下图显示了从创建呈现设备到显示内容时发生的 WDDM 操作流。 下图后面的信息更详细地描述了操作流的有序顺序。

创建渲染设备

应用程序请求创建呈现设备后:

1:DirectX 图形内核子系统 (Dxgkrnl) 调用内核模式显示微型端口驱动程序的 (KMD) DxgkDdiCreateDevice 函数。

KMD 通过返回指向DXGKARG_CREATEDEVICE结构的 pInfo 成员中填充DXGK_DEVICEINFO结构的指针来初始化直接内存访问(DMA)。

2:如果对 DxgkDdiCreateDevice 的调用成功,Direct3D 运行时将调用用户模式显示驱动程序 (UMD) CreateDevice 函数。

3:在 CreateDevice 调用中,UMD 必须显式调用运行时的 pfnCreateContextCb 函数来创建一个或多个 GPU 上下文,这些上下文是新创建的设备上的 GPU 执行线程。 运行时将信息返回到 pCommandBuffer 和 CommandBufferSize D3DDDICB_CREATECONTEXT 结构中的 UMD,以初始化命令缓冲区。

为设备创建 Surface

应用程序请求为呈现设备创建图面后:

4:Direct3D 运行时调用 UMD 的 CreateResource 函数。

5:CreateResource 调用运行时提供的 pfnAllocateCb 函数。

6:运行时调用 KMD 的 DxgkDdiCreateAllocation 函数,指定要创建的分配的数量和类型。 DxgkDdiCreateAllocation 返回有关DXGKARG_CREATEALLOCATION结构的 pAllocationInfo 成员中DXGK_ALLOCATIONINFO结构数组中分配的信息。

将命令缓冲区提交到内核模式

在应用程序请求绘制到图面之后:

7:Direct3D 运行时调用与绘图操作相关的 UMD 函数, 例如 DrawPrimitive2。

8:Direct3D 运行时调用 UMD 的 Present 或 Flush 函数,使命令缓冲区提交到内核模式。 注意:UMD 还会在命令缓冲区已满时提交命令缓冲区。

9:响应步骤 8,UMD 调用以下运行时提供的函数之一:

如果调用 Present,则运行时的 pfnPresentCb 函数。
如果调用 Flush 或命令缓冲区已满,则运行时的 pfnRenderCb 函数。
10:调用 pfnPresentCb 时调用 KMD 的 DxgkDdiPresent 函数;如果调用 pfnRenderCb,则调用 DxgkDdiRender 或 DxgkDdiRenderKm 函数。 KMD 会验证命令缓冲区,以硬件格式写入 DMA 缓冲区,并生成描述所用图面的分配列表。

将 DMA 缓冲区提交到硬件

11:Dxgkrnl 调用 KMD 的 DxgkDdiBuildPagingBuffer 函数,以创建专用 DMA 缓冲区,用于将分配列表中指定的分配移入和移出 GPU 可访问内存。 这些特殊的 DMA 缓冲区称为分页缓冲区。 不为每个帧调用 DxgkDdiBuildPagingBuffer 。

12:Dxgkrnl 调用 KMD 的 DxgkDdiSubmitCommand 函数,将分页缓冲区排队到 GPU 执行单元。

13:Dxgkrnl 调用 KMD 的 DxgkDdiPatch 函数,以将物理地址分配给 DMA 缓冲区中的资源。

14:Dxgkrnl 调用 KMD 的 DxgkDdiSubmitCommand 函数,将 DMA 缓冲区排队到 GPU 执行单元。 提交到 GPU 的每个 DMA 缓冲区都包含一个围栏标识符,该标识符是一个数字。 GPU 处理完 DMA 缓冲区后,GPU 将生成中断。

15:KMD 在其 DxgkDdiInterruptRoutine 函数中收到中断的通知。 KMD 应从 GPU 读取刚刚完成的 DMA 缓冲区的围栏标识符。

16:KMD 应调用 DxgkCbNotifyInterrupt ,通知 DXGK DMA 缓冲区已完成。 KMD 还应调用 DxgkCbQueueDpc 来排队延迟的过程调用(DPC)。


http://www.ppmy.cn/news/1572086.html

相关文章

Django开发入门 – 3.用Django创建一个Web项目

Django开发入门 – 3.用Django创建一个Web项目 Build A Web Based Project With Django By JacksonML 本文简要介绍如何利用最新版Python 3.13.2来搭建Django环境,以及创建第一个Django Web应用项目,并能够运行Django Web服务器。 创建该Django项目需…

【Unity新手】Text不显示字的问题解决办法

很多同学在unity里导入了一个Text发现字没有显示出来为什么呢? 首先在网络上下载一个.ttf或者.otf字体文件,导入资源,比如说我下载了黑体.otf 然后导入unity,右键字体TextMesgPro-FontAsset 然后字体设置里添加上就可以了

【MySQL】高频 SQL 50 题(基础版)

高频SQL50题(基础版) 1.查询 2.连接 MySQL多表查询(联合查询、连接查询、子查询) left join 左连接 我们首先执行LEFT JOIN操作,将两个表的数据基于 id 列进行组合。同样,我们使用 LEFT JOIN 来确保将所…

【工业场景】用YOLOv8实现火灾识别

火灾识别任务是工业领域急需关注的重点安全事项,其应用场景和背景意义主要体现在以下几个方面: 应用场景:工业场所:在工厂、仓库等工业场所中,火灾是造成重大财产损失和人员伤亡的主要原因之一。利用火灾识别技术可以及时发现火灾迹象,采取相应的应急措施,保障人员安全和…

WPS中如何批量上下居中对齐word表格中的所有文字

大家好,我是小鱼。 在日常制作Word表格时,经常需要对表格中的内容进行排版。经常会把文字设置成左对齐、居中对齐或者是右对齐,这些对齐方式都比较好设置,有时制作的表格需要把文字批量上下居中对齐,轻松几步就可以搞…

基于SpringBoot的“高考志愿智能推荐系统”的设计与实现(源码+数据库+文档+PPT)

基于SpringBoot的“高考志愿智能推荐系统”的设计与实现(源码数据库文档PPT) 开发语言:Java 数据库:MySQL 技术:SpringBoot 工具:IDEA/Ecilpse、Navicat、Maven 系统展示 系统总体结构图 系统首页界面 系统注册页…

IDEA中打包maven项目,提示Compilation failure

使用IDEA打包maven项目&#xff0c;报错如下&#xff1a; 解决方法&#xff1a;在pom文件中指定JDK版本即可 <properties><maven.compiler.source>17</maven.compiler.source><maven.compiler.target>17</maven.compiler.target> </propertie…

Android Handler的机制跟源码分析

一、消息机制 在应用启动时,会执行 main() 方法, main() 会创建一个 Looper 对象,然后开启一个死循环,目的是不断从 消息队列 MessageQueue 里面取出 Message 对象并处理。 在Android中使用消息机制,会优先想到的是Handler。Handler可以轻松的将一个任务切换到Handler所在…