Windows 图形显示驱动开发-WDDM 2.0功能_重排范围

发布于:2025-04-08 ⋅ 阅读:(35) ⋅ 点赞:(0)

重排范围

Windows 显示驱动程序模型 (WDDM) v2 中不再支持重排范围

上下文分配

若要为上下文的上下文保存区域分配内存,内核模式驱动程序可以通过 DxgkCbCreateContextAllocation 使用上下文分配。 上下文分配中添加了一些新功能,使它们适应新的图形处理单元 (GPU) 虚拟地址模型。

AccessedPhysically

上下文分配可以指定 AccessedPhysically 标志,以指示分配应在内存段中连续分配,或者从系统内存访问时映射到光圈中。

将 GPU 虚拟地址分配给上下文分配

视频内存管理器向内核模式驱动程序公开新的 DxgkCbMapContextAllocation 服务,以将 GPU 虚拟地址分配给上下文分配。

上下文分配映射到与指定上下文关联的应用程序 GPU 虚拟地址空间。

注意 当上下文分配直接映射到应用程序 GPU 虚拟地址空间时,驱动程序应小心不要公开特权信息。

这些服务的行为与其用户模式对应项类似。

更新上下文分配的内容

有时内核模式驱动程序可能需要更新上下文分配的内容。 例如,特权 (AccessPhysically,没有 GPU 虚拟映射) 上下文分配可能包含对与特定上下文关联的页面目录的引用。 当 DxgkDdiSetRootPageTable 通知内核模式驱动程序页面目录重定位时,内核模式驱动程序可能需要更新该上下文分配的内容。

为此,添加了新的 DxgkCbUpdateContextAllocation设备驱动程序接口 (DDI) 。 此 DDI 向视频内存管理器发送请求排队,以启动上下文分配的更新。 正在更新的上下文分配将映射到视频内存管理器分页过程的暂存区域,然后通过新的 UpdateContextAllocation 分页操作调用驱动程序,以执行上下文分配的实际更新。 更新完成后,视频内存管理器从 DxgkCbUpdateContextAllocation 返回。

内核模式驱动程序可以在调用 DxgkCbUpdateContextAllocation 和生成的 UpdateContextAllocation 分页操作之间传递一些专用驱动程序数据。

 

更新进程的页表条目 

 下面是更新页表条目以将属于进程 (P) 的分配映射到物理内存的操作序列。 假定页表分配已驻留在图形处理单元中, (GPU) 内存段。

视频内存管理器在分页进程上下文中为进程 P 的根页表分配分配虚拟地址范围。
视频内存管理器在分页进程上下文中为进程 P 的页表分配分配虚拟地址范围。
视频内存管理器使用 UpdatePageTable 命令调用 DxgkDdiBuildPagingBuffer,以将分页进程页表项映射到进程 P 页表和页面目录。
视频内存管理器使用 FlushTLB (PagingProcessRootPageTable) 命令调用 DxgkDdiBuildPagingBuffer。
视频内存管理器使用 UpdatePageTable 命令调用 DxgkDdiBuildPagingBuffer,以使用物理地址信息填充进程页表条目。
视频内存管理器使用 FlushTLB (进程 P 根页表) 命令调用 DxgkDdiBuildPagingBuffer。
分页缓冲区提交以便在分页进程上下文中执行。 

将分配内容从一个位置转移到另一个位置

下面是将分配内容从一个位置传输到另一个位置时的操作序列 (例如,从本地内存传输到系统内存) 。

  1. 视频内存管理器为分页进程虚拟地址暂存区域中的源分配和目标分配分配虚拟地址范围。
  2. 视频内存管理器使用 UpdatePageTable 命令调用 DxgkDdiBuildPagingBuffer。 命令将源虚拟地址范围的分页进程页表条目映射到本地 GPU 内存中的分配物理地址。
  3. 视频内存管理器使用 UpdatePageTable 命令调用 DxgkDdiBuildPagingBuffer。 命令将目标虚拟地址的分页进程页表条目映射到系统内存。
  4. 视频内存管理器使用 FlushTLB (分页进程根页表) 调用 DxgkDdiBuildPagingBuffer。
  5. 视频内存管理器使用 TransferVirtual 命令调用 DxgkDdiBuildPagingBuffer 来执行传输操作。
  6. 分页缓冲区提交到 GPU,以便在分页进程上下文中执行。

 

使用模式填充分配

下面是需要用模式填充分配时的操作序列。

  1. 视频内存管理器为分页进程虚拟地址暂存区域中的目标分配分配虚拟地址范围。
  2. 视频内存管理器使用 UpdatePageTable 命令调用 DxgkDdiBuildPagingBuffer。 命令映射目标虚拟地址的分页进程页表条目。
  3. 视频内存管理器使用 FlushTLB (分页进程根页表) 调用 DxgkDdiBuildPagingBuffer。
  4. 视频内存管理器使用 FillVirtual 命令调用 DxgkDdiBuildPagingBuffer 来执行该操作。
  5. 分页缓冲区提交到 GPU,以便在分页进程上下文中执行。

 

使分配驻留在系统内存中

调用 D3DKMTMakeResident 以使分配驻留时,将执行以下操作。 假定应用程序进程页表驻留在内存中。

在应用程序线程上下文中:

  1. 如果分配驻留在系统内存) 中,则为分配虚拟地址范围分配和固定物理系统内存页 (。
  2. 为应用程序设备生成新的分页围栏 ID。
  3. 将 MakeResident 命令提交到视频内存管理器工作线程。
  4. 返回到应用程序。

在视频内存管理器工作线程上下文中:

  1. 更新应用程序进程页表条目 (请参阅上面的相应部分) 。
  2. 如果分配驻留在本地内存段中,请用零填充分配, (请参阅上面的相应部分) 。
  3. 使用分页围栏 ID 将 SignalSynchronizationObject 命令提交到计划程序。

初始化内存管理器控制结构

分页过程初始化

当图形设备切换到 D0 电源设备状态时,DirectX 图形内核初始化分页进程虚拟地址空间

分页进程是使用 DxgkDdiCreateProcess 创建的。
系统设备是使用 DxgkDdiCreateDevice 创建的。 此时,内核模式驱动程序可以在分页进程地址空间中保留虚拟地址范围。
为分页过程创建页表分配。
页表分配将提交到虚拟寻址功能结构中定义的内存段。
调用 UpdatePageTable 操作以初始化页表。

客户端进程初始化

创建新进程时,DirectX 图形内核将:

  • 创建初始页表分配。
  • 当进程中的第一个分配成为驻留时,初始化页表分配。