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 ドライバーでは、次の DDI を指定しないでください。
- 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
無効なメモリ ブロックが 1 つでも報告された場合は、次の DXGK_QUERYADAPTERINFOTYPE をサポートする必要があります。
- DXGKQAITYPE_SEGMENTMEMORYSTATE
GPUVA がサポートされている場合は、次の DXGK_QUERYADAPTERINFOTYPE をサポートする必要があります。
- DXGKQAITYPE_GPUMMUCAPS
- DXGKQAITYPE_PAGETABLELEVELDESC
報告される電力コンポーネントの数が 0 より大きい場合は、次の 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 | 適宜設定します。 |
SchedulingCaps | 「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 がサポートされていない場合は 0 に設定します。 GpuVA がサポートされている場合、この値は、OS 内部で使用する内部リソースを割り当てるときに OS が使用する VA 範囲の開始を指定します。 |
InternalGpuVirtualAddressRangeEnd | 適宜設定します。 GpuVA がサポートされていない場合は 0 に設定します。 GpuVA がサポートされている場合、この値は、OS 内部で使用する内部リソースを割り当てるときに OS が使用する VA 範囲の終了を指定します。 開始値と終了値の両方が 0 の場合、OS は使用可能な VA 範囲全体を使用します。 |
SupportSurpriseRemoval | 適宜設定します。 休止状態以外でも突然の取り外しをサポートする場合は TRUE に設定します。 「DXGKDDI_NOTIFY_SURPRISE_REMOVAL」を参照してください。 |
ComputeOnly | TRUE に設定されている必要があります。 このフラグの実装は必須です。 |
結果的に、次の DXGK_DRIVERCAPS 構造体メンバーは 0 または FALSE に設定する必要があります。
- MaxAllocationListSlotId
- ApertureSegmentCommitLimit
- MaxPointerWidth
- MaxPointerHeight
- PointerCaps
- NumberOfSwizzlingRanges
- MaxOverlays
- GammaRampCaps
- ColorTransformCaps
- PresentationCaps
- MaxQueuedFlipOnVSync
- FlipCaps
- SupportNonVGA
- SupportSmoothRotation
- SupportDirectFlip
- 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 に設定されている。 OS は、ドライバーの DxgkDdiPreemptCommand を低 IRQL で呼び出します。 |
HwQueuePacketCap | 予約済み。0 に設定します。 |
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-P と SR-IOV の併用) をサポートする MCDM ホスト ドライバーは、このフィールドを FALSE に設定する必要があります。 その他すべてのケース (GPU-P がサポートされていない物理マシンのドライバーや GPU-P で公開されている vGPU のゲスト ドライバー) は、このフィールドを TRUE に設定する必要があります。 |
IoMmuSecureModeSupported | 適宜設定します。 この機能が TRUE に設定されている場合、ドライバーは IoMmu 分離をサポートします (デバイスには IoMmu ユニット専用のページ テーブルがあります)。 この機能が FALSE に設定されている場合、デバイスを "セキュア" な仮想マシン (Windows サンドボックスや MDAG) で使用することはできません。 |
DisableSelfRefreshVRAMInS3 | 適宜設定します。 |
メモリ管理
仮想アドレス指定が必須です。 物理アドレス指定は今後サポートされる可能性があります。
デバイスがメモリ アパーチャをサポートしている必要はありません。
線形メモリ空間セグメントと線形アパーチャ空間セグメントのみがサポートされます。