Windows 图形显示驱动开发-WDDM 2.7功能-MCDM KM 驱动程序实现指南(二)

CPU 主机调节支持

如果支持 CPU 主机调节,则还必须提供指向以下函数的指针:

  • DxgkDdiMapCpuHostAperture
  • DxgkDdiUnmapCpuHostAperture

CPU 主机调节

CPU 主机孔径

对于 32 位 OS 离散图形处理单元 (GPU) 不支持可调整大小的 BAR,或者当调整帧缓冲区 BAR 的大小失败时,Windows 显示驱动程序模型 (WDDM) v2 将提供一种替代机制,通过该机制可以有效地访问离散 GPU VRAM。 对于支持可编程 BAR 地址空间的 GPU,WDDM v2 中引入了新的 CPU 主机光圈功能来抽象该功能。

公开 CPU 主机调节时,内核模式驱动程序会为每个支持 CPU 主机调节的段填充新的 DXGK_CPUHOSTAPERTURE 上限结构。 这定义了 CPU 主机调节的大小,这允许驱动程序保留一些 BAR 供内部使用。 页大小与内存段的 GPU 页相同。

然后,内核模式驱动程序公开两个新的设备驱动程序接口, (DDI) 来管理 BAR 地址空间,尤其是 DxgkDdiMapCpuHostAperture 和 DxgkDdiUnmapCpuHostAperture。

CPU 主机光圈后面的页表的内存由驱动程序管理,并在驱动程序初始化期间提前设置。 DxgkDdiMapCpuHostAperture 和 DxgkDdiUnmapCpuHostAperture 预期在段枚举后立即正常运行,并在视频内存管理器初始化期间使用,以在适配器初始化期间将 CPU 虚拟地址映射到系统分页进程的页目录和页表。

当需要 CPU 访问内存段时,视频内存管理器会保留 CPU 主机 Aperture 中的页,并通过它映射内存段页。 下面对此做了演示。

在链接的显示适配器配置中,除以下内容外,内容看起来类似。

  1. 默认 或 LinkMirrored 分配始终映射到 GPU0。
  2. LinkInstanced 分配的虚拟地址范围为 AllocationSize*NumberOfGPUInLink ,这些地址范围与映射到不同 GPU 的分配的各个部分相关联。

下图说明了这一点:

物理寻址支持

如果使用物理寻址,还必须提供指向以下函数的指针:

  • DxgkDdiPatch
  • DxgkDdiRender
  • DxgkDdiSubmitCommand

GPU 虚拟寻址支持

如果使用 GPU 虚拟寻址,还必须提供指向以下函数的指针:

  • DxgkDdiCreateProcess
  • DxgkDdiDestroyProcess
  • DxgkDdiGetRootPageTableSize
  • DxgkDdiSetRootPageTable
  • DxgkDdiSubmitCommandVirtual

IoMmu 隔离支持

如果支持 IoMmu 隔离,还必须提供指向以下函数的指针:

  • DxgkDdiBeginExclusiveAccess
  • DxgkDdiEndExclusiveAccess

链接适配器支持

对于可选的链接适配器支持,还必须提供指向以下函数的指针:

  • DxgkDdiLinkDevice

电源管理支持

对于可选的电源管理支持,还必须提供指向以下函数的指针:

  • DxgkDdiSetPowerComponentFState;如果报告的组件支持 F 状态,则是必需的。
  • DxgkDdiPowerRuntimeControlRequest
  • DxgkDdiPowerRuntimeSetDeviceHandle

注意:新式待机或连接待机系统需要电源管理支持。

空闲状态和活动电源的 GPU 电源管理

GPU 电源管理设备驱动程序接口 (DDI)

这些新的和更新的函数和结构从Windows 8开始可用,以便显示微型端口驱动程序转换电源组件的状态并与 Microsoft DirectX 图形内核子系统通信电源事件。

  • DxgkCbCompleteFStateTransition
  • DxgkCbPowerRuntimeControlRequest
  • DxgkCbSetPowerComponentActive
  • DxgkCbSetPowerComponentIdle
  • DxgkCbSetPowerComponentLatency
  • DxgkCbSetPowerComponentResidency
  • DxgkDdiPowerRuntimeControlRequest
  • DxgkDdiSetPowerComponentFState
  • DXGK_DRIVERCAPS
  • DXGK_POWER_COMPONENT_FLAGS
  • DXGK_POWER_COMPONENT_MAPPING
  • DXGK_POWER_COMPONENT_TYPE
  • DXGK_POWER_RUNTIME_COMPONENT
  • DXGK_QUERYADAPTERINFOTYPE
  • DXGKARG_QUERYADAPTERINFO
  • DXGK_QUERYSEGMENTOUT3

GPU 电源管理方案

GPU 和显示屏幕是笔记本电脑、移动设备和台式电脑中最大的两个电源消耗者。

以下是降低功耗和延长电池使用时间的关键电源管理方案:

  • 移动外形规格设备可以进入空闲状态并省电,因为单个系统组件在不使用时会关闭。
  • 基于芯片 (SoC) 的 Windows 系统设备的行为类似于消费设备和移动电话,即它们在需要时立即打开,从而节省能源。
相关推荐
站在巨人肩膀上的码农10 小时前
全志T507 音频ALSA核心层注册流程分析
驱动开发·音视频·安卓·全志·alsa·声卡
车载操作系统---攻城狮19 小时前
[驱动开发篇] Can通信快速入门手册 - 应用篇
驱动开发
Natsume17103 天前
嵌入式开发:GPIO、UART、SPI、I2C 驱动开发详解与实战案例
c语言·驱动开发·stm32·嵌入式硬件·mcu·架构·github
S,D3 天前
MCU引脚的漏电流、灌电流、拉电流区别是什么
驱动开发·stm32·单片机·嵌入式硬件·mcu·物联网·硬件工程
Despacito0o4 天前
ESP32-s3摄像头驱动开发实战:从零搭建实时图像显示系统
人工智能·驱动开发·嵌入式硬件·音视频·嵌入式实时数据库
小米里的大麦13 天前
014 Linux 2.6内核进程调度队列(了解)
linux·运维·驱动开发
Svan.15 天前
Portable Watch:基于STM32的便携智能手表
arm开发·驱动开发·stm32·嵌入式硬件·硬件工程·pcb工艺·智能手表
楼台的春风16 天前
【Linux驱动开发 ---- 4_驱动开发框架和 API】
linux·c语言·c++·人工智能·驱动开发·嵌入式硬件·ubuntu
楼台的春风16 天前
【Linux驱动开发 ---- 1.1_Linux 基础操作入门】
linux·c语言·c++·人工智能·驱动开发·嵌入式硬件·ubuntu
sukalot17 天前
window显示驱动开发—输出合并器阶段
驱动开发·算法