使用内存段描述 GPU 地址空间

在视频内存管理器可以管理 GPU 的地址空间之前,显示微型端口驱动程序必须使用内存段向视频内存管理器描述 GPU 的地址空间。 显示微型端口驱动程序创建内存段以通用化和虚拟化视频内存资源。 驱动程序可以根据硬件支持的内存类型配置内存段, (例如帧缓冲区内存或系统内存孔径) 。

在驱动程序初始化期间,驱动程序必须返回段类型的列表,这些段类型描述视频内存管理器如何管理内存资源。 驱动程序指定它支持的段类型数,并通过响应对其 DxgkDdiQueryAdapterInfo 函数的调用来描述每个段类型。 驱动程序使用 DXGK_SEGMENTDESCRIPTOR 结构描述每个段。 有关详细信息,请参阅 初始化内存段的使用

此后,段的数量和类型保持不变。 视频内存管理器确保每个进程都能在任何特定段中获得公平份额的资源。 视频内存管理器独立管理所有段,段不重叠。 因此,无论应用程序当前从另一段保留的资源量如何,视频内存管理器都会将相当数量的视频内存资源从一个段分配给应用程序。

驱动程序为其每个内存段分配段标识符。 稍后,当视频内存管理器请求为视频资源创建分配并呈现这些资源时,驱动程序会标识支持该请求的段,并按顺序指定驱动程序首选视频内存管理器使用的段。 有关详细信息,请参阅 创建分配时指定段

驱动程序不需要指定其内存段中可供 GPU 使用的所有视频内存资源;但是,驱动程序必须指定视频内存管理器在系统上运行的所有进程之间管理的所有内存资源。 例如,实现固定函数管道的顶点着色器微代码可以驻留在 GPU 地址空间中,但位于由视频内存管理器管理的内存之外, (,即不是段) 的一部分,因为微代码始终可供所有进程使用,并且绝不是进程之间争用的来源。 但是,视频内存管理器必须从驱动程序的内存段之一分配视频内存资源,例如顶点缓冲区、纹理、呈现目标和特定于应用程序的着色器代码,因为资源类型必须对所有进程都相当可用。

下图显示了驱动程序如何从 GPU 地址空间配置内存段。

说明 GPU 地址空间划分为内存段的关系图。

在视频内存管理器中隐藏的视频内存不能映射到用户空间,也不能以独占方式提供给任何特定进程。 这样做会破坏虚拟内存的基本规则,这些规则要求系统上运行的所有进程都有权访问所有内存。