Freigeben über


Implementierungsrichtlinien für MCDM-KM-Treiber

Dieser Artikel enthält Anleitungen zum Schreiben des Kernelmodustreiberteils eines McDM-Treibers (Microsoft Compute Only Driver), der auch als reine Computetreiber bezeichnet wird.

Weitere Informationen finden Sie in den folgenden Artikeln:

Treiber-INF-Datei

MCDM-Geräte gehören zur ComputeAccelerator-Klasse , die in der INF-Datei angegeben werden muss:

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

Treiberinitialisierung

Ein rein computebasierter Treiber muss eine DriverEntry-Funktion bereitstellen, die die folgenden Schritte ausführt:

Anforderungen an die Unterstützung von Treiberfunktionen

Ein rein computebasierter Treiber macht die Funktionen verfügbar, die er in der DRIVER_INITIALIZATION_DATA-Struktur implementiert.

Mindestens erforderliche Unterstützung

Ein reine Computetreiber muss mindestens die folgenden DDI-Funktionen (Device Driver Interface) bereitstellen:

Unterstützung der CPU-Hostpertur

Wenn CPU-Hostpertur unterstützt wird, müssen auch Zeiger auf die folgenden Funktionen bereitgestellt werden:

Weitere Informationen finden Sie unter CPU-Hostpertur.

Unterstützung der physischen Adressierung

Wenn die physische Adressierung verwendet wird, müssen auch Zeiger auf die folgenden Funktionen bereitgestellt werden:

Unterstützung virtueller GPU-Adressierung

Wenn die virtuelle GPU-Adressierung verwendet wird, müssen auch Zeiger auf die folgenden Funktionen bereitgestellt werden:

Unterstützung der IoMmu-Isolation

Wenn die IoMmu-Isolation unterstützt wird, müssen auch Zeiger auf die folgenden Funktionen bereitgestellt werden:

Für optionale Linkadapterunterstützung muss auch ein Zeiger auf die folgende Funktion bereitgestellt werden:

Unterstützung der Energieverwaltung

Für die optionale Unterstützung der Energieverwaltung müssen auch Zeiger auf die folgenden Funktionen bereitgestellt werden:

HINWEIS: Unterstützung für die Energieverwaltung ist für Modern Standby- oder Connected Standby-Systeme erforderlich.

Weitere Informationen finden Sie unter GPU-Energieverwaltung von Leerlaufzuständen und Aktiverleistung.

Unterstützung für das Entfernen von Überraschungen

Für die optionale Unterstützung für das Entfernen von Überraschungen müssen auch Zeiger auf die folgenden Funktionen bereitgestellt werden:

Support kündigen

Für optionale Abbruchunterstützung müssen auch Zeiger auf die folgenden Funktionen bereitgestellt werden:

Schnittstellenunterstützung

Für optionale Schnittstellenunterstützung müssen auch Zeiger auf die folgenden Funktionen bereitgestellt werden:

Hardwareplanungsunterstützung

Für optionale Hardwareplanungsunterstützung müssen auch Zeiger auf die folgenden Funktionen bereitgestellt werden:

UpdateAllocationProperty-Unterstützung

Für die optionale UpdateAllocationProperty-Unterstützung müssen auch Zeiger auf die folgenden Funktionen bereitgestellt werden:

  • DxgkDdiValidateUpdateAllocationProperty

Escapeunterstützung

Für optionale Escapeunterstützung müssen auch Zeiger auf die folgenden Funktionen bereitgestellt werden:

Ereignisablaufverfolgung für Windows-Unterstützung

Für optionale ETW-Unterstützung müssen auch Zeiger auf die folgenden Funktionen bereitgestellt werden:

Unterstützung für untergeordnete Geräte

Für die optionale Unterstützung von untergeordneten Geräten müssen auch Zeiger auf die folgenden Funktionen bereitgestellt werden:

Unterstützung für Die Berichterstellung für den Stromverbrauch

Zur unterstützung optionaler Energieverbrauchsberichte müssen auch Zeiger auf die folgenden Funktionen bereitgestellt werden:

Überprüfung der Befehlsübermittlung

Für die optionale Überprüfung der Befehlsübermittlung müssen auch Zeiger auf die folgenden Funktionen bereitgestellt werden:

IOCTL-Unterstützung

Für optionale IOCTL-Unterstützung kann ein Zeiger auf die folgende Funktion bereitgestellt werden:

DxgkDdiDispatchIoRequest

Unzulässige Funktionen

Die folgenden DDIs dürfen nicht in einem MCDM-Treiber bereitgestellt werden:

  • 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-Funktionen

Die folgenden Funktionen werden nur für WDDM 1.x-Treiber verwendet:

  • DxgkDdiQueryDiagnosticTypesSupport
  • DxgkDdiQueryVidPnHWCapability
  • DxgkDdiRecommendFunctionalVidPn
  • DxgkDdiRecommendMonitorModes
  • DxgkDdiRecommendVidPnTopology
  • DxgkDdiReleaseSwizzlingRange
  • DxgkDdiRenderGdi
  • DxgkDdiRenderKm
  • DxgkDdiSetDisplayPrivateDriverFormat
  • DxgkDdiSetPalette
  • DxgkDdiSetPointerPosition
  • DxgkDdiSetPointerShape
  • DxgkDdiSetPowerPState (der Treiber sollte keine P-State-Energiekomponenten melden)
  • DxgkDdiSetTargetAdjustedColorimetry
  • DxgkDdiSetTargetAdjustedColorimetry2
  • DxgkDdiSetTargetAnalogCopyProtection
  • DxgkDdiSetTargetContentType
  • DxgkDdiSetTargetGamma
  • DxgkDdiSetTimingsFromVidPn
  • DxgkDdiSetVideoProtectedRegion
  • DxgkDdiSetVidPnSourceAddress
  • DxgkDdiSetVidPnSourceAddressWithMultiPlaneOverlay
  • DxgkDdiSetVidPnSourceAddressWithMultiPlaneOverlay2
  • DxgkDdiSetVidPnSourceAddressWithMultiPlaneOverlay3
  • DxgkDdiSetVidPnSourceVisibility
  • DxgkDdiStopCapture
  • DxgkDdiStopDeviceAndReleasePostDisplayOwnership
  • DxgkDdiSubmitRender
  • DxgkDdiSystemDisplayEnable
  • DxgkDdiSystemDisplayWrite
  • DxgkDdiUpdateActiveVidPnPresentPath
  • DxgkDdiUpdateMonitorLinkInfo
  • DxgkDdiUpdateOverlay

Anforderungen an Abfrageadapterinformationen

Wie bereits erwähnt, muss ein reines Computetreiber DxgkDdiQueryAdapterInfo unterstützen.

Die folgenden DXGK_QUERYADAPTERINFOTYPE-Typen müssen unterstützt werden:

Die Unterstützung für die folgenden DXGK_QUERYADAPTERINFOTYPE-Typen ist optional:

  • DXGK_ADAPTER_PERFDATA
  • DXGK_ADAPTER_PERFDATACAPS
  • DXGKQAITYPE_UMDRIVERPRIVATE
  • DXGKQAITYPE_PHYSICALADAPTERCAPS
  • DXGK_NODE_PERFDATA
  • DXGK_GPUVERSION

Wenn mindestens ein ungültiger Speicherblock gemeldet wurde, müssen die folgenden DXGK_QUERYADAPTERINFOTYPE unterstützt werden:

  • DXGKQAITYPE_SEGMENTMEMORYSTATE

Wenn GPUVA unterstützt wird, müssen die folgenden DXGK_QUERYADAPTERINFOTYPE unterstützt werden:

  • DXGKQAITYPE_GPUMMUCAPS
  • DXGKQAITYPE_PAGETABLELEVELDESC

Wenn die Anzahl der gemeldeten Energiekomponenten größer als 0 ist, muss die folgende DXGK_QUERYADAPTERINFOTYPE unterstützt werden:

  • DXGKQAITYPE_POWERCOMPONENTINFO

Wenn die IoMmuSecureModeSupported-Obergrenze festgelegt ist, muss die folgende DXGK_QUERYADAPTERINFOTYPE unterstützt werden:

  • DXGKQAITYPE_FRAMEBUFFERSAVESIZE
  • DXGKQAITYPE_HARDWARERESERVEDRANGES

Die folgenden DXGK_QUERYADAPTERINFOTYPE dürfen nicht unterstützt werden:

  • 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

Anforderungen an die Treiberfunktion

Die folgenden DXGK_DRIVERCAPS Strukturmber müssen auf geeignete Werte festgelegt werden:

Mitglied Hinweise
HighestAcceptableAddress Wenn diese Adresse kleiner als die höchste physische Adresse des Systemspeichers ist, die während des Ladens des Treibers vorhanden ist, schlägt die Auslastung fehl.
InterruptMessageNumber Legen Sie entsprechend fest.
SchedulingCaps Weitere Informationen finden Sie unter SchedulingCaps-Anforderungen.
MemoryManagementCaps Weitere Informationen finden Sie unter MemoryManagementCaps-Anforderungen.
GpuEngineTopology Legen Sie NbAsymetricProcessingNodes auf die Anzahl der unterstützten GPU-Engines fest.
WDDMVersion Muss auf DXGKDDI_WDDMv2_6 oder höher festgelegt werden.
PreemptionCaps Legen Sie GraphicsPreemptionGranularity entsprechend auf die von der Hardware unterstützte Ebene fest. Mindestens sollten Sie versuchen, die Vorabbescheidung auf Paketebene zu unterstützen. d. h. ein Ausqueue-Paket, das geplant wurde, aber noch nicht mit der Ausführung begonnen hat. Legen Sie ComputePreemptionGranularity auf alles andere als D3DKMDT_COMPUTE_PREEMPTION_NONE fest.
SupportPerEngineTDR Muss auf TRUE festgelegt werden. Weitere Informationen finden Sie unter TDR-Änderungen in Windows 8 und höher.
SupportRuntimePowerManagement Legen Sie entsprechend fest. Weitere Informationen finden Sie unter GPU-Energieverwaltung von Leerlaufzuständen und Wirkleistung.
SupportSurpriseRemovalInHibernation Legen Sie auf TRUE fest, wenn der Treiber das Entfernen von Überraschungen im Ruhezustand unterstützt. andernfalls entsprechend festgelegt. Siehe DXGKDDI_NOTIFY_SURPRISE_REMOVAL.
HybridDiscrete Muss auf FALSE festgelegt werden.
HybridIntegrated Muss auf FALSE festgelegt werden.
InternalGpuVirtualAddressRangeStart Legen Sie entsprechend fest. Wenn GpuVA nicht unterstützt wird, legen Sie auf Null fest. Wenn GpuVA unterstützt wird, gibt dieser Wert den Beginn des VA-Bereichs an, den das Betriebssystem bei der Zuweisung interner Ressourcen für die interne Verwendung des Betriebssystems verwendet.
InternalGpuVirtualAddressRangeEnd Legen Sie entsprechend fest. Wenn GpuVA nicht unterstützt wird, legen Sie auf Null fest. Wenn GpuVA unterstützt wird, gibt dieser Wert das Ende des VA-Bereichs an, den das Betriebssystem bei der Zuweisung interner Ressourcen für die interne Verwendung des Betriebssystems verwendet. Wenn sowohl der Start- als auch der Endwert 0 sind, verwendet das Betriebssystem den gesamten verfügbaren VA-Bereich.
SupportSurpriseRemoval Legen Sie entsprechend fest. Legen Sie auf TRUE fest, wenn der Treiber das Entfernen von Überraschungen auch außerhalb des Ruhezustands unterstützt. Siehe DXGKDDI_NOTIFY_SURPRISE_REMOVAL.
ComputeOnly Muss auf TRUE festgelegt werden. Dieses Flag muss implementiert werden.

Die folgenden DXGK_DRIVERCAPS Strukturmber müssen entsprechend auf null oder FALSE festgelegt werden:

  • MaxAllocationListSlotId
  • ApertureSegmentCommitLimit
  • MaxPointerWidth
  • MaxPointerHeight
  • PointerCaps
  • NumberOfSwizzlingRanges
  • MaxOverlays
  • GammaRampCaps
  • ColorTransformCaps
  • PresentationCaps
  • MaxQueuedFlipOnVSync
  • FlipCaps
  • SupportNonVGA
  • SupportSmoothRotation
  • SupportDirectFlip
  • SupportMultiPlaneOverlay
  • MaxOverlayPlanes
  • SupportMultiPlaneOverlayImmediateFlip
  • CursorScaledWithMultiPlaneOverlayPlane0
  • HybridAcpiChainingRequired
  • MaxQueuedMultiPlaneOverlayFlipVSync
  • SupportContextlessPresent
  • Entnehmbar

SchedulingCaps-Anforderungen

Die folgende DXGK_DRIVERCAPS. SchedulingCaps-Strukturmber müssen auf die entsprechenden Werte festgelegt werden:

Mitglied Hinweise
MultiEngineAware Muss auf TRUE festgelegt werden. Weitere Informationen finden Sie unter GPU-Vorzeitige Entfernung.
VSyncPowerSaveAware Muss auf FALSE festgelegt werden.
PreemptionAware Muss auf TRUE festgelegt werden. Weitere Informationen finden Sie unter GPU-Vorzeitige Entfernung.
NoDmaPatching Muss auf FALSE festgelegt werden.
CancelCommandAware Legen Sie nach Bedarf fest. Siehe DXGKDDI_CANCELCOMMAND.
No64BitAtomics Legen Sie nach Bedarf fest. Weitere Informationen finden Sie unter Kontextüberwachung.
LowIrqlPreemptCommand Auf TRUE festgelegt. Das Betriebssystem ruft den DxgkDdiPreemptCommand des Treibers bei niedrigem IRQL-Wert auf.
HwQueuePacketCap Reserviert; auf 0 (null) festgelegt.

MemoryManagementCaps-Anforderungen

Die folgende DXGK_DRIVERCAPS. Die Elemente der MemoryManagementCaps-Struktur müssen auf die entsprechenden Werte festgelegt werden:

Mitglied Hinweise
OutOfOrderLock Muss auf FALSE festgelegt werden.
DedicatedPagingEngine Muss auf FALSE festgelegt werden.
PagingEngineCanSwizzle Muss auf FALSE festgelegt werden.
SectionBackedPrimary Muss auf FALSE festgelegt werden.
CrossAdapterResource Legen Sie nach Bedarf fest. Weitere Informationen finden Sie unter Verwenden von adapterübergreifenden Ressourcen in einem Hybridsystem.
VirtualAddressingSupported Legen Sie nach Bedarf fest. Weitere Informationen finden Sie unter GPU Virtual Memory in WDDM 2.0. Wenn dieser Member festgelegt ist, muss der Treiber auch GpuMmuSupported und/oder IoMmuSupported festlegen.
GpuMmuSupported Legen Sie nach Bedarf fest. Siehe GpuMmu-Modell.
IoMmuSupported Legen Sie nach Bedarf fest. Diese Obergrenze wird festgelegt, wenn das Gerät Seitentabellen mit der CPU (Shared Virtual Memory, SVM) teilt. Siehe IoMmu-Modell.
ReplicateGdiContent Muss auf FALSE festgelegt werden.
NonCpuVisiblePrimary Muss auf FALSE festgelegt werden.
ParavirtualizationSupported MCDM-Hosttreiber, die die Virtualisierung des Geräts über die GPU-Partitionierungsschnittstelle (GPU-P mit SR-IOV) unterstützen, sollten dieses Feld auf FALSE festlegen. In allen anderen Fällen (Treiber für physische Computer ohne GPU-P-Unterstützung oder Gasttreiber von vGPUs, die über GPU-P verfügbar gemacht wurden) sollte dieses Feld auf TRUE festgelegt werden.
IoMmuSecureModeSupported Legen Sie nach Bedarf fest. Wenn diese Obergrenze TRUE festgelegt ist, unterstützt der Treiber die IoMmu-Isolation (das Gerät verfügt über eine dedizierte Seitentabelle für die IoMmu-Einheit). Wenn diese Obergrenze false festgelegt ist, kann das Gerät nicht in den "sicheren" virtuellen Computern (Windows-Sandbox oder MDAG) verwendet werden.
DisableSelfRefreshVRAMInS3 Legen Sie nach Bedarf fest.

Speicherverwaltung

Virtuelle Adressierung ist erforderlich. Die Unterstützung physischer Adressierung kann in Zukunft aktiviert werden.

Geräte müssen keine Speicheröffnung unterstützen.

Es werden nur lineare Speicherraumsegmente und lineare Öffnungsraumsegmente unterstützt.