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

Windows 图形显示驱动开发-WDDM 1.2功能~显示设备的容器id支持

容器 ID 设备驱动程序接口 (DDI)

在显示微型端口驱动程序中实现此函数和结构:

  • DxgkDdiGetChildContainerId
  • DXGK_CHILD_CONTAINER_ID

容器 ID 说明 

监视设备中的新功能可以提供更好的用户体验。 具体而言,通用串行总线 (USB) 集线器是监视器上用于连接鼠标和键盘的常用连接器。 此外,HDMI 等连接器支持音频,因此音频扬声器也嵌入在监视器中。 许多新的显示设备都支持触摸功能。 这可以通过减少用户桌面上的线路混乱来提供出色的用户体验。

以直观的方式向用户直观地呈现这些设备的连接和状态非常重要。 “设备和打印机”页是随 Windows 7 一起引入的。 如下图所示,“设备和打印机”文件夹向用户显示连接到电脑的已安装设备,从而提供了一种在打印机、音乐播放器、相机、鼠标或数字相框上检查的简单方法, (仅举几) 。 同时,此页面对包含在同一硬件中的设备进行分组,以便用户更轻松地发现其所有驱动程序。

 

借助 Windows 7,Microsoft 为设备引入了 容器 ID 的概念:“系统提供的设备标识字符串,用于唯一地对与计算机上安装的单功能或多功能设备关联的功能设备进行分组。”

要使容器 ID 概念成功,Windows 中的所有设备类都必须支持它,并且整个生态系统需要在硬件中实现它。 在 Windows 7 中,如果插入了多个支持音频的监视器,则用户很难确定哪个显示器映射到哪个音频终结点。 触摸数字化器也存在同样的困难。 在 Windows 8 中,显示设备类添加了对容器 ID 的支持。 这使得显示设备的所有功能都可以报告相同的容器 ID,并在 Windows 用户界面和 API 中直观地配对。

容器 ID 用户方案

对于嵌入音频扬声器的监视器,请考虑以下工作流:

  1. 用户使用 HDMI 电缆连接监视器。
  2. WDDM 驱动程序向 Windows 图形堆栈报告显示设备的存在。
  3. Windows 图形堆栈使用设备驱动程序接口 (随 Windows 8 引入的 DDI) 查询 WDDM 驱动程序以获取容器 ID。
  4. 显示驱动程序在监视器中查询容器 ID,并将其传递回 Windows。
  5. 同时,音频驱动程序必须将完全相同的容器 ID 传递给 Windows 音频堆栈。
  6. 如果在 “设备和打印机 ”控制面板中查看,则显示器和扬声器将组合在一起。

多设备聚合与显示-音频同步

一、典型应用场景:带音频的显示器设备

1.硬件配置:

  • 显示器内置扬声器(通过HDMI/DP传输音频)

  • 支持EDID 2.0+的显示面板

  • WDDM 1.2+兼容的GPU驱动

 用户操作流:

sequenceDiagramparticipant Userparticipant Monitorparticipant WDDM_Driverparticipant Windows_Graphicsparticipant Audio_DriverUser->>Monitor: 连接HDMI线缆Monitor->>WDDM_Driver: 发送EDID(含容器ID)WDDM_Driver->>Windows_Graphics: 报告显示设备(DXGK_DISPLAY_INFORMATION)Windows_Graphics->>WDDM_Driver: 调用DXGKDDI_QUERY_CONTAINER_IDWDDM_Driver->>Monitor: 查询容器ID(通过DDC/CI或I2C)WDDM_Driver->>Windows_Graphics: 返回容器IDWindows_Graphics->>Audio_Driver: 同步相同容器IDNote over Windows_Graphics,Audio_Driver: 设备和打印机中聚合显示设备与音频端点

二、容器ID传递的三种模式

   1.理想情况(显示器提供容器ID)

  • 数据来源:EDID的VSDB区块(Offset 0x50-0x6F)

  • 格式要求:

typedef struct _CONTAINER_ID_DESCRIPTOR {UCHAR bDescriptorType;  // 固定值0x83UCHAR bContainerID[16]; // GUID格式
} CONTAINER_ID_DESCRIPTOR;

    2.自动生成模式(无显式容器ID)

  • 生成算法

    # 基于EDID的PNS三元组生成GUID
    def generate_container_id(edid):manufacturer = edid[0x08:0x0A]  # 2字节制造商IDproduct_code = edid[0x0B:0x0D]  # 2字节产品码serial = edid[0x0C:0x10]        # 4字节序列号return uuid.uuid5(uuid.NAMESPACE_URL, f"Display/{manufacturer:04X}-{product_code:04X}-{serial:08X}")

    3.设备所有权转换时的异常处理

  • GPU驱动重置(如TDR超时恢复)

  • 显示器热插拔事件

  • 固件模式切换(如HDR开关

  • 固件模式切换(如HDR开关)

      4.系统行为 

阶段操作用户可见现象
所有权释放驱动调用DxgkCbReleaseDevice屏幕闪烁1-2秒
容器ID重新协商Windows发起IRP_MN_QUERY_ID(BusQueryContainerID)设备管理器短暂刷新
音频端点重建音频堆栈收到DEVICE_INTERFACE_ARRIVAL通知扬声器设备短暂断开

三、厂商实施检查清单

  1. EDID编程:确保VSDB包含有效容器ID(可通过AW EDID Editor验证)
  2. 驱动测试:通过WHCK的Device.Graphics.DisplayContainerID测试项
  3. 音频同步:验证扬声器属性页显示的容器ID与显示器一致
  4. 热插拔测试:重复插拔50次检查容器ID稳定性

注意:对于USB-C Dock等多功能设备,需确保所有子设备(网络/存储/音频)共享同一容器ID

相关文章:

  • 双链表各种操作实现(数据结构C语言多文件编写)
  • QT中多线程写法
  • 摄影测量——单像空间后方交会
  • AI知识补全(十六):A2A - 谷歌开源的agent通信协议是什么?
  • 集成学习介绍
  • 【YOLOv8改进 - 特征融合】EFC: 基于增强层间特征关联的轻量级即插即用融合策略,即插即用适,用于小目标检测
  • AIP-233 批量方法:Create
  • 中和农信的“三农”服务密码:科技+标准化助力乡村振兴
  • React中 点击事件写法 的注意(this、箭头函数)
  • 【React】基本语法
  • 浙江大学DeepSeek系列专题线上公开课第二季第五期即将上线!deepseek音乐创作最强玩法来了!
  • python: audioFlux XXCC 提取梅尔频率倒谱系数 MFCC
  • day30 第八章 贪心算法 part04
  • 阳台光伏 “WiFi” 电表:开启智慧能源新纪元/出海欧标认证!
  • 2025高频面试算法总结篇【动态规划】
  • Spark-SQL核心编程:DataFrame、DataSet与RDD深度解析
  • leetcode:1351. 统计有序矩阵中的负数(python3解法)
  • SQL学习笔记-聚合查询
  • 16:00开始面试,16:08就出来了,问的问题有点变态。。。
  • 大数据学习栈记——MongoDB编程
  • 山东鄄城发生一起交通事故,造成4人死亡、2人受伤
  • 中美大幅下调超100%关税,印巴四日“战争”复盘|907编辑部
  • 中国科考船在钓鱼岛附近活动,外交部:完全是中国主权权利范围内的事
  • 苹果或将于2027年推出由玻璃制成的曲面iPhone
  • 专访|日本驻华大使金杉宪治:对美、对华外交必须在保持平衡的基础上稳步推进
  • 苏东坡:人生就是哈哈哈哈哈