次の方法で共有


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 ドライバーでは、次の 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 型をサポートする必要があります。

次の 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 適宜設定します。

メモリ管理

仮想アドレス指定が必須です。 物理アドレス指定は今後サポートされる可能性があります。

デバイスがメモリ アパーチャをサポートしている必要はありません。

線形メモリ空間セグメント線形アパーチャ空間セグメントのみがサポートされます。