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 系统设备的行为类似于消费设备和移动电话,即它们在需要时立即打开,从而节省能源。
相关推荐
猫猫的小茶馆1 天前
【STM32】CubeMX(十二):FreeRTOS消息队列
驱动开发·stm32·单片机·嵌入式硬件·mcu·智能硬件
路溪非溪1 天前
嵌入式Linux驱动开发杂项总结
linux·运维·驱动开发
被遗忘的旋律.1 天前
Linux驱动开发笔记(七)——并发与竞争(上)——原子操作
linux·驱动开发·笔记
花小璇学linux1 天前
imx6ull-驱动开发篇41——Linux RTC 驱动实验
linux·驱动开发·嵌入式软件
程序员 _孜然3 天前
Ubuntu/Debian修改网卡名字enP3p49s0为eth0
linux·运维·驱动开发·嵌入式硬件·ubuntu·debian
白书宇4 天前
12.从零开始写LINUX内核--控制台初始化
linux·c语言·驱动开发·嵌入式硬件·microsoft·iot
dujunqiu5 天前
S32K328(Arm Cortex-M7)适配CmBacktrace错误追踪
arm开发·驱动开发·单片机
花小璇学linux6 天前
imx6ull-驱动开发篇31——Linux异步通知
linux·驱动开发·嵌入式软件
sukalot8 天前
window显示驱动开发—在混合系统中使用跨适配器资源
数据库·驱动开发·音视频
花小璇学linux9 天前
imx6ull-驱动开发篇24——Linux 中断API函数
linux·驱动开发·嵌入式软件