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:
- Ordnen Sie eine DRIVER_INITIALIZATION_DATA-Struktur zu, und initialisieren Sie sie. Weitere Informationen finden Sie unter Anforderungen für die Unterstützung von Treiberfunktionen .
- Rufen Sie DxgkInitialize mit der initialisierten Struktur auf.
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:
- DxgkDdiAddDevice
- DxgkDdiBuildPagingBuffer
- DxgkDdiCalibrateGpuClock
- DxgkDdiCloseAllocation
- DxgkDdiCollectDbgInfo
- DxgkDdiCreateAllocation
- DxgkDdiCreateContext
- DxgkDdiCreateDevice
- DxgkDdiDescribeAllocation
- DxgkDdiDestroyAllocation
- DxgkDdiDestroyContext
- DxgkDdiDestroyDevice
- DxgkDdiDpcRoutine
- DxgkDdiFormatHistoryBuffer
- DxgkDdiGetNodeMetadata
- DxgkDdiGetStandardAllocationDriverData
- DxgkDdiInterruptRoutine
- DxgkDdiOpenAllocation
- DxgkDdiPreemptCommand
- DxgkDdiQueryAdapterInfo (weitere Informationen finden Sie unter DxgkDdiQueryAdapterInfo-Anforderungen)
- DxgkDdiQueryDependentEngineGroup
- DxgkDdiQueryDeviceDescriptor
- DxgkDdiQueryEngineStatus
- DxgkDdiRemoveDevice
- DxgkDdiResetDevice
- DxgkDdiResetEngine
- DxgkDdiResetFromTimeout
- DxgkDdiRestartFromTimeout
- DxgkDdiSetPowerState
- DxgkDdiSetStablePowerState
- DxgkDdiSetVirtualMachineData
- DxgkDdiStartDevice
- DxgkDdiStopDevice
- DxgkDdiUnload
- DxgkDdiQueryChildStatus
- DxgkDdiQueryChildRelations
- DxgkDdiQueryConnectionChange
- DxgkDdiQueryDeviceDescriptor
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:
- DxgkDdiCreateProcess
- DxgkDdiDestroyProcess
- DxgkDdiGetRootPageTableSize
- DxgkDdiSetRootPageTable
- DxgkDdiSubmitCommandVirtual
Unterstützung der IoMmu-Isolation
Wenn die IoMmu-Isolation unterstützt wird, müssen auch Zeiger auf die folgenden Funktionen bereitgestellt werden:
Linkadapterunterstützung
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:
- DxgkDdiSetPowerComponentFState; erforderlich, wenn gemeldete Komponenten F-Zustände unterstützen.
- DxgkDdiPowerRuntimeControlRequest
- DxgkDdiPowerRuntimeSetDeviceHandle
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:
- DxgkDdiCreateHwContext
- DxgkDdiCreateHwQueue
- DxgkDdiDestroyHwContext
- DxgkDdiDestroyHwQueue
- DxgkDdiPresentToHwQueue
- [DxgkDdiResetHwEngine
- DxgkDdiResumeContext
- DxgkDdiResumeHwEngine
- DxgkDdiSetContextSchedulingProperties
- DxgkDdiSetSchedulingLogBuffer
- DxgkDdiSetupPriorityBands
- DxgkDdiSignalMonitoredFence
- DxgkDdiSubmitCommandToHwQueue
- DxgkDdiSuspendContext
- DxgkDdiSwitchToHwContextList
- DxgkDdiUpdateHwContextState
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:
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:
- DXGKQAITYPE_DRIVERCAPS
- DXGKQAITYPE_NUMPOWERCOMPONENTS
- DXGKQAITYPE_HISTORYBUFFERPRECISION
- DXGKQAITYPE_QUERYSEGMENT4 (weitere Informationen finden Sie unter Verwenden von Speichersegmenten zum Beschreiben des GPU-Adressraums).
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.