当前位置: 首页 > news >正文

Windows 图形显示驱动开发-WDDM 3.2-自动显示切换(二)

在 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 同步、报告翻转完成等。

相关文章:

Windows 图形显示驱动开发-WDDM 3.2-自动显示切换(二)

在 GPU0 和 GPU1 之间共享数据 在某些情况下,也许可以在某些时候带来更好的用户体验: GPU0 和 GPU1 来自同一个 IHV。GPU0 可以将操作系统无法解读的显示配置相关信息传递给 GPU1。 数据 Blob 由 GUID 描述,如果 GPU1 的驱动程序能理解数据…...

基于CentOS7安装kubesphere和Kubernetes并接入外部ES收集日志

一、修改所有节点主机名 主节点就修改成master hostnamectl set-hostname master 然后输入bash刷新当前主机名 工作节点1就修改成node1 hostnamectl set-hostname node1 然后输入bash刷新当前主机名 二、全部节点安装依赖并同步时间 yum -y install socat conntrack ebta…...

软考教材重点内容 信息安全工程师 第17章 网络安全应急响应技术原理与应用

17.1 网络安全应急响应概述 网络安全应急响应是针对潜在发生的网络安全事件而采取的网络安全措施。 17.1.1 网络安全应急响应概念 网络安全应急响应是指为应对网络安全事件,相关人员或组织机构对网络安全事件进行监测、预警、分析、响应和恢复等工作。 17.2.3 网络安…...

使用 DeepSeek + OmniParser v2 + UIAutomation 实现 GUI 应用自动化测试的探索

一、背景 UI 自动化测试一直是软件开发中的难点之一。尽管有许多工具和技术(如 Selenium、Appium 等)可以帮助我们实现自动化测试,但这些工具在面对复杂的 UI 变化时,往往需要大量的维护工作。随着人工智能技术的进步,尤其是自然语言处理(NLP)和计算机视觉(CV)技术的…...

Spring Security面试题

Spring Security面试题 基础概念 Q1: Spring Security的核心功能有哪些? public class SecurityBasicDemo {// 1. 基本配置public class SecurityConfigExample {public void configDemo() {ConfigurationEnableWebSecuritypublic class SecurityConfig extends …...

从零开始构建基于DeepSeek的智能客服系统

在当今的数字化时代,智能客服系统已经成为企业与客户沟通的重要桥梁。它不仅能够提升客户体验,还能大幅降低企业的运营成本。本文将带领你从零开始,使用PHP和DeepSeek技术构建一个功能强大的智能客服系统。我们将通过具体的案例和代码示例,深入探讨如何实现这一目标。 1. …...

Linux故障排查和性能优化面试题及参考答案

目录 如何查看 Linux 系统中的 CPU、内存、磁盘等资源使用情况? 什么是 Linux 中的负载(Load Average)?如何解读它? 如何通过 top 和 htop 命令监控系统性能? 如何使用 mpstat 命令来查看 CPU 的利用情况? 如何分析系统 CPU 瓶颈? 如何分析 CPU 瓶颈?如何优化 CP…...

【无人集群系列---大疆无人集群技术进展、技术路线与未来发展方向】

大疆无人集群技术进展、技术路线与未来发展方向 一、技术进展1. 核心技术创新(1)集群协同控制技术(2)感知与能源系统升级 2. 行业应用落地(1)智慧城市与安防(2)应急救援(…...

【亲测有效】百度Ueditor富文本编辑器添加插入视频、视频不显示、和插入视频后二次编辑视频标签不显示,显示成img标签,二次保存视频被替换问题,解决方案

【亲测有效】项目使用百度Ueditor富文本编辑器上传视频相关操作问题 1.百度Ueditor富文本编辑器添加插入视频、视频不显示 2.百度Ueditor富文本编辑器插入视频后二次编辑视频标签不显示,在编辑器内显示成img标签,二次保存视频被替换问题 问题1&#xff1…...

ubuntu windows双系统踩坑

我有个台式机,先安装的ubuntu,本来想专门用来做开发,后面儿子长大了,给他看了一下星际争霸、魔兽争霸,立马就迷上了。还有一台windows的笔记本,想着可以和他联局域网一起玩,在ubuntu上用wine跑魔…...

嵌入式八股文(五)硬件电路篇

一、名词概念 1. 整流和逆变 (1)整流:整流是将交流电(AC)转变为直流电(DC)。常见的整流电路包括单向整流(二极管)、桥式整流等。 半波整流:只使用交流电的正…...

flink使用demo

1、添加不同数据源 package com.baidu.keyue.deepsight.memory.test;import com.baidu.keyue.deepsight.memory.WordCount; import com.baidu.keyue.deepsight.memory.WordCountData; import org.apache.flink.api.common.RuntimeExecutionMode; import org.apache.flink.api.…...

OpenCV(8):图像直方图

在图像处理中,直方图是一种非常重要的工具,它可以帮助我们了解图像的像素分布情况。通过分析图像的直方图,我们可以进行图像增强、对比度调整、图像分割等操作。 1 什么是图像直方图? 图像直方图是图像像素强度分布的图形表示&am…...

力扣LeetCode:1656 设计有序流

题目: 有 n 个 (id, value) 对,其中 id 是 1 到 n 之间的一个整数,value 是一个字符串。不存在 id 相同的两个 (id, value) 对。 设计一个流,以 任意 顺序获取 n 个 (id, value) 对,并在多次调用时 按 id 递增的顺序…...

NGINX配置TCP负载均衡

前言 之前本人做项目需要用到nginx的tcp负载均衡,这里是当时配置做的笔记;欢迎收藏 关注,本人将会持续更新 文章目录 配置Nginx的负载均衡 配置Nginx的负载均衡 nginx编译安装需要先安装pcre、openssl、zlib等库,也可以直接编译…...

vm和centos

安装 VMware Workstation Pro 1. 下载 VMware Workstation Pro 访问 VMware 官方网站(https://www.vmware.com/cn/products/workstation-pro/workstation-pro-evaluation.html ),在该页面中点击 “立即下载” 按钮,选择适合你操作…...

c#丰田PLC ToyoPuc TCP协议快速读写 to c# Toyota PLC ToyoPuc读写

源代码下载 <------下载地址 历史背景与发展 TOYOPUC协议源于丰田工机&#xff08;TOYODA&#xff09;的自动化技术积累。丰田工机成立于1941年&#xff0c;最初是丰田汽车的机床部门&#xff0c;后独立为专注于工业机械与控制系统的公司。2006年与光洋精工&#xff08;Ko…...

量子计算的数学基础:复数、矩阵和线性代数

量子计算是基于量子力学原理的一种新型计算模式,它与经典计算机在信息处理的方式上有着根本性的区别。在量子计算中,信息的最小单位是量子比特(qubit),而不是传统计算中的比特。量子比特的状态是通过量子力学中的数学工具来描述的,因此,理解量子计算的数学基础对于深入学…...

【JavaScript】《JavaScript高级程序设计 (第4版) 》笔记-Chapter22-处理 XML

二十二、处理 XML 处理 XML XML 曾一度是在互联网上存储和传输结构化数据的标准。XML 的发展反映了 Web 的发展&#xff0c;因为DOM 标准不仅是为了在浏览器中使用&#xff0c;而且还为了在桌面和服务器应用程序中处理 XML 数据结构。在没有 DOM 标准的时候&#xff0c;很多开发…...

一个不错的API测试框架——Karate

Karate 是一款开源的 API 测试工具,基于 BDD(行为驱动开发)框架 Cucumber 构建,但无需编写 Java 或 JavaScript 代码即可直接编写测试用例。它结合了 API 测试、模拟(Mocking)和性能测试功能,支持 HTTP、GraphQL 和 WebSocket 等协议,语法简洁易读。 Karate详细介绍 K…...

Cesium1.95中高性能加载1500个点

一、基本方式&#xff1a; 图标使用.png比.svg性能要好 <template><div id"cesiumContainer"></div><div class"toolbar"><button id"resetButton">重新生成点</button><span id"countDisplay&qu…...

使用分级同态加密防御梯度泄漏

抽象 联邦学习 &#xff08;FL&#xff09; 支持跨分布式客户端进行协作模型训练&#xff0c;而无需共享原始数据&#xff0c;这使其成为在互联和自动驾驶汽车 &#xff08;CAV&#xff09; 等领域保护隐私的机器学习的一种很有前途的方法。然而&#xff0c;最近的研究表明&…...

BCS 2025|百度副总裁陈洋:智能体在安全领域的应用实践

6月5日&#xff0c;2025全球数字经济大会数字安全主论坛暨北京网络安全大会在国家会议中心隆重开幕。百度副总裁陈洋受邀出席&#xff0c;并作《智能体在安全领域的应用实践》主题演讲&#xff0c;分享了在智能体在安全领域的突破性实践。他指出&#xff0c;百度通过将安全能力…...

HDFS分布式存储 zookeeper

hadoop介绍 狭义上hadoop是指apache的一款开源软件 用java语言实现开源框架&#xff0c;允许使用简单的变成模型跨计算机对大型集群进行分布式处理&#xff08;1.海量的数据存储 2.海量数据的计算&#xff09;Hadoop核心组件 hdfs&#xff08;分布式文件存储系统&#xff09;&a…...

mac 安装homebrew (nvm 及git)

mac 安装nvm 及git 万恶之源 mac 安装这些东西离不开Xcode。及homebrew 一、先说安装git步骤 通用&#xff1a; 方法一&#xff1a;使用 Homebrew 安装 Git&#xff08;推荐&#xff09; 步骤如下&#xff1a;打开终端&#xff08;Terminal.app&#xff09; 1.安装 Homebrew…...

【堆垛策略】设计方法

堆垛策略的设计是积木堆叠系统的核心&#xff0c;直接影响堆叠的稳定性、效率和容错能力。以下是分层次的堆垛策略设计方法&#xff0c;涵盖基础规则、优化算法和容错机制&#xff1a; 1. 基础堆垛规则 (1) 物理稳定性优先 重心原则&#xff1a; 大尺寸/重量积木在下&#xf…...

密码学基础——SM4算法

博客主页&#xff1a;christine-rr-CSDN博客 ​​​​专栏主页&#xff1a;密码学 &#x1f4cc; 【今日更新】&#x1f4cc; 对称密码算法——SM4 目录 一、国密SM系列算法概述 二、SM4算法 2.1算法背景 2.2算法特点 2.3 基本部件 2.3.1 S盒 2.3.2 非线性变换 ​编辑…...

echarts使用graphic强行给图增加一个边框(边框根据自己的图形大小设置)- 适用于无法使用dom的样式

pdf-lib https://blog.csdn.net/Shi_haoliu/article/details/148157624?spm1001.2014.3001.5501 为了完成在pdf中导出echarts图&#xff0c;如果边框加在dom上面&#xff0c;pdf-lib导出svg的时候并不会导出边框&#xff0c;所以只能在echarts图上面加边框 grid的边框是在图里…...

Django RBAC项目后端实战 - 03 DRF权限控制实现

项目背景 在上一篇文章中&#xff0c;我们完成了JWT认证系统的集成。本篇文章将实现基于Redis的RBAC权限控制系统&#xff0c;为系统提供细粒度的权限控制。 开发目标 实现基于Redis的权限缓存机制开发DRF权限控制类实现权限管理API配置权限白名单 前置配置 在开始开发权限…...

Python的__call__ 方法

在 Python 中&#xff0c;__call__ 是一个特殊的魔术方法&#xff08;magic method&#xff09;&#xff0c;它允许一个类的实例像函数一样被调用。当你在一个对象后面加上 () 并执行时&#xff08;例如 obj()&#xff09;&#xff0c;Python 会自动调用该对象的 __call__ 方法…...