本文提供如何撰寫Microsoft僅限計算驅動程式 (MCDM) 驅動程式核心模式驅動程式 (KMD) 部分的指引,也稱為僅限計算驅動程式。
另請參閱下列文章:
驅動程式 INF 檔案
MCDM 裝置屬於 ComputeAccelerator 類別,該類別必須在驅動程式的 INF 檔案中指定:
[Version]
...
Class=ComputeAccelerator
ClassGuid={F01A9D53-3FF6-48D2-9F97-C8A7004BE10C}
...
驅動程式初始化
MCDM 驅動程式必須提供執行下列步驟的 DriverEntry 函式:
- 配置和初始化 DRIVER_INITIALIZATION_DATA 結構。 如需詳細資訊,請參閱 驅動程式函式支援需求 。
- 使用初始化的結構呼叫 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 驅動程式中不得提供下列 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 狀態電源元件)
- DxgkDdi設定目標調整的色度測量
- DxgkDdiSetTargetAdjustedColorimetry2
- DxgkDdiSetTargetAnalogCopyProtection
- DxgkDdiSetTargetContentType
- DxgkDdiSetTargetGamma
- DxgkDdiSetTimingsFromVidPn
- DxgkDdiSetVideoProtectedRegion
- DxgkDdiSetVidPnSourceAddress
- DxgkDdiSetVidPnSourceAddressWithMultiPlaneOverlay
- DxgkDdiSetVidPnSourceAddressWithMultiPlaneOverlay2
- DxgkDdiSetVidPnSourceAddressWithMultiPlaneOverlay3
- DxgkDdiSetVidPnSourceVisibility
- DxgkDdiStopCapture
- DxgkDdiStopDeviceAndReleasePostDisplayOwnership(停止裝置並釋放後顯示擁有權)
- DxgkDdiSubmitRender
- DxgkDdiSystemDisplayEnable
- DxgkDdiSystemDisplayWrite
- DxgkDdiUpdateActiveVidPnPresentPath
- DxgkDdiUpdateMonitorLinkInfo
- DxgkDdiUpdateOverlay
查詢配接器資訊需求
如先前所述,計算專用驅動程式必須支援 DxgkDdiQueryAdapterInfo。
必須支援下列 DXGK_QUERYADAPTERINFOTYPE 類型:
- DXGKQAITYPE_DRIVERCAPS
- DXGK類型_數量電源組件
- 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 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
- DXGKQAITYPE_PREFERREDGPUNODE
- 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 電源管理。 |
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
- 光圈區段提交限制
- 最大指標寬度
- 最大指標高度
- PointerCaps
- 擺動範圍數量
- MaxOverlays
- GammaRampCaps
- ColorTransformCaps
- PresentationCaps
- MaxQueuedFlipOnVSync
- FlipCaps
- 支援非VGA設備
- SupportSmoothRotation
- SupportDirectFlip
- SupportMultiPlaneOverlay
- MaxOverlayPlanes
- 支援多平面疊加即時翻轉
- 游標在多平面覆蓋的平面0上縮放
- 混合Acpi鏈接需求
- MaxQueuedMultiPlaneOverlayFlipVSync
- 支援無上下文表示
- 可卸離
SchedulingCaps 需求
下列 DXGK_DRIVERCAPS。SchedulingCaps 結構成員必須設定為適當的值:
會員 | 註釋 |
---|---|
MultiEngineAware | 必須設定為TRUE。 請參閱 GPU 先佔。 |
VSyncPowerSaveAware | 必須設定為 FALSE。 |
搶占意識 | 必須設定為TRUE。 請參閱 GPU 搶占。 |
NoDmaPatching | 必須設定為 FALSE。 |
CancelCommandAware | 視需要設定。 請參閱 DXGKDDI_CANCELCOMMAND。 |
No64BitAtomics | 視需要設定。 請參閱 內容監視。 |
LowIrqlPreemptCommand | 設定為TRUE。 OS 會在低 IRQL 呼叫驅動程式的 DxgkDdiPreemptCommand 。 |
HwQueuePacketCap | 保留;設定為零。 |
記憶體管理功能要求
下列 DXGK_DRIVERCAPS。MemoryManagementCaps 結構成員必須設定為適當的值:
會員 | 註釋 |
---|---|
OutOfOrderLock | 必須設定為 FALSE。 |
DedicatedPagingEngine | 必須設定為 FALSE。 |
PagingEngineCanSwizzle | 必須設定為 FALSE。 |
章節支持主體 | 必須設定為 FALSE。 |
CrossAdapterResource | 視需要設定。 請參閱 在混合式系統中使用交叉配接器資源。 |
支援虛擬位址 (VirtualAddressingSupported) | 視需要設定。 請參閱 WDDM 2.0 中的 GPU 虛擬記憶體。 如果已設定此成員,驅動程式也必須設定 GpuMmuSupported 和/或 IoMmuSupported。 |
GpuMmuSupported | 視需要設定。 請參閱 GpuMmu 模型。 |
IoMmuSupported | 視需要設定。 當裝置與 CPU 共用頁面數據表(共用虛擬記憶體 (SVM)時,會設定此上限。 請參閱 IoMmu模型。 |
ReplicateGdiContent | 必須設定為 FALSE。 |
非CPU可見主要資源 | 必須設定為 FALSE。 |
ParavirtualizationSupported | 透過 GPU 分割介面支援虛擬化裝置的 MCDM 主機驅動程式(GPU-P 含 SR-IOV),應將此字段設定為 FALSE。 所有其他案例(沒有 GPU-P 支援之實體機器的驅動程式或透過 GPU-P公開之 vCPU 的客體驅動程式)都應該將此字段設定為 TRUE。 |
IoMmuSecureModeSupported | 視需要設定。 如果此上限設定為TRUE,驅動程式支援IoMmu隔離(裝置有IoMmu單元的專用分頁表)。 如果此上限設定為 FALSE,則裝置無法用於「安全」虛擬機(Windows 沙盒或 MDAG)。 |
關閉S3模式的VRAM自刷新 | 視需要設定。 |
記憶體管理
需要虛擬尋址。 未來可能會啟用實體尋址支援。
裝置不需要支援記憶體孔徑。