LKML:Linux上的DirectX

2020-05-20 06:42:11

有一篇博客文章更详细地介绍了更大的图景,并介绍了完成这项工作所需的所有部件。它可以在这里获得:https://devblogs.microsoft.com/directx/directx-heart-linux。这封求职信的其余部分将集中在Linux内核位上。概述=这是Microsoft虚拟GPU(VGPU)驱动程序的初稿。该驱动程序将半虚拟化的GPU暴露给在Windows主机上的虚拟机中运行的用户模式应用程序。这可以在诸如WSL(Windows Subsystem For Linux)等环境中实现硬件加速,在该环境中,Linux虚拟机能够与Windows主机共享GPU。投影是通过将WDDM(Windows显示驱动程序模型)接口暴露为一组IOCTL来完成的。这允许移植针对Windows上的WDDM GPU抽象编写的API和用户模式驱动程序,以便在Linux环境中运行。这样可以将D3D12和DirectML API及其关联的用户模式驱动程序移植到Linux。这还使第三方API(如流行的NVIDIA Cuda计算API)能够在WSL环境中进行硬件加速。仅将GPU的渲染/计算方面投影到虚拟机,不显示任何显示功能。此外,目前还没有表示集成。因此,尽管D3D12API可以用来呈现屏幕外的图形,但是(目前)像素还没有从Linux环境流回Windows主机桌面的路径。此GPU堆栈有效地与原生Linux图形堆栈并行。驱动程序创建/dev/dxg设备,用户模式应用程序可以打开该设备并处理它们的ioctls。驱动程序的IOCTL接口在dxgkmthk.h(Dxgkrnl图形端口驱动程序ioctl定义)中定义。该接口与Windows上的D3DKMT接口匹配。Ioctls在ioctl.c中实现。当VM启动时,主机上的hyper-v会通过hyper-v驱动程序将虚拟GPU设备添加到VM。主机向VM提供几个VM总线通道:全局通道和分配给VM的每个虚拟GPU一个通道。驱动程序向Hyper-V驱动程序(Hv_Driver)注册VM总线通道的到达。dxg_probe_device识别vGPU通道并创建相应的对象(vGPU的dxg适配器和全局通道的dxggglobal)。驱动程序使用Hyper-V VM总线接口与主机通信。dxgvmbus.c实现通信接口。全局通道具有主机分配的8 GB IO空间。此空间由主机管理,用于为来宾提供对某些分配的直接CPU访问。视频内存是在主机上分配的,但现有_sysmem分配除外。Windows主机代表来宾为GPU分配内存。Linux客户可以通过将GPU虚拟地址映射到分配,然后从提交给GPU命令缓冲区内引用那些GPU虚拟地址来访问存储器。对于需要CPU访问的分配,主机将分配映射到来宾系统中为此目的保留的8 GB IO空间中的某个位置。Windows主机使用嵌套的CPU页表来确保此来宾IO空间始终映射到正确的分配位置,因为它可能在其生命周期内在专用GPU内存(例如vRAM、固件保留DDR)和共享系统内存(常规DDR)之间迁移。Linux来宾将用户模式CPU虚拟地址映射到分配IO空间范围,以供用户模式API和驱动程序直接访问。LX_DXLOCK2 ioctl的实施=我们非常感谢您对LX_DXLOCK2 ioctl的实施提供反馈。此ioctl用于获取分配的CPU地址,该地址驻留在主机的视频/系统内存中。其工作方式:1.驱动程序向主机发送锁定消息2.主机在VM IO空间中分配空间并将其映射到分配内存3.主机返回IO空间中用于映射分配的地址4.驱动程序(在dxg_map_iSpace中)使用vm_mmap分配用户模式虚拟地址范围,并使用io_remap_ofn_range将其映射到IO空间)5.将VA返回给应用程序内部对象=。-dxg适配器-表示虚拟GPU-dxg进程-跟踪每个进程状态(所创建对象的句柄表,对象列表等)-dxgdevice-其他对象(上下文、分页队列、分配、GPU同步对象)的容器-dxgcontext-表示用于分组调度的GPU执行线程。-dxghwqueue-表示GPU执行硬件调度的线程-dxgallocation-表示GPU可访问的分配-dxgsyncobject-表示GPU同步对象-dxgresource-dxgalloction对象的集合-dxgsharedresource、dxgsharedsyncobj-共享对象的帮助器对象