GPU 段

图形处理单元 (GPU) 对物理内存的访问在设备驱动程序接口 (DDI) 由分段模型抽象化。 内核模式驱动程序通过枚举一组段来表示 GPU 可用的物理内存资源,这些段随后由视频内存管理器管理。

Windows 显示驱动程序模型 (WDDM) v2 中有三种类型的段:

内存段

内存段表示专用于 GPU 的内存。 这可能是离散 GPU 上的 VRAM 或集成 GPU 上的固件/驱动程序保留内存。 可以枚举多个内存段。

WDDM v2 中的新增功能是,内存段作为大小为 4KB 或 64KB 的物理页池进行管理。 使用填充/传输放弃/填充/虚拟传输/虚拟分页操作将 Surface 数据复制到内存段和从内存段复制出来。

CPU 可以通过两种方式之一访问内存段的内容。 首先,内存段可能在 CPU 的物理地址空间中可见,在这种情况下,视频内存管理器只需将 CPU 虚拟地址直接映射到段内的分配。 在 WDDM v2 中引入的视频内存管理器还支持通过与该段关联的可编程 CPU 主机光圈访问内存段的内容。

光圈段

光圈段是一个全局页表,用于从 GPU 引擎的角度使不连续的系统内存页显示为连续。

在 WDDM v2 中,必须报告单个光圈段。

系统内存段

系统内存段是表示系统内存引用的隐式段, () 来宾物理地址。 内核模式驱动程序不直接枚举系统内存段。 它由视频内存管理器隐式枚举,并且始终被分配 SegmentId==0。 若要在系统内存段中放置分配,内核模式驱动程序需要使用光圈段 ID。

物理内存参考

在 DDI 中,物理内存引用始终采用段 ID 段偏移对的形式。

按物理地址访问分配

不支持 GPU 虚拟寻址的 GPU 引擎需要通过其物理地址访问分配。 这会影响分配如何从段获取分配的资源。 物理引用意味着分配必须在内存段中连续分配,或者占用光圈段中的连续范围。

若要避免不必要的、昂贵的连续分配,内核模式驱动程序必须在分配创建期间设置新的 DXGK_ALLOCATIONINFOFLAGS2::AccessedPhysically 标志,显式标识需要由呈现引擎以物理方式访问的分配。

当驻留在系统内存中时,此类分配将映射到光圈段。 如果驻留在内存段中,则分配将是连续的。 以这种方式创建的分配可以通过在物理寻址模式下运行的引擎上的分配列表进行引用。

未设置此标志的分配将分配为内存段中的一组页或系统内存中的一组页,其中任一页均可通过 GPU 虚拟地址进行访问。 无法通过分配列表引用以这种方式创建的分配。 引用该分配的任何命令缓冲区提交都将被拒绝。

据悉,主图面可由显示控制器以物理方式访问,并且将在内存段中连续分配,或在显示时映射到光圈段。 当呈现引擎以物理方式访问分配时,内核模式驱动程序应仅设置 AccessPhysically 标志。 主要图面上的隐式物理访问与显式标志的区别在于分配将映射到光圈。 设置 AccessedPhysically 标志后,每当其驻留时,分配将映射到光圈中。 未设置此标志的主要图面只有在显示时才会映射到光圈中。 这有助于消除光圈段的压力,因为通常只有少数主图面正在主动显示,而可能存在大量主图面并呈现到 (即,所有 FlipEx 交换链都是在 dFlip iFlip/ 方案中创建为主图面,并且可能在) 中显示。

AccessedPhysically==0 AccessedPhysically==1 Primary && AccessedPhysically==0
内存段

页集

仅允许 GPU 虚拟访问。

系列

允许 GPU 物理访问

系列

呈现引擎仅允许 GPU 虚拟访问。

光圈段

未映射

系统内存页,仅按 GPU 页表映射,不映射到光圈段。

仅允许 GPU 虚拟访问。

驻留时映射

允许 GPU 物理访问。

显示时映射

呈现引擎仅允许 GPU 虚拟访问。