Mapping Virtual Addresses to a Memory Segment(MSDN翻译)

Mapping Virtual Addresses to a Memory Segment

显卡小端口驱动能够指定CPUVA是否能够直接映射到小端口驱动自己定义一的每个CPU可见段中的一个Allocation.CPU是否可见可以通过DXGK_SEGMENTDESCRIPTOR中Flags的CpuVisible位来指定。

为了映射CPU VA到一个段,这个段应该能通过PCI aperture 线性访问到。也就是,任何一个Allocation在段中的偏移应该与该Allocation在PCI Aperture的偏移一致。因此VMM能基于Allocation在段中的偏移计算这个Allocation相对于总线物理地址的偏移。

下图显示了CPU VA如何被映射到linear memory-space段中。

diagram illustrating a virtual address mapped to a linear memory-space segment

下图显示了CPU VA如何映射到linear aperture-space段后隐藏的内存页中。(PS:即先通过PCI物理Aperture的方式定位到aperture引用的系统内存页)

diagram illustrating a virtual address mapped to the underlying pages of a linear aperture-space segment

在映射一个CPU VA到段中之前,VMM会先调用显卡小端口驱动的DxgkDdiAcquireSwizzlingRange,其中显卡驱动能设置这个用于访问可能Swizzle的Allocation内容的Aperture。显卡驱动不能改变能被访问到的Allocation在PCI aperture中的偏移以及这些Allocation在aperture中占据的大小。如果显卡驱动不能使CPU能访问的Allocation满足这些限制(例如硬件可能用完了unswizzling aperture),VMM将会Evict Allocation到系统内存中,让程序直接从系统内存中访问Allocation.

如果当UMD调用pfnLockCb请求直接访问内存时,而预先创建的Allocation内容存在于系统内存中,VMM会直接将系统内存buffer返回给UMD而显卡驱动不会参与到这个过程中来。 因此Allocation的内容不会被显卡驱动修改而是会保持unswizzled的格式。意味着当一个系统可访问的allocation被从显存中evict到系统内存中时,显卡驱动必须unswizzle这个allocation才能让application能够直接访问系统内存中的allocation内容。

如果GPU资源因为Application直接访问映射关联的Allocation被 Evect,allocation的内容会被转移到系统内存中让Application能使用相同的CPU VA访问存在于不同物理介质上的内容。VMM调用显卡驱动的DxgkDdiBuildPagingBuffer创建Paging Buffer,然后GPU Scheduler调用显卡驱动的DxgkDdiSubmitCommand来将Paging Buffer加入到GPU执行单元队列中来完成这次传输。在Paging Buffer中有硬件制定的命令。更多的内可以参见 Submitting a Command Buffer。 VMM保证了从显存转移到系统内存的过程对Application透明。但是显卡驱动必须保证通过PCI aperture访问到的allocation的字节序与allocation在evict时的字节序一致。

对于aperture-space 段,其中引用allocation内容已经存在于系统内存中,所以不需要在eviction过程中转移(unswizzling)数据。因此,存在于aperture-space段中的CPU可访问而且能够application直接访问Allocation不能swizzle。

如果一个surface将被Application通过CPU直接访问,而对应在aperture-space段的allocation会被swizzled,驱动就需要将这个surface实现为两个不同的allocation。当UMD创建这样的suface时,能够通过调用pfnAllocationCb以及设置D3DDDICB_ALLOCATE中NumAllocations为2和设置D3DDDICB_ALLOCATE中的D3DDDI_ALLOCATIONINFO pAllocationInfo中pPrivateDriverData指向关于allocation的私有信息(例如对应的swizzled格式和unswizzled格式)。GPU使用的loocation中就会包含swizzled格式的内容,CPU使用的Allocation包含unswizzled格式的内容。VMM调用显卡驱动的DxgkDdiCreateAllocation来创建Allocation。显卡驱动会解释处理这些从UMD传来的私有数据(DXGK_ALLOCATIONINFO 中的pPrivateDriverData)。VMM并不知道Allocation的具体内容格式,只是为allocation分配指定大小和布局的内存块。

调用UMD的Lock函数来所锁住surface来进行处理会引起下列行为。

 A call to the user-mode display driver's Lock function to lock the surface for processing causes the following actions:

  1. UMD调用pfnRenderCb来提交包含unswizzle操作的command buffer给D3D RT,之后会传递给显卡驱动。

  2. UMD调用pfnCLockCb来锁住unswizzled的allocation。注意UMD不能设置D3DDDICB_LOCK中Flags 成员的D3DDDILOCKCB_DONOTWAIT位。

  3. pfnLockCb会等待allocation转移(unswizzling)被完成。

  4. pfnLockCb 请求显卡驱动为unswizzled的allocation obtain一个VA,并将VA通过D3DDDICB_LOCK中的pData成员返回给

  5. UMD通过D3DDDIARG_LOCK中pSurfData成员返回unwizzled的allocation的VA给application。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值