Windows 图形显示驱动开发- WDDM(3.2) 分配通知

有时,需要对即将执行分页逐出或提升操作的分配执行某些操作。 例如,当分配处于设备访问状态时,它可能会被压缩。 当该分配被逐出(即不再处于设备访问状态)时,内核模式驱动程序 (KMD) 必须在实际逐出之前首先解压缩它。 DXGK_OPERATION_NOTIFY_ALLOC 分页操作就是为此目的而设计的。 此操作从 Windows 11 版本 24H2 (WDDM 3.2) 开始可用。

如何请求分配通知

当系统调用 DxgkDdiCreateAllocation 以创建分配时,KMD 可以在 DXGK_ALLOCATIONINFOFLAGS2 中设置标志,以指示 Dxgkrnl 执行 DXGK_OPERATION_NOTIFY_ALLOC 分页操作。 当前通知标志为:

NotifyEviction
NotifyIoMmuUnmap

DDI 更改
已添加 DXGK_OPERATION_NOTIFY_ALLOC 分页操作

DXGK_OPERATION_NOTIFY_ALLOC 分页操作将添加到 DXGK_BUILDPAGINGBUFFER_OPERATION。

添加了 DXGK_BUILDPAGINGBUFFER_NOTIFYALLOC 结构,以便与 DXGK_OPERATION_NOTIFY_ALLOC 操作一起使用。

添加到 DXGK_ALLOCATIONINFOFLAGS2 的标志

以下标志将添加到 DXGK_ALLOCATIONINFOFLAGS2。

1. NotifyEviction

KMD 在其 DxgkDdiCreateAllocation 实现中设置 NotifyEviction 标志。 此标志表示在逐出分配之前,Dxgkrnl 应向驱动程序发出 DXGK_OPERATION_NOTIFY_ALLOC NotifyEviction 操作。

当指定了标志并且分配即将被逐出时:

Dxgkrnl 将分配映射到分页进程的 GPU 虚拟地址 (VA) 空间。
Dxgkrnl 使用 DXGK_OPERATION_NOTIFY_ALLOC 操作和 NotifyEviction 标志调用 DxgkDdiBuildPagingBuffer。
驱动程序在分页 DMA 缓冲区中生成命令。
将提交分页 DMA 缓冲区,以便在系统上下文中执行。
Dxgkrnl 从分页进程 GPU VA 空间取消映射分配。

如果分配大小大于分页进程 GPU VA 空间的大小,则可以多次执行这些步骤。

Dxgkrnl 仅在分配从光圈段或隐式系统内存段中逐出时,才会将通知发送到驱动程序。

NotifyIoMmuUnmap

KMD 在其 DxgkDdiCreateAllocation 函数中设置 NotifyIoMmuUnmap 标志。 此标志表示,在从 IOMMU 取消映射分配之前,Dxgkrnl 应发出 DXGK_OPERATION_NOTIFY_ALLOC NotifyIoMmuUnmap 操作。 驱动程序有机会清除内部缓存。 驱动程序应确保在从分页操作返回后不会访问分配 GPU VA。

指定了标志并且在逐出期间分配即将从 IOMMU 取消映射时:

Dxgkrnl 使用 DXGK_OPERATION_NOTIFY_ALLOC 操作和 NotifyIoMmuUnmap 标志调用 DxgkDdiBuildPagingBuffer。
驱动程序在分页 DMA 缓冲区中生成命令。
将提交分页 DMA 缓冲区,以便在系统上下文中执行。
Dxgkrnl 等待所有分页操作完成。
分配从 IOMMU 取消映射。

仅当设备支持 GpuVaIoMmu 或 GpuVaIoMmuGlobal 虚拟寻址模型时,才会发送通知。

分页进程 GPU VA 空间大小

若要获取分页进程 GPU VA 空间的大小,请将 DXGKQAITYPE_PAGINGPROCESSGPUVASIZE 添加到 DXGK_QUERYADAPTERINFOTYPE 枚举中。

DXGK_OPERATION_NOTIFY_ALLOC NotifyEviction 操作需要将相应的分配映射到分页进程 GPU VA 空间。 Dxgkrnl 仅当存在本地内存段或启用硬件计划时,才为分页(系统)进程分配 GPU VA 空间。 GPU VA 空间的大小是最大的本地内存段的四分之一或硬件计划日志缓冲区的大小(以更大的为准)。 由此产生的 GPU VA大小 可能很小,无法映射完整的分配。 在这种情况下,驱动程序需要指定分页进程 GPU VA 空间的大小。

Dxgkrnl 使用 DXGKARG_QUERYADAPTERINFO 结构调用 DxgkDdiQueryAdapterInfo,如下所示,以获取分页进程 GPU VA 空间的大小:

Type 设置为 DXGKQAITYPE_PAGINGPROCESSGPUVASIZE。
pInputData 指向一个 UINT 值,该值指定 LDA 配置中的物理适配器索引。 对于非 LDA 配置,Dxgkrnl 将其设置为零。
InputDataDataSize 为 sizeof(UINT)。
pOutputData 指向 UINT 值,其中驱动程序返回分页进程 GPU VA 空间的大小(以 MB 为单位)。
OutputDataSize 为 sizeof(UINT)。
如果驱动程序调用失败或返回 pOutputData 值为零,OS 将确定分页进程 GPU VA 大小。

如果适配器具有较大的本地内存段,驱动程序应返回零,让 OS 选择分页进程 GPU VA 空间的大小。 VA 空间越大,分页进程 GPU 页表所需的内存越多。 页表始终是驻留的,因此驱动程序不应为 VA 空间指定不必要的大大小。

当分配大小超过分页进程 GPU VA 空间大小时,分页操作(填充、传输、通知分配)以区块方式完成。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值