Windows 图形显示驱动开发-WDDM 3.2-本机 GPU 围栏对象(四)

用于创建、打开和销毁本机围栏的 D3DKMT 内核 API

引入了以下 D3DKMT 内核模式 API 来创建和打开本机围栏对象。

  • D3DKMTCreateNativeFence / D3DKMT_CREATENATIVEFENCE
  • D3DKMTOpenNativeFenceFromNTHandle / D3DKMT_OPENNATIVEFENCEFROMNTHANDLE

Dxgkrnl 调用现有的 D3DKMTDestroySynchronizationObject 函数来关闭并销毁(释放)现有的本地围栏对象。

引入或更新的支持结构和枚举包括:

  • D3DDDI_NATIVEFENCEINFO
  • D3DDDI_NATIVEFENCE_TYPE
  • D3DDDI_SYNCHRONIZATIONOBJECT_FLAGS
  • D3DDDI_NATIVEFENCE_MAPPING

用于支持在本地内存中放置本机围栏值的 DDI

添加了或更改了以下 DDI 以支持在本地内存中放置本机围栏值:

  • 添加了 D3DKMDT_FENCESTORAGESURFACEDATA 结构。
  • 本机围栏类型的 Native fence MonitoredValue 和 CurrentValue D3DDDI_NATIVEFENCE_TYPE_INTRA_GPU可以放置在本地设备内存中。 为此,OS 会要求驱动程序指定应在其中放置围栏存储的内存段。 DxgkDdiGetStandardAllocation 已扩展以提供此类信息。
  • D3DKMDT_STANDARDALLOCATION_FENCESTORAGE添加到DXGKARG_GETSTANDARDALLOCATIONDRIVERDATA。

用于支持在本地内存中放置本机围栏值的 DDI

添加了或更改了以下 DDI 以支持在本地内存中放置本机围栏值:

添加了 D3DKMDT_FENCESTORAGESURFACEDATA 结构。

本机围栏类型的 Native fence MonitoredValue 和 CurrentValue D3DDDI_NATIVEFENCE_TYPE_INTRA_GPU可以放置在本地设备内存中。 为此,OS 会要求驱动程序指定应在其中放置围栏存储的内存段。 DxgkDdiGetStandardAllocation 已扩展以提供此类信息。

D3DKMDT_STANDARDALLOCATION_FENCESTORAGE添加到DXGKARG_GETSTANDARDALLOCATIONDRIVERDATA。

本机围栏信号中断

对中断机制进行了以下更改,以支持本机围栏信号中断:

1.DXGK_INTERRUPT_TYPE 枚举更新为具有 DXGK_INTERRUPT_NATIVE_FENCE_SIGNALED 中断类型。

2.DXGKARGCB_NOTIFY_INTERRUPT_DATA结构更新为包含 NativeFenceSignaled 结构以表示本机围栏信号中断

NativeFenceSignaled 用于通知 OS,CPU 监视的一组本机围栏 GPU 对象在 GPU 引擎上发出信号。 如果 GPU 能够确定具有活动 CPU 等待程序的对象确切子集,则它通过 pSignaledNativeFenceArray 传递此子集。 此数组中的句柄必须是 Dxgkrnl 在 DxgkDdiCreateNativeFence 中传递给 KMD 的有效 hGlobalNativeFence 句柄。 将句柄传递给已销毁的本机围栏对象会导致错误检查。

3.DXGKCB_NOTIFY_INTERRUPT_DATA_FLAGS 结构更新为包含 EvaluateLegacyMonitoredFences 成员。

GPU 可以在以下条件下传递 NULL pSignaledNativeFenceArray:

GPU 无法确定具有活动 CPU 等待程序的对象的确切子集。
多个信号中断被折叠在一起,使得很难确定具有活动等待程序的信号集。
NULL 值指示 OS 扫描所有未完成的本机 GPU 围栏对象等待程序。

OS 和驱动程序之间的协定是:如果 OS 具有活动 CPU 等待程序(由 MonitoredValue 表示),并且 GPU 引擎将该对象标记为需要 CPU 中断的值,则 GPU 必须执行以下操作之一:

4.在 pSignaledNativeFenceArray 中包括此本机围栏句柄。
5.使用 NULL pSignaledNativeFenceArray 引发 NativeFenceSignaled 中断。

默认情况下,当 KMD 使用 NULL pSignaledNativeFenceArray 引发此中断时,Dxgkrnl 仅扫描所有挂起的本机围栏等待程序,而不会扫描旧的受监视的围栏等待程序。 在无法区分旧的 DXGK_INTERRUPT_MONITORED_FENCE_SIGNALED 和 DXGK_INTERRUPT_NATIVE_FENCE_SIGNALED 的硬件上,KMD 始终只能引发引入的 DXGK_INTERRUPT_NATIVE_FENCE_SIGNALED 中断(pSignaledNativeFenceArray = NULL 和 EvaluateLegacyMonitoredFences = 1),这表示 OS 扫描所有等待程序(旧的受监视的围栏等待程序和本机围栏等待程序)。

 

你可能感兴趣的:(windows图形显示驱动开发,驱动开发,单片机,stm32)