MCDM 内核模式驱动程序实现指南

本文提供了关于如何编写 Microsoft 计算专用驱动程序(MCDM)中内核模式驱动程序(KMD)部分的指导,该驱动程序也称为计算专用驱动程序。

另请参阅以下文章:

驱动程序 INF 文件

MCDM 设备属于 ComputeAccelerator 类,需要在驱动程序的 INF 文件中指定:

[Version]
...
Class=ComputeAccelerator
ClassGuid={F01A9D53-3FF6-48D2-9F97-C8A7004BE10C}
...

驱动程序初始化

MCDM 驱动程序必须提供一个执行以下步骤的 DriverEntry 函数:

驱动程序函数支持要求

MCDM 驱动程序公开它在 DRIVER_INITIALIZATION_DATA 结构中实现的函数。

所需的最低支持

MCDM 驱动程序至少必须提供以下设备驱动程序接口 (DDI) 函数:

CPU 主机光圈支持

如果支持 CPU 主机口,还必须提供指向以下函数的指针:

有关详细信息,请参阅 CPU 主机光圈

物理寻址支持

如果使用物理寻址,还必须提供指向以下函数的指针:

GPU 虚拟寻址支持

如果使用 GPU 虚拟寻址,还必须提供指向以下函数的指针:

IoMmu 隔离支持

如果支持 IoMmu 隔离,还必须提供指向以下函数的指针:

对于可选链接适配器支持,还必须提供指向以下函数的指针:

电源管理支持

对于可选的电源管理支持,还必须提供指向以下函数的指针:

现代待机或连接待机系统上需要电源管理的支持。

有关详细信息,请参阅 空闲状态和主动电源的 GPU 电源管理

意外删除支持

对于可选的意外删除支持,还必须提供指向以下函数的指针:

取消支持

对于可选的取消支持,还必须提供指向以下函数的指针:

接口支持

对于可选接口支持,还必须提供指向以下函数的指针:

硬件调度支持

对于可选的硬件计划支持,还必须提供指向以下函数的指针:

UpdateAllocationProperty 功能支持

对于可选的 UpdateAllocationProperty 支持,还必须提供指向以下函数的指针:

转义支持

对于可选的转义支持,还必须提供指向以下函数的指针:

Windows 事件跟踪支持

对于可选的 ETW 支持,还必须提供指向以下函数的指针:

子设备支持

对于可选的子设备支持,还需要提供指向以下功能的指针:

电源消耗报告支持

对于可选的能耗报告支持,还必须提供指向以下函数的指针:

命令提交验证

对于可选的命令提交验证,还必须提供指向以下函数的指针:

IOCTL 支持

对于可选的 IOCTL 支持,可以提供指向以下函数的指针:

DxgkDdiDispatchIoRequest

禁止的函数

MCDM 驱动程序中不得提供以下 DDI:

  • DxgkDdiAcquireSwizzlingRange
  • DxgkDdiCheckMultiPlaneOverlaySupport
  • DxgkDdiCheckMultiPlaneOverlaySupport2
  • DxgkDdiCheckMultiPlaneOverlaySupport3
  • DxgkDdiCommitVidPn
  • DxgkDdi控制诊断报告
  • DxgkDdiControlInterrupt
  • DxgkDdiControlInterrupt2
  • DxgkDdiControlModeBehavior
  • DxgkDdiCreateOverlay
  • DxgkDdiCreatePeriodicFrameNotification
  • DxgkDdiCreateProtectedSession
  • DxgkDdiDestroyOverlay
  • DxgkDdiDestroyPeriodicFrameNotification
  • DxgkDdiDestroyProtectedSession
  • DxgkDdiDisplayDetectControl
  • DxgkDdiEnumVidPnCofuncModality
  • DxgkDdiExchangePreStartInfo
  • DxgkDdiFlipOverlay
  • DxgkDdiGetMultiPlaneOverlayCaps
  • DxgkDdiGetPostCompositionCaps
  • DxgkDdiGetScanLine
  • DxgkDdiIsSupportedVidPn
  • DxgkDdiNotifyAcpiEvent
  • DxgkDdiNotifyFocusPresent
  • DxgkDdiPostMultiPlaneOverlayPresent
  • DxgkDdiPresent
  • DxgkDdiQueryConnectionChange
  • DxgkDdi查询当前栅栏

WDDM 1.x 函数

以下函数仅用于 WDDM 1.x 驱动程序:

  • DxgkDdiQueryDiagnosticTypesSupport
  • DxgkDdiQueryVidPnHWCapability
  • DxgkDdiRecommendFunctionalVidPn
  • DxgkDdiRecommendMonitorModes
  • DxgkDdiRecommendVidPnTopology
  • DxgkDdiReleaseSwizzlingRange
  • DxgkDdiRenderGdi
  • DxgkDdiRenderKm
  • DxgkDdiSetDisplayPrivateDriverFormat
  • DxgkDdiSetPalette
  • DxgkDdiSetPointerPosition
  • DxgkDdiSetPointerShape
  • DxgkDdiSetPowerPState(驱动程序不应报告任何 P 状态的电源组件)
  • DxgkDdiSetTargetAdjustedColorimetry
  • DxgkDdiSetTargetAdjustedColorimetry2
  • DxgkDdiSetTargetAnalogCopyProtection
  • DxgkDdiSetTargetContentType
  • DxgkDdiSetTargetGamma
  • DxgkDdiSetTimingsFromVidPn
  • DxgkDdiSetVideoProtectedRegion
  • DxgkDdiSetVidPnSourceAddress
  • DxgkDdiSetVidPnSourceAddressWithMultiPlaneOverlay
  • DxgkDdiSetVidPnSourceAddressWithMultiPlaneOverlay2
  • DxgkDdiSetVidPnSourceAddressWithMultiPlaneOverlay3
  • DxgkDdiSetVidPnSourceVisibility
  • DxgkDdiStopCapture
  • DxgkDdiStopDeviceAndReleasePostDisplayOwnership
  • DxgkDdiSubmitRender
  • DxgkDdiSystemDisplayEnable
  • DxgkDdiSystemDisplayWrite
  • DxgkDdiUpdateActiveVidPnPresentPath
  • DxgkDdiUpdateMonitorLinkInfo
  • DxgkDdiUpdateOverlay

查询适配器信息需求

如前所述,专用计算驱动程序必须支持 DxgkDdiQueryAdapterInfo

必须支持以下 DXGK_QUERYADAPTERINFOTYPE 类型:

  • DXGKQAITYPE_DRIVERCAPS
  • DXGKQAITYPE_NUMPOWERCOMPONENTS
  • DXGKQAITYPE_HISTORYBUFFERPRECISION
  • DXGKQAITYPE_QUERYSEGMENT4(有关详细信息,请参阅 使用内存段描述 GPU 地址空间

支持以下DXGK_QUERYADAPTERINFOTYPE类型是可选的:

  • DXGK_ADAPTER_PERFDATA
  • DXGK_ADAPTER_PERFDATACAPS
  • DXGKQAITYPE_UMDRIVERPRIVATE
  • DXGKQAITYPE_PHYSICALADAPTERCAPS(物理适配器功能)
  • DXGK_NODE_PERFDATA
  • DXGK_GPUVERSION

如果报告了一个或多个无效内存块,则必须支持以下DXGK_QUERYADAPTERINFOTYPE:

  • 段内存状态类型

如果支持 GPUVA,则必须支持以下DXGK_QUERYADAPTERINFOTYPE:

  • DXGKQAITYPE_GPUMMUCAPS
  • DXGKQAITYPE_PAGETABLELEVELDESC

如果报告的电源组件数大于零,则必须支持以下DXGK_QUERYADAPTERINFOTYPE:

  • DXGKQAITYPE_POWERCOMPONENTINFO

如果设置了 IoMmuSecureModeSupported cap,则必须支持以下DXGK_QUERYADAPTERINFOTYPE:

  • DXGKQAITYPE_FRAMEBUFFERSAVESIZE
  • DXGKQAITYPE_HARDWARERESERVEDRANGES

不应支持以下DXGK_QUERYADAPTERINFOTYPE:

  • DXGKQAITYPE_DEVICE_TYPE_CAPS
  • DXGKQAITYPE_DISPLAY_DRIVERCAPS_EXTENSION
  • DXGKQAITYPE_DISPLAYID_DESCRIPTOR
  • DXGKQAITYPE_INTEGRATED_DISPLAY_DESCRIPTOR
  • DXGKQAITYPE_INTEGRATED_DISPLAY_DESCRIPTOR2
  • DXGKQAITYPE_POWERCOMPONENTPSTATEINFO
  • 首选GPU节点类型
  • DXGKQAITYPE_QUERYCOLORIMETRYOVERRIDES
  • DXGKQAITYPE_QUERYSEGMENT
  • DXGKQAITYPE_QUERYSEGMENT2
  • DXGKQAITYPE_QUERYSEGMENT3
  • DXGKQAITYPE_UEFIFRAMEBUFFERRANGES

驱动程序功能要求

必须将以下 DXGK_DRIVERCAPS 结构成员设置为适当的值:

成员 注释
最高可接受地址 如果此地址小于驱动程序加载期间存在的系统内存的最高物理地址,则加载会失败。
中断消息编号 根据需要进行设置。
SchedulingCaps 请参阅 SchedulingCaps 要求
MemoryManagementCaps 请参阅 MemoryManagementCaps 要求
GpuEngineTopology NbAsymetricProcessingNodes 设置为支持的 GPU 引擎数。
WDDM版本 必须设置为DXGKDDI_WDDMv2_6或更高版本。
PreemptionCaps GraphicsPreemptionGranularity 适当设置为硬件支持的级别。 至少应尝试支持对已计划但尚未开始处理的出队数据包进行数据包级的抢占。 将ComputePreemptionGranularity设置为除“D3DKMDT_COMPUTE_PREEMPTION_NONE”以外的任何值。
SupportPerEngineTDR 必须设置为 TRUE。 请参阅 Windows 8 及更高版本中的 TDR 更改
支持运行时电源管理 根据需要进行设置。 请参阅 GPU 电源管理中的空闲状态和活动功率
休眠状态下支持意外移除 如果驱动程序在休眠时支持意外删除,则设置为 TRUE;否则,请根据需要进行设置。 请参阅 DXGKDDI_NOTIFY_SURPRISE_REMOVAL
HybridDiscrete 必须设置为 FALSE。
HybridIntegrated 必须设置为 FALSE。
内置GPU虚拟地址范围起始 根据需要进行设置。 如果不支持 GpuVA,则设置为零。 如果支持 GpuVA,则此值指定 OS 在分配内部资源供 OS 内部使用时将使用的 VA 范围的开头。
内部Gpu虚拟地址范围终点 根据需要进行设置。 如果不支持 GpuVA,则设置为零。 如果支持 GpuVA,则此值指定 OS 在分配内部资源供 OS 内部使用时将使用的 VA 范围的末尾。 如果开始值和结束值均为零,则 OS 将使用整个可用的 VA 范围。
支持意外移除 根据需要进行设置。 如果驱动程序支持在休眠之外进行意外删除,则设置为 TRUE。 请参阅 DXGKDDI_NOTIFY_SURPRISE_REMOVAL
ComputeOnly 必须设置为 TRUE。 必须实现此标志。

以下 DXGK_DRIVERCAPS 结构成员必须分别设置为零或 FALSE:

  • 最大分配列表槽标识
  • 光圈段提交限制
  • MaxPointerWidth
  • 最大指针高度
  • PointerCaps
  • NumberOfSwizzlingRanges
  • MaxOverlays
  • GammaRampCaps
  • ColorTransformCaps
  • PresentationCaps
  • MaxQueuedFlipOnVSync
  • FlipCaps
  • 支持非VGA
  • 支持平滑旋转
  • 支持DirectFlip
  • SupportMultiPlaneOverlay
  • MaxOverlayPlanes
  • SupportMultiPlaneOverlayImmediateFlip
  • CursorScaledWithMultiPlaneOverlayPlane0
  • HybridAcpiChainingRequired
  • MaxQueuedMultiPlaneOverlayFlipVSync
  • SupportContextlessPresent
  • 可拆卸

SchedulingCaps 要求

以下 DXGK_DRIVERCAPSSchedulingCaps 结构成员必须设置为适当的值:

成员 注释
MultiEngineAware 必须设置为 TRUE。 请参阅 GPU 抢占
VSyncPowerSaveAware 必须设置为 FALSE。
PreemptionAware 必须设置为 TRUE。 请参阅 GPU 抢占
NoDmaPatching 必须设置为 FALSE。
CancelCommandAware 根据需要进行设置。 请参阅 DXGKDDI_CANCELCOMMAND
No64BitAtomics 根据需要进行设置。 请参阅 上下文监控
LowIrqlPreemptCommand 设置为 TRUE。 操作系统将在低 IRQL 时调用驱动程序的 DxgkDdiPreemptCommand
HwQueuePacketCap 保留;设置为零。

MemoryManagementCaps 要求

以下 DXGK_DRIVERCAPSMemoryManagementCaps 结构成员必须设置为适当的值:

成员 注释
OutOfOrderLock 必须设置为 FALSE。
DedicatedPagingEngine 必须设置为 FALSE。
PagingEngineCanSwizzle 必须设置为 FALSE。
区段支持主要 必须设置为 FALSE。
CrossAdapterResource 根据需要进行设置。 请参阅 在混合系统中使用跨适配器资源
支持虚拟寻址 根据需要进行设置。 请参阅 WDDM 2.0 中的 GPU 虚拟内存。 如果设置了此成员,驱动程序还必须设置 GpuMmuSupported 和/或 IoMmuSupported。
GpuMmuSupported 根据需要进行设置。 请参阅 GpuMmu 模型
IoMmuSupported 根据需要进行设置。 当设备与 CPU(共享虚拟内存(SVM)共享页表时,将设置此上限。 请参阅 IoMmu 模型
ReplicateGdiContent 必须设置为FALSE。
非CPU可见主项 必须设置为 FALSE。
伴随虚拟化支持 支持通过 GPU 分区接口(使用GPU-P 和 SR-IOV)进行设备虚拟化的 MCDM 主机驱动程序应将此字段设置为 FALSE。 所有其他情况(没有 GPU-P 支持的物理计算机驱动程序或通过 GPU-P公开的 vGPU 的来宾驱动程序)应将此字段设置为 TRUE。
IoMmuSecureModeSupported 根据需要进行设置。 如果此上限设置为 TRUE,驱动程序支持 IoMmu 隔离(设备具有 IoMmu 单元的专用页表)。 如果此上限设置为 FALSE,则无法在“安全”虚拟机(Windows 沙盒或 MDAG)中使用设备。
DisableSelfRefreshVRAMInS3 根据需要进行设置。

内存管理

需要虚拟寻址。 将来可能会启用物理寻址支持。

设备不需要支持内存光圈。

仅支持 线性内存空间段线性光圈空间段