营销型网站应必备的七大功能2345网址导航官网官方电脑版下载
在 GPU0 和 GPU1 之间共享数据
在某些情况下,也许可以在某些时候带来更好的用户体验:
- GPU0 和 GPU1 来自同一个 IHV。
- GPU0 可以将操作系统无法解读的显示配置相关信息传递给 GPU1。
数据 Blob 由 GUID 描述,如果 GPU1 的驱动程序能理解数据 Blob,它就能快速识别。 在高级层面上,OS 会调用 GPU0 在切换之前获取 Blob GUID 和数据,并在要求 GPU1 在显示屏中进行 HPD 之前将其传递给 GPU1。
GPU1 的驱动程序负责:
- 检查它是否能理解 Blob 的 GUID。
- 验证 Blob 中的每个数据元素,避免 Blob 中格式不正确的数据带来任何不利影响。
驱动程序互操作性
如果 WDDM 驱动程序支持 ADS,那么无论它在哪个 OEM 系统上运行,也无论系统上的其他 GPU 是什么,它都需要支持 ADS。
切换序列
虽然从技术上讲,当 GPU 的驱动程序停止运行时,可以从该 GPU 切换到其他 GPU,但目前还不支持此方案。 因此,仅当两个 GPU 都加载了支持切换 DDI 的驱动程序后,才会进行切换。
以下序列是面板激活时整个切换序列的高级视图,其中 GPU0 和 GPU1 分别代表 iGPU 和 dGPU。 GPU0 目前通过多路复用器连接到内部面板,我们希望切换到 GPU1 扫描到面板。
1.在 API 层面进行切换调用。
2. OS 会收集当前内部面板状态的属性(HDR、模式、刷新率等),并检查临时显示模式。
3.由于系统中任何 GPU 都会产生 HPD,因此 OS 会禁止执行任何显示拓扑。
4.OS 调用 GPU1 驱动程序的 DxgkDdiDisplayMuxPreSwitchTo 并传递当前亮度级别。 只有在 lid 打开时,驱动程序才应执行以下操作:
- 开启面板电源。
- 设置亮度启用信号。
- 设置 OS 传递的亮度级别。
5.OS 禁用在 GPU0 上调用 DxgkDdiQueryConnectionChange,以确保在切换多路复用器之前无法处理另一个方向的 lid HPD。
6.OS 调用 GPU0 驱动程序的 DxgkDdiDisplayMuxPreSwitchAway DDI。 驱动应:
- 如果 lid 处于活动状态,则启用面板上的 PSR1(面板自我刷新 1),并确保在 OS 稍后请求禁用之前不会被禁用。
- 将数据包添加到其连接更改列表中,DXGK_CONNECTION_CHANGE 的 ConnectionStatus 设置为 MonitorStatusDisconnected,MonitorConnect.MonitorConnectFlags.DisplayMuxConnectionChange 设置为 1。
- GPU0 无法向其队列中添加任何 lid 目标的连接更改数据包。 OS bug 会检查它是否这样做。
- 将任何私有 ADS 数据块的大小(包括 GUID 和数据)返回给操作系统。 如果 GPU0 驱动程序调用失败,则需要确保在返回之前删除所有放入队列的 ADS 连接状态数据包。
7.如果 GPU0 的驱动程序返回的专用数据大小不为零,OS 就会分配该大小,并将其传递给 GPU0 的 DxgkDdiDisplayMuxPreSwitchAwayGetPrivateData 回调,以获取专用切换数据。
8. OS 调用 mux 的 ACPI 方法从 GPU0 切换到 GPU1。
9. OS 会再次调用 GPU0 的 DxgkDdiQueryConnectionChange。
10. OS 调用 GPU0 的 DxgkDdiQueryConnectionChanges 来处理 MonitorStatusDisconnected 连接数据包,其中 DisplayMuxConnectionChange 设置为 1。
11. OS 会调用 GPU0 的 DxgkddiSettimingsfromvidpn 来停用正在切换的显示路径。 GPU0 的驱动程序应:
- 关闭面板电源。
- 禁用亮度信号。
- 停止向多路复用器发送亮度级别。
12. OS 处理显示背离。 它不会触发拓扑更改,以避免不必要的拓扑更改。
13. OS 调用 GPU1 的 DxgkDdiDisplayMuxPostSwitchToPhase1 回调,并传递从 GPU0 获取的任何 ADS 专用 blob。 驱动应:
- 确定 lid 处于打开还是关闭状态。
- 使用 DXGK_CONNECTION_CHANGE 将数据包添加到其连接更改列表中:
- MonitorConnect.MonitorConnectFlags.DisplayMuxConnectionChange 位集。
- 如果 lid 打开,则 ConnectionStatus 设置为 MonitorStatusConnected;如果 lid 关闭,则设置为 MonitorStatusDisconnected。
- 如果 lid 关闭,则关闭电源和面板的亮度启用信号。
14. 如果 OS 尚未为 GPU1 的内部目标调用 DxgkDdiQueryAdapterInfo 和 DXGKQAITYPE_INTEGRATED_DISPLAY_DESCRIPTOR2,则它会进行调用。 调用后,OS 还会调用 DxgkDdiQueryDeviceDescriptor。
15.OS 调用 GPU1 的 DxgkDdiQueryConnectionChange,以便处理其连接更改列表中的事件。 此调用将导致 DxgkDdiQueryDeviceDescriptor 被调用,以用于正在进行 HPD 的新监视器。
16. OS 可显示 HPD 引起的拓扑变化。
17. OS 将异步处理来自 GPU0 和 GPU1 的连接数据包,DisplayMuxConnectionChange 设置为 1。
18. 如果 GPU1 已排队 MonitorStatusConnected:
- OS 调用 GPU1 的 DWM 函数来枚举模式。
- 在 GPU1 上调用 DxgkddiSettimingsfromvidpn 来激活显示路径。
- DWM 将帧渲染并呈现到 GPU1 的显示路径上。
- OS 等待第一个帧被显示出来。
19. OS 会调用 GPU1 的 DxgkDdiDisplayMuxPostSwitchToPhase2 回调,如果 MonitorStatusConnected 被 GPU1 排在队列中,则驱动程序应关闭 PSR1 显示;否则,它不执行任何操作。
20. OS 调用 GPU0 的 DxgkDdiDisplayMuxPreSwitchAway。 虽然没有预期的驱动程序操作,但该调用对于任何与切换相关的驱动程序清理或记帐都很有用。
21. OS 会收集当前内部面板状态的属性。 如果面板状态与之前保存的状态不同,则 OS 就会触发遥测。
iGPU->dGPU 和 dGPU->iGPU 的切换序列相同。 当面板处于非活动状态时,可能需要切换多路复用器。 在这种情况下,不需要此序列,操作系统只需在复用器上调用 ACPI 方法即可切换。
大多数 OS 都不知道驱动程序处于 PSR 模式。 因此,尽管用户看不到这些情况,但驱动程序仍需要生成 Vsync 同步、报告翻转完成等。