将虚拟地址映射到内存段

显示微型端口驱动程序可以为其定义的每个内存空间或光圈空间段指定 CPU 虚拟地址是否可以直接映射到段中的分配,方法是在段DXGK_SEGMENTDESCRIPTOR结构的Flags 成员中设置 CpuVisible 位字段标志。

若要将 CPU 虚拟地址映射到段,段应通过 PCI 光圈进行线性访问。 换句话说,段内任何分配的偏移量应与 PCI 光圈中的偏移量相同。 因此,视频内存管理器可以根据分配在给定段内的偏移量计算任何分配的总线相对物理地址。

下图演示了如何将虚拟地址映射到线性内存空间段。

说明映射到线性内存空间段的虚拟地址的关系图。

下图演示了如何将虚拟地址映射到线性光圈空间段的基础页面。

说明映射到线性光圈空间段基础页面的虚拟地址的关系图。

在将虚拟地址映射到段的一部分之前,视频内存管理器调用显示微型端口驱动程序的 DxgkDdiAcquireSwizzlingRange 函数,以便驱动程序可以设置用于访问可能重排的分配位的光圈。 驱动程序既不能将偏移量更改为访问分配的 PCI 光圈,也不能更改分配在光圈中占用的空间量。 例如,如果驱动程序无法在给定这些约束 (的情况下使分配 CPU 可访问,则硬件可能耗尽) 不显眼的光圈,则视频内存管理器会将分配逐出到系统内存,并允许应用程序访问其中的位。

如果在用户模式显示驱动程序调用 pfnLockCb 函数以请求直接访问内存时,以前创建的分配的内容位于系统内存中,则视频内存管理器会将系统内存缓冲区返回到用户模式显示驱动程序,并且显示微型端口驱动程序不涉及访问分配。 因此,显示微型端口驱动程序不会修改分配的内容,并且保持为未重排格式。 这意味着,当从视频内存中逐出 CPU 可访问的分配时,显示微型端口驱动程序必须取消重排分配,以便应用程序可以直接访问生成的系统内存位。

如果逐出与当前映射用于直接应用程序访问的分配关联的 GPU 资源,则分配的内容将传输到系统内存,以便应用程序可以继续访问同一虚拟地址但不同的物理介质上的内容。 为了设置传输,视频内存管理器调用显示微型端口驱动程序的 DxgkDdiBuildPagingBuffer 函数来创建分页缓冲区,GPU 计划程序调用驱动程序的 DxgkDdiSubmitCommand 函数将分页缓冲区排队到 GPU 执行单元。 特定于硬件的传输命令位于分页缓冲区中。 有关详细信息,请参阅 提交命令缓冲区。 视频内存管理器可确保视频到系统内存的转换对应用程序不可见。 但是,驱动程序必须确保通过 PCI 光圈对分配的字节排序与逐出分配时分配的字节顺序完全匹配。

对于光圈空间段,分配的基础位已位于系统内存中,因此无需传输 (逐出过程中取消重排) 数据。 因此,如果应用程序直接访问位于光圈空间段中的 CPU 可访问分配,则无法重排该分配。

如果某个表面可由应用程序直接通过 CPU 访问,但将在光圈空间段中重排,则显示驱动程序应将图面实现为两个不同的分配。 当用户模式显示驱动程序创建此类图面时,它可以调用 pfnAllocateCb 函数,并将 D3DDDICB_ALLOCATE 结构的 NumAllocations 成员设置为 2,并将 D3DDDICB_ALLOCATE pAllocationInfo 数组中D3DDDI_ALLOCATIONINFO结构的 pPrivateDriverData 成员设置为指向有关分配 (的私有数据,例如其重排格式和未重排格式) 。 GPU 将使用的分配包含重排格式的位,应用程序将访问的分配包含未重排格式的位。 视频内存管理器调用显示微型端口驱动程序的 DxgkDdiCreateAllocation 函数来创建分配。 对于从用户模式显示驱动程序传递的每个分配) ,显示微型端口驱动程序解释DXGK_ALLOCATIONINFO结构的 pPrivateDriverData 成员中的专用数据 (。 视频内存管理器不知道分配的格式;它只是为分配分配分配特定大小和对齐方式的内存块。 调用用户模式显示驱动程序的 Lock 函数以锁定图面进行处理会导致以下操作:

  1. 用户模式显示驱动程序调用 pfnRenderCb 函数,将命令缓冲区中的取消重排操作提交到 Direct3D 运行时和显示微型端口驱动程序。

  2. 用户模式显示驱动程序调用 pfnLockCb 函数来锁定未重排的分配。 请注意,用户模式显示驱动程序不得在 D3DDDICB_LOCK 结构的 Flags 成员中设置D3DDDILOCKCB_DONOTWAIT标志。

  3. pfnLockCb 函数将等待传输 (在分配之间展开) 。

  4. pfnLockCb 函数请求显示微型端口驱动程序获取未重排分配的虚拟地址,并将虚拟地址返回到 D3DDDICB_LOCKpData 成员中的用户模式显示驱动程序。

  5. 用户模式显示驱动程序将未重排分配的虚拟地址返回到 D3DDDIARG_LOCK 的 pSurfData 成员中的应用程序。