本文提供了关于如何编写 Microsoft 计算专用驱动程序(MCDM)中内核模式驱动程序(KMD)部分的指导,该驱动程序也称为计算专用驱动程序。
另请参阅以下文章:
驱动程序 INF 文件
MCDM 设备属于 ComputeAccelerator 类,需要在驱动程序的 INF 文件中指定:
[Version]
...
Class=ComputeAccelerator
ClassGuid={F01A9D53-3FF6-48D2-9F97-C8A7004BE10C}
...
驱动程序初始化
MCDM 驱动程序必须提供一个执行以下步骤的 DriverEntry 函数:
- 分配和初始化 DRIVER_INITIALIZATION_DATA 结构。 有关详细信息,请参阅 Driver 函数支持要求 。
- 使用初始化的结构调用 DxgkInitialize 。
驱动程序函数支持要求
MCDM 驱动程序公开它在 DRIVER_INITIALIZATION_DATA 结构中实现的函数。
所需的最低支持
MCDM 驱动程序至少必须提供以下设备驱动程序接口 (DDI) 函数:
- DxgkDdiAddDevice
- DxgkDdiBuildPagingBuffer
- DxgkDdiCalibrateGpuClock
- DxgkDdiCloseAllocation
- DxgkDdiCollectDbgInfo
- DxgkDdiCreateAllocation
- DxgkDdiCreateContext
- DxgkDdiCreateDevice
- DxgkDdiDescribeAllocation
- DxgkDdiDestroyAllocation
- DxgkDdiDestroyContext
- DxgkDdiDestroyDevice
- DxgkDdiDpcRoutine
- DxgkDdiFormatHistoryBuffer
- DxgkDdiGetNodeMetadata
- DxgkDdiGetStandardAllocationDriverData
- DxgkDdiInterruptRoutine
- DxgkDdiOpenAllocation
- DxgkDdiPreemptCommand
- DxgkDdiQueryAdapterInfo (有关详细信息,请参阅 DxgkDdiQueryAdapterInfo 要求)
- DxgkDdiQueryDependentEngineGroup
- DxgkDdiQueryDeviceDescriptor
- DxgkDdiQueryEngineStatus
- DxgkDdiRemoveDevice
- DxgkDdiResetDevice
- DxgkDdiResetEngine
- DxgkDdiResetFromTimeout
- DxgkDdiRestartFromTimeout
- DxgkDdiSetPowerState
- DxgkDdiSetStablePowerState
- DxgkDdiSetVirtualMachineData
- DxgkDdiStartDevice
- DxgkDdiStopDevice
- DxgkDdiUnload
- DxgkDdiQueryChildStatus
- DxgkDdiQueryChildRelations
- DxgkDdiQueryConnectionChange
- DxgkDdiQueryDeviceDescriptor
CPU 主机光圈支持
如果支持 CPU 主机口,还必须提供指向以下函数的指针:
有关详细信息,请参阅 CPU 主机光圈。
物理寻址支持
如果使用物理寻址,还必须提供指向以下函数的指针:
GPU 虚拟寻址支持
如果使用 GPU 虚拟寻址,还必须提供指向以下函数的指针:
- DxgkDdiCreateProcess
- DxgkDdiDestroyProcess
- DxgkDdiGetRootPageTableSize
- DxgkDdiSetRootPageTable
- DxgkDdiSubmitCommandVirtual
IoMmu 隔离支持
如果支持 IoMmu 隔离,还必须提供指向以下函数的指针:
链接适配器支持
对于可选链接适配器支持,还必须提供指向以下函数的指针:
电源管理支持
对于可选的电源管理支持,还必须提供指向以下函数的指针:
- DxgkDdiSetPowerComponentFState;如果报告组件支持 F 状态,则为必需。
- DxgkDdiPowerRuntimeControlRequest
- DxgkDdiPowerRuntimeSetDeviceHandle
现代待机或连接待机系统上需要电源管理的支持。
有关详细信息,请参阅 空闲状态和主动电源的 GPU 电源管理。
意外删除支持
对于可选的意外删除支持,还必须提供指向以下函数的指针:
取消支持
对于可选的取消支持,还必须提供指向以下函数的指针:
接口支持
对于可选接口支持,还必须提供指向以下函数的指针:
硬件调度支持
对于可选的硬件计划支持,还必须提供指向以下函数的指针:
- DxgkDdiCreateHwContext
- DxgkDdiCreateHwQueue
- DxgkDdiDestroyHwContext
- DxgkDdiDestroyHwQueue
- DxgkDdiPresentToHwQueue
- [DxgkDdiResetHwEngine
- DxgkDdiResumeContext
- DxgkDdiResumeHwEngine
- DxgkDdiSetContextSchedulingProperties
- DxgkDdiSetSchedulingLogBuffer
- DxgkDdiSetupPriorityBands
- DxgkDdiSignalMonitoredFence
- DxgkDdiSubmitCommandToHwQueue
- DxgkDdiSuspendContext
- DxgkDdiSwitchToHwContextList
- DxgkDdiUpdateHwContextState
UpdateAllocationProperty 功能支持
对于可选的 UpdateAllocationProperty 支持,还必须提供指向以下函数的指针:
转义支持
对于可选的转义支持,还必须提供指向以下函数的指针:
Windows 事件跟踪支持
对于可选的 ETW 支持,还必须提供指向以下函数的指针:
子设备支持
对于可选的子设备支持,还需要提供指向以下功能的指针:
电源消耗报告支持
对于可选的能耗报告支持,还必须提供指向以下函数的指针:
命令提交验证
对于可选的命令提交验证,还必须提供指向以下函数的指针:
IOCTL 支持
对于可选的 IOCTL 支持,可以提供指向以下函数的指针:
禁止的函数
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_DRIVERCAPS、SchedulingCaps 结构成员必须设置为适当的值:
成员 | 注释 |
---|---|
MultiEngineAware | 必须设置为 TRUE。 请参阅 GPU 抢占。 |
VSyncPowerSaveAware | 必须设置为 FALSE。 |
PreemptionAware | 必须设置为 TRUE。 请参阅 GPU 抢占。 |
NoDmaPatching | 必须设置为 FALSE。 |
CancelCommandAware | 根据需要进行设置。 请参阅 DXGKDDI_CANCELCOMMAND。 |
No64BitAtomics | 根据需要进行设置。 请参阅 上下文监控。 |
LowIrqlPreemptCommand | 设置为 TRUE。 操作系统将在低 IRQL 时调用驱动程序的 DxgkDdiPreemptCommand。 |
HwQueuePacketCap | 保留;设置为零。 |
MemoryManagementCaps 要求
以下 DXGK_DRIVERCAPS。MemoryManagementCaps 结构成员必须设置为适当的值:
成员 | 注释 |
---|---|
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 | 根据需要进行设置。 |
内存管理
需要虚拟寻址。 将来可能会启用物理寻址支持。
设备不需要支持内存光圈。