共用方式為


MCDM KM 驅動程式實作指導方針

本文提供如何撰寫 Microsoft Compute Only Driver (MCDM) 驅動程式核心模式驅動程式部分的指引,也稱為僅限計算驅動程式。

另請參閱下列文章:

驅動程式 INF 檔案

MCDM 裝置屬於 ComputeAccelerator 類別,必須在 INF 檔案中指定:

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

驅動程式初始化

只限計算驅動程式必須提供執行下列步驟的 DriverEntry 函式:

驅動程式函式支援需求

僅限計算驅動程式會公開它在 DRIVER_INITIALIZATION_DATA 結構中實作的函式。

最低必要支援

至少,僅限計算驅動程式必須提供下列設備驅動器介面, (DDI) 函式:

CPU 主機光圈支援

如果支援 CPU 主機光圈,也必須提供下列函式的指標:

如需詳細資訊,請參閱 CPU 主機光圈

實體尋址支援

如果使用實體尋址,也必須提供下列函式的指標:

GPU 虛擬尋址支援

如果使用 GPU 虛擬尋址,也必須提供下列函式的指標:

IoMmu 隔離支援

如果支援IoMmu隔離,也必須提供下列函式的指標:

如需選擇性連結配接器支援,也必須提供下列函式的指標:

電源管理支援

如需選擇性電源管理支援,也必須提供下列函式的指標:

注意:新式待命或連線待命系統上需要電源管理支援。

如需詳細資訊,請參閱 閑置狀態和作用中電源的 GPU 電源管理

意外移除支援

如需選擇性的意外移除支援,也必須提供下列函式的指標:

取消支援

如需選擇性取消支援,也必須提供下列函式的指標:

介面支援

如需選擇性介面支援,也必須提供下列函式的指標:

硬體排程支援

如需選擇性的硬體排程支援,也必須提供下列函式的指標:

UpdateAllocationProperty 支援

如需選擇性 UpdateAllocationProperty 支援,也必須提供下列函式的指標:

  • DxgkDdiValidateUpdateAllocationProperty

逸出支援

如需選擇性逸出支援,也必須提供下列函式的指標:

Windows 事件追蹤支援

如需選擇性 ETW 支援,也必須提供下列函式的指標:

子裝置支援

如需選用的子裝置支援,也必須提供下列函式的指標:

耗電量報告支援

如需選擇性的耗電量報告支援,也必須提供下列函式的指標:

命令提交驗證

針對選擇性命令提交驗證,也必須提供下列函式的指標:

IOCTL 支援

如需選擇性的 IOCTL 支援,您可以提供下列函式的指標:

DxgkDdiDispatchIoRequest

禁止的函式

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 類型:

下列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_DRIVERCAPSSchedulingCaps 結構成員必須設定為適當的值:

成員 備註
MultiEngineAware 必須設定為TRUE。 請參閱 GPU 先佔
VSyncPowerSaveAware 必須設定為 FALSE。
PreemptionAware 必須設定為TRUE。 請參閱 GPU 先佔
NoDmaPatching 必須設定為 FALSE。
CancelCommandAware 視需要設定。 請參閱 DXGKDDI_CANCELCOMMAND
No64BitAtomics 視需要設定。 請參閱 內容監視
LowIrqlPreemptCommand 設定為TRUE。 OS 會在低 IRQL 呼叫驅動程式的 DxgkDdiPreemptCommand
HwQueuePacketCap 保留;設定為零。

MemoryManagementCaps 需求

下列 DXGK_DRIVERCAPSMemoryManagementCaps 結構成員必須設定為適當的值:

成員 備註
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 視需要設定。

記憶體管理

需要虛擬尋址。 未來可能會啟用實體尋址支援。

裝置不需要支持記憶體光圈。

僅支援 線性記憶體空間區段線性光圈空間區段