MCDM KM 驅動程式實作指導方針
本文提供如何撰寫 Microsoft Compute Only Driver (MCDM) 驅動程式核心模式驅動程式部分的指引,也稱為僅限計算驅動程式。
另請參閱下列文章:
驅動程式 INF 檔案
MCDM 裝置屬於 ComputeAccelerator 類別,必須在 INF 檔案中指定:
[Version]
...
Class=ComputeAccelerator
ClassGuid={F01A9D53-3FF6-48D2-9F97-C8A7004BE10C}
...
驅動程式初始化
只限計算驅動程式必須提供執行下列步驟的 DriverEntry 函式:
- 配置和初始化 DRIVER_INITIALIZATION_DATA 結構。 如需詳細資訊 ,請參閱驅動程式函式支援需求 。
- 使用初始化的結構呼叫 DxgkInitialize 。
驅動程式函式支援需求
僅限計算驅動程式會公開它在 DRIVER_INITIALIZATION_DATA 結構中實作的函式。
最低必要支援
至少,僅限計算驅動程式必須提供下列設備驅動器介面, (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 支援,也必須提供下列函式的指標:
- DxgkDdiValidateUpdateAllocationProperty
逸出支援
如需選擇性逸出支援,也必須提供下列函式的指標:
Windows 事件追蹤支援
如需選擇性 ETW 支援,也必須提供下列函式的指標:
子裝置支援
如需選用的子裝置支援,也必須提供下列函式的指標:
耗電量報告支援
如需選擇性的耗電量報告支援,也必須提供下列函式的指標:
命令提交驗證
針對選擇性命令提交驗證,也必須提供下列函式的指標:
IOCTL 支援
如需選擇性的 IOCTL 支援,您可以提供下列函式的指標:
禁止的函式
MCDM 驅動程式中不得提供下列 DIS:
- DxgkDdiAcquireSwizzlingRange
- DxgkDdiCheckMultiPlaneOverlaySupport
- DxgkDdiCheckMultiPlaneOverlaySupport2
- DxgkDdiCheckMultiPlaneOverlaySupport3
- DxgkDdiCommitVidPn
- DxgkDdiControlDiagnosticReporting
- DxgkDdiControlInterrupt
- DxgkDdiControlInterrupt2
- DxgkDdiControlModeBehavior
- DxgkDdiCreateOverlay
- DxgkDdiCreatePeriodicFrameNotification
- DxgkDdiCreateProtectedSession
- DxgkDdiDestroyOverlay
- DxgkDdiDestroyPeriodicFrameNotification
- DxgkDdiDestroyProtectedSession
- DxgkDdiDisplayDetectControl
- DxgkDdiEnumVidPnCofuncModality
- DxgkDdiExchangePreStartInfo
- DxgkDdiFlipOverlay
- DxgkDdiGetMultiPlaneOverlayCaps
- DxgkDdiGetPostCompositionCaps
- DxgkDdiGetScanLine
- DxgkDdiIsSupportedVidPn
- DxgkDdiNotifyAcpiEvent
- DxgkDdiNotifyFocusPresent
- DxgkDdiPostMultiPlaneOverlayPresent
- DxgkDdiPresent
- DxgkDdiQueryConnectionChange
- DxgkDdiQueryCurrentFence
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:
- DXGKQAITYPE_SEGMENTMEMORYSTATE
如果支援 GPUVA,則必須支援下列DXGK_QUERYADAPTERINFOTYPE:
- DXGKQAITYPE_GPUMMUCAPS
- DXGKQAITYPE_PAGETABLELEVELDESC
如果報告的電源元件數目大於零,則必須支援下列DXGK_QUERYADAPTERINFOTYPE:
- DXGKQAITYPE_POWERCOMPONENTINFO
如果已設定 IoMmuSecureModeSupported 上限,則必須支援下列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
- DXGKQAITYPE_PREFERREDGPUNODE
- DXGKQAITYPE_QUERYCOLORIMETRYOVERRIDES
- DXGKQAITYPE_QUERYSEGMENT
- DXGKQAITYPE_QUERYSEGMENT2
- DXGKQAITYPE_QUERYSEGMENT3
- DXGKQAITYPE_UEFIFRAMEBUFFERRANGES
驅動程式功能需求
下列 DXGK_DRIVERCAPS 結構成員必須設定為適當的值:
成員 | 備註 |
---|---|
HighestAcceptableAddress | 如果此位址小於驅動程式載入期間存在之系統記憶體的最高實體位址,負載將會失敗。 |
InterruptMessageNumber | 視需要設定。 |
排程Caps | 請參閱 SchedulingCaps 需求。 |
MemoryManagementCaps | 請參閱 MemoryManagementCaps 需求。 |
GpuEngineTopology | 將 NbAsymetricProcessingNodes 設定為支援的 GPU 引擎數目。 |
WDDMVersion | 必須設定為 DXGKDDI_WDDMv2_6 或更新版本。 |
PreemptionCaps | 適當地將 GraphicsPreemptionGranularity 設定為硬體所支援的層級。 您至少應該嘗試支援封包層級先佔;也就是說,已排程但尚未開始執行的清除佇列封包。 將 ComputePreemptionGranularity 設定為D3DKMDT_COMPUTE_PREEMPTION_NONE以外的任何專案。 |
SupportPerEngineTDR | 必須設定為TRUE。 請參閱 Windows 8和更新版本中的 TDR 變更。 |
SupportRuntimePowerManagement | 視需要設定。 請參閱 閑置狀態和作用中電源的 GPU 電源管理。 |
SupportSurpriseRemovalInHibernation | 如果驅動程式在休眠時支援意外移除,請將 設定為TRUE;否則,請視需要設定。 請參閱 DXGKDDI_NOTIFY_SURPRISE_REMOVAL。 |
HybridDiscrete | 必須設定為 FALSE。 |
HybridIntegrated | 必須設定為 FALSE。 |
InternalGpuVirtualAddressRangeStart | 視需要設定。 如果不支援 GpuVA,請將 設定為零。 如果支援 GpuVA,此值會指定 OS 在配置內部資源以供 OS 內部使用時將使用的 VA 範圍的開頭。 |
InternalGpuVirtualAddressRangeEnd | 視需要設定。 如果不支援 GpuVA,請將 設定為零。 如果支援 GpuVA,此值會指定 OS 在配置內部資源供 OS 內部使用時將使用的 VA 範圍結尾。 如果開始和結束值都是零,OS 將會使用整個可用的 VA 範圍。 |
SupportSurpriseRemoval | 視需要設定。 如果驅動程式支援在休眠之外進行意外移除,請設定為TRUE。 請參閱 DXGKDDI_NOTIFY_SURPRISE_REMOVAL。 |
ComputeOnly | 必須設定為TRUE。 這個旗標必須實作。 |
下列 DXGK_DRIVERCAPS 結構成員必須據以設定為零或 FALSE:
- MaxAllocationListSlotId
- ApertureSegmentCommitLimit
- MaxPointerWidth
- MaxPointerHeight
- PointerCaps
- NumberOfSwizzlingRanges
- MaxOverlays
- GammaRampCaps
- ColorTransformCaps
- PresentationCaps
- MaxQueuedFlipOnVSync
- FlipCaps
- SupportNonVGA
- SupportSmoothRotation
- SupportDirectFlip
- SupportMultiPlaneOverlay
- MaxOverlayPlanes
- SupportMultiPlaneOverlayImmediateFlip
- CursorScaledWithMultiPlaneOverlayPlane0
- HybridAcpiChainingRequired
- MaxQueuedMultiPlaneOverlayFlipVSync
- SupportContextlessPresent
- 可卸除式
排程Caps 需求
下列 DXGK_DRIVERCAPS。SchedulingCaps 結構成員必須設定為適當的值:
成員 | 備註 |
---|---|
MultiEngineAware | 必須設定為TRUE。 請參閱 GPU 先佔。 |
VSyncPowerSaveAware | 必須設定為 FALSE。 |
PreemptionAware | 必須設定為TRUE。 請參閱 GPU 先佔。 |
NoDmaPatching | 必須設定為 FALSE。 |
CancelCommandAware | 視需要設定。 請參閱 DXGKDDI_CANCELCOMMAND。 |
No64BitAtomics | 視需要設定。 請參閱 內容監視。 |
LowIrqlPreemptCommand | 設定為TRUE。 OS 會在低 IRQL 呼叫驅動程式的 DxgkDdiPreemptCommand 。 |
HwQueuePacketCap | 保留;設定為零。 |
MemoryManagementCaps 需求
下列 DXGK_DRIVERCAPS。MemoryManagementCaps 結構成員必須設定為適當的值:
成員 | 備註 |
---|---|
OutOfOrderLock | 必須設定為 FALSE。 |
DedicatedPagingEngine | 必須設定為 FALSE。 |
PagingEngineCanSwizzle | 必須設定為 FALSE。 |
SectionBackedPrimary | 必須設定為 FALSE。 |
CrossAdapterResource | 視需要設定。 請參閱 在混合式系統中使用交叉配接器資源。 |
VirtualAddressingSupported | 視需要設定。 請參閱 WDDM 2.0 中的 GPU 虛擬記憶體。 如果已設定此成員,驅動程式也必須設定 GpuMmuSupported 和/或 IoMmuSupported。 |
GpuMmuSupported | 視需要設定。 請參閱 GpuMmu 模型。 |
IoMmuSupported | 視需要設定。 當裝置與 CPU 共用頁面數據表 (共用虛擬記憶體 (SVM) ) 時,就會設定此上限。 請參閱 IoMmu模型。 |
ReplicateGdiContent | 必須設定為 FALSE。 |
NonCpuVisiblePrimary | 必須設定為 FALSE。 |
ParavirtualizationSupported | 透過 GPU 分割介面支援透過 GPU 分割介面 (GPU-P 搭配 SR-IOV) 的 MCDM 主機驅動程式,應該將此字段設定為 FALSE。 所有其他情況下 (驅動程式,而沒有 GPU-P 支援或透過 GPU-P) 公開之 v GPU 的客體驅動程式,都應該將此字段設定為 TRUE。 |
IoMmuSecureModeSupported | 視需要設定。 如果此上限設定為TRUE,則驅動程式支援IoMmu隔離 (裝置有IoMmu單元的專用頁面表) 。 如果此上限設定為 FALSE,則裝置無法用於「安全」虛擬機 (Windows 沙箱 或 MDAG) 。 |
DisableSelfRefreshVRAMInS3 | 視需要設定。 |
記憶體管理
需要虛擬尋址。 未來可能會啟用實體尋址支援。
裝置不需要支持記憶體光圈。