DXGKDDI_ACQUIRESWIZZLINGRANGE回调函数 (d3dkmddi.h)

DxgkDdiAcquireSwizzlingRange 函数使分配可通过中央处理单元访问, (给定段的 CPU) 孔径。

语法

DXGKDDI_ACQUIRESWIZZLINGRANGE DxgkddiAcquireswizzlingrange;

NTSTATUS DxgkddiAcquireswizzlingrange(
  [in]     IN_CONST_HANDLE hAdapter,
  [in/out] INOUT_PDXGKARG_ACQUIRESWIZZLINGRANGE pAcquireSwizzlingRange
)
{...}

参数

[in] hAdapter

与显示适配器关联的上下文块的句柄。 显示微型端口驱动程序之前在 DxgkDdiAddDevice 函数的 MiniportDeviceContext 输出参数中向 Microsoft DirectX 图形内核子系统提供了此句柄。

[in/out] pAcquireSwizzlingRange

指向 DXGKARG_ACQUIRESWIZZLINGRANGE 结构的指针,该结构包含使分配可通过 CPU 孔径访问的信息。

返回值

DxgkDdiAcquireSwizzlingRange 返回以下值之一:

返回代码 说明
STATUS_SUCCESS DxgkDdiAcquireSwizzlingRange 已成功使分配可访问。
STATUS_GRAPHICS_UNSWIZZLING_APERTURE_UNSUPPORTED DxgkDdiAcquireSwizzlingRange 无法对分配的重排范围进行编程。 视频内存管理器无法在不进一步尝试的情况下获取重排范围。
STATUS_GRAPHICS_UNSWIZZLING_APERTURE_UNAVAILABLE DxgkDdiAcquireSwizzlingRange 无法对分配的重排范围进行编程,因为另一个重排范围当前正在使用图形处理单元 (GPU) 所需的资源。 视频内存管理器尝试释放当前正在使用的范围,然后再次尝试设置重排范围。

注解

在用户模式显示驱动程序请求引用分配 (位的虚拟地址之后调用 DxgkDdiAcquireSwizzlingRange 函数,即在用户模式显示驱动程序调用 pfnLockCb 函数后,该函数在 D3DDDICB_LOCK 结构的 Flags 成员中设置的 AcquireAperture 位字段标志,而分配当前位于 CPU 可访问的内存段) 。 如果在调用 pfnLockCb 时未设置 AcquireAperture 位字段标志,则不会调用 DxgkDdiAcquireSwizzlingRange,并且分配的格式必须为用户模式显示驱动程序或应用程序可以处理的格式。

调用 DxgkDdiAcquireSwizzlingRange 时,显示微型端口驱动程序必须进行指定的分配 (即 pAcquireSwizzlingRange 参数指向的 DXGKARG_ACQUIRESWIZZLINGRANGE 结构的 hAllocation 成员,) 可通过指定段 (的 CPU 光圈(即 DXGKARG_ACQUIRESWIZZLINGRANGE) 的 SegmentId 成员)访问。 在取消重排逐出后,分配的显示必须与计算机内存中的显示完全一致。

并非所有用户模式显示驱动程序的请求都可供显示微型端口驱动程序访问。 根据与视频内存管理器关联的分配和指定的专用数据缓存视频内存管理器获取的重排范围。 当用户模式显示驱动程序首次请求访问分配时,将调用显示微型端口驱动程序的 DxgkDdiAcquireSwizzlingRange 函数以使分配可访问。 在具有匹配专用数据的后续请求中,将使用先前设置的映射来访问分配。

视频内存管理器调用显示微型端口驱动程序的 DxgkDdiReleaseSwizzlingRange 函数,以在某个分配被逐出或销毁时,或者当另一个分配需要光圈时释放重排范围。 分配可以与任意数量的重排范围相关联, (例如,每个 MIP 级别) 一个光圈。

调用驱动程序的 DxgkDdiQueryAdapterInfo 函数时,适配器支持的重排范围数由DXGK_DRIVERCAPS结构的 NumberOfSwizzlingRanges 成员中公开。 所有范围都相等 (也就是说,任何区域都可以取消重排或直到任何类型的重排或平铺) 。 视频内存管理器在需要这些范围的所有应用程序中仲裁可用的重排范围。

驱动程序必须使用内存映射 I/O (MMIO) 来设置重排范围。 这些重排范围访问不得干扰 GPU (也就是说,在) 调用 DxgkDdiAcquireSwizzlingRange 时,GPU 不得处于空闲状态。

DxgkDdiAcquireSwizzlingRange 的所有调用都会在它们之间序列化,但不会与其他任何 DDI 函数一起序列化。

如果 GPU 支持将 CPU 访问重定向到不可 CPU 访问的内存段或系统内存的重排范围,则用户模式显示驱动程序可以在调用 pfnLockCb 函数时,在调用 pfnLockCb 函数时,在 D3DDDICB_LOCK 结构的 Flags 成员中设置 AcquireApertureUseAlternateVA 位字段标志的组合,以锁定分配。 在这种情况下,视频内存管理器调用显示微型端口驱动程序的 DxgkDdiAcquireSwizzlingRange 函数来获取分配的重排范围,即使分配位于不可 CPU 可访问的内存段或光圈段中。 重排范围与某些 GPU 资源相关联, (例如 PCI 光圈范围) 驱动程序管理,视频内存管理器无法访问或考虑这些范围。

调用 DxgkDdiAcquireSwizzlingRange 以获取重排范围可能会失败,因为驱动程序管理的资源用完。虽然重排范围本身是免费的,但由于缺少资源,它可能不可用。 驱动程序可以通过从 DxgkDdiAcquireSwizzlingRange 返回STATUS_GRAPHICS_UNSWIZZLING_APERTURE_UNAVAILABLE来指示视频内存管理器无法使用重排范围。 视频内存管理器接下来尝试释放当前正在使用的重排范围,然后再次调用驱动程序的 DxgkDdiAcquireSwizzlingRange 函数来设置新的重排范围。 如果释放了所有重排范围,并且驱动程序仍因STATUS_GRAPHICS_UNSWIZZLING_APERTURE_UNAVAILABLE而发生故障,则视频内存管理器无法获取分配的重排范围。

DxgkDdiAcquireSwizzlingRange 应可分页。

要求

要求
最低受支持的客户端 Windows Vista
目标平台 桌面
标头 d3dkmddi.h
IRQL PASSIVE_LEVEL

另请参阅

D3DDDICB_LOCK

DXGKARG_ACQUIRESWIZZLINGRANGE

DXGK_DRIVERCAPS

DxgkDdiAddDevice

DxgkDdiCreateAllocation

DxgkDdiQueryAdapterInfo

DxgkDdiReleaseSwizzlingRange

pfnLockCb