当前位置: 首页 > 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…...

JavaSec-RCE

简介 RCE(Remote Code Execution)&#xff0c;可以分为:命令注入(Command Injection)、代码注入(Code Injection) 代码注入 1.漏洞场景&#xff1a;Groovy代码注入 Groovy是一种基于JVM的动态语言&#xff0c;语法简洁&#xff0c;支持闭包、动态类型和Java互操作性&#xff0c…...

DockerHub与私有镜像仓库在容器化中的应用与管理

哈喽&#xff0c;大家好&#xff0c;我是左手python&#xff01; Docker Hub的应用与管理 Docker Hub的基本概念与使用方法 Docker Hub是Docker官方提供的一个公共镜像仓库&#xff0c;用户可以在其中找到各种操作系统、软件和应用的镜像。开发者可以通过Docker Hub轻松获取所…...

【位运算】消失的两个数字(hard)

消失的两个数字&#xff08;hard&#xff09; 题⽬描述&#xff1a;解法&#xff08;位运算&#xff09;&#xff1a;Java 算法代码&#xff1a;更简便代码 题⽬链接&#xff1a;⾯试题 17.19. 消失的两个数字 题⽬描述&#xff1a; 给定⼀个数组&#xff0c;包含从 1 到 N 所有…...

可靠性+灵活性:电力载波技术在楼宇自控中的核心价值

可靠性灵活性&#xff1a;电力载波技术在楼宇自控中的核心价值 在智能楼宇的自动化控制中&#xff0c;电力载波技术&#xff08;PLC&#xff09;凭借其独特的优势&#xff0c;正成为构建高效、稳定、灵活系统的核心解决方案。它利用现有电力线路传输数据&#xff0c;无需额外布…...

AtCoder 第409​场初级竞赛 A~E题解

A Conflict 【题目链接】 原题链接&#xff1a;A - Conflict 【考点】 枚举 【题目大意】 找到是否有两人都想要的物品。 【解析】 遍历两端字符串&#xff0c;只有在同时为 o 时输出 Yes 并结束程序&#xff0c;否则输出 No。 【难度】 GESP三级 【代码参考】 #i…...

Go 语言接口详解

Go 语言接口详解 核心概念 接口定义 在 Go 语言中&#xff0c;接口是一种抽象类型&#xff0c;它定义了一组方法的集合&#xff1a; // 定义接口 type Shape interface {Area() float64Perimeter() float64 } 接口实现 Go 接口的实现是隐式的&#xff1a; // 矩形结构体…...

【配置 YOLOX 用于按目录分类的图片数据集】

现在的图标点选越来越多&#xff0c;如何一步解决&#xff0c;采用 YOLOX 目标检测模式则可以轻松解决 要在 YOLOX 中使用按目录分类的图片数据集&#xff08;每个目录代表一个类别&#xff0c;目录下是该类别的所有图片&#xff09;&#xff0c;你需要进行以下配置步骤&#x…...

【开发技术】.Net使用FFmpeg视频特定帧上绘制内容

目录 一、目的 二、解决方案 2.1 什么是FFmpeg 2.2 FFmpeg主要功能 2.3 使用Xabe.FFmpeg调用FFmpeg功能 2.4 使用 FFmpeg 的 drawbox 滤镜来绘制 ROI 三、总结 一、目的 当前市场上有很多目标检测智能识别的相关算法&#xff0c;当前调用一个医疗行业的AI识别算法后返回…...

Element Plus 表单(el-form)中关于正整数输入的校验规则

目录 1 单个正整数输入1.1 模板1.2 校验规则 2 两个正整数输入&#xff08;联动&#xff09;2.1 模板2.2 校验规则2.3 CSS 1 单个正整数输入 1.1 模板 <el-formref"formRef":model"formData":rules"formRules"label-width"150px"…...

鸿蒙DevEco Studio HarmonyOS 5跑酷小游戏实现指南

1. 项目概述 本跑酷小游戏基于鸿蒙HarmonyOS 5开发&#xff0c;使用DevEco Studio作为开发工具&#xff0c;采用Java语言实现&#xff0c;包含角色控制、障碍物生成和分数计算系统。 2. 项目结构 /src/main/java/com/example/runner/├── MainAbilitySlice.java // 主界…...