Instructions d’implémentation du pilote KM MCDM
Cet article fournit des conseils sur l’écriture de la partie pilote en mode noyau d’un pilote Microsoft Compute Only Driver (MCDM), également appelé pilote de calcul uniquement.
Consultez également les articles suivants :
Fichier INF du pilote
Les appareils MCDM appartiennent à la classe ComputeAccelerator , qui doit être spécifiée dans le fichier INF :
[Version]
...
Class=ComputeAccelerator
ClassGuid={F01A9D53-3FF6-48D2-9F97-C8A7004BE10C}
...
Initialisation du pilote
Un pilote de calcul uniquement doit fournir une fonction DriverEntry qui effectue les étapes suivantes :
- Allouez et initialisez une structure DRIVER_INITIALIZATION_DATA . Pour plus d’informations, consultez Exigences de prise en charge des fonctions de pilote.
- Appelez DxgkInitialize avec la structure initialisée.
Exigences de prise en charge des fonctions de pilote
Un pilote de calcul uniquement expose les fonctions qu’il implémente dans la structure DRIVER_INITIALIZATION_DATA .
Prise en charge minimale requise
Au minimum, un pilote de calcul uniquement doit fournir les fonctions d’interface de pilote de périphérique (DDI) suivantes :
- DxgkDdiAddDevice
- DxgkDdiBuildPagingBuffer
- DxgkDdiCalibrateGpuClock
- DxgkDdiCloseAllocation
- DxgkDdiCollectDbgInfo
- DxgkDdiCreateAllocation
- DxgkDdiCreateContext
- DxgkDdiCreateDevice
- DxgkDdiDescribeAllocation
- DxgkDdiDestroyAllocation
- DxgkDdiDestroyContext
- DxgkDdiDestroyDevice
- DxgkDdiDpcRoutine
- DxgkDdiFormatHistoryBuffer
- DxgkDdiGetNodeMetadata
- DxgkDdiGetStandardAllocationDriverData
- DxgkDdiInterruptRoutine
- DxgkDdiOpenAllocation
- DxgkDdiPreemptCommand
- DxgkDdiQueryAdapterInfo (pour plus d’informations, consultez Configuration requise pour DxgkDdiQueryAdapterInfo)
- DxgkDdiQueryDependentEngineGroup
- DxgkDdiQueryDeviceDescriptor
- DxgkDdiQueryEngineStatus
- DxgkDdiRemoveDevice
- DxgkDdiResetDevice
- DxgkDdiResetEngine
- DxgkDdiResetFromTimeout
- DxgkDdiRestartFromTimeout
- DxgkDdiSetPowerState
- DxgkDdiSetStablePowerState
- DxgkDdiSetVirtualMachineData
- DxgkDdiStartDevice
- DxgkDdiStopDevice
- DxgkDdiUnload
- DxgkDdiQueryChildStatus
- DxgkDdiQueryChildRelations
- DxgkDdiQueryConnectionChange
- DxgkDdiQueryDeviceDescriptor
Prise en charge de l’ouverture de l’hôte du processeur
Si l’ouverture de l’hôte du processeur est prise en charge, des pointeurs vers les fonctions suivantes doivent également être fournis :
Pour plus d’informations, consultez Ouverture de l’hôte du processeur.
Prise en charge de l’adressage physique
Si l’adressage physique est utilisé, des pointeurs vers les fonctions suivantes doivent également être fournis :
Prise en charge de l’adressage virtuel GPU
Si l’adressage virtuel GPU est utilisé, des pointeurs vers les fonctions suivantes doivent également être fournis :
- DxgkDdiCreateProcess
- DxgkDdiDestroyProcess
- DxgkDdiGetRootPageTableSize
- DxgkDdiSetRootPageTable
- DxgkDdiSubmitCommandVirtual
Prise en charge de l’isolation IoMmu
Si l’isolation IoMmu est prise en charge, des pointeurs vers les fonctions suivantes doivent également être fournis :
Prise en charge de l’adaptateur de liaison
Pour la prise en charge facultative de l’adaptateur de liaison, un pointeur vers la fonction suivante doit également être fourni :
Prise en charge de la gestion de l’alimentation
Pour la prise en charge facultative de la gestion de l’alimentation, des pointeurs vers les fonctions suivantes doivent également être fournis :
- DxgkDdiSetPowerComponentFState ; obligatoire si les composants signalés prennent en charge les états F.
- DxgkDdiPowerRuntimeControlRequest
- DxgkDdiPowerRuntimeSetDeviceHandle
REMARQUE : la prise en charge de la gestion de l’alimentation est requise sur les systèmes de secours modernes ou de secours connectés.
Pour plus d’informations, consultez Gestion de l’alimentation GPU des états inactifs et de l’alimentation active.
Prise en charge de la suppression surprise
Pour la prise en charge de la suppression de surprises facultatives, des pointeurs vers les fonctions suivantes doivent également être fournis :
Annuler la prise en charge
Pour la prise en charge de l’annulation facultative, des pointeurs vers les fonctions suivantes doivent également être fournis :
Prise en charge de l’interface
Pour la prise en charge de l’interface facultative, des pointeurs vers les fonctions suivantes doivent également être fournis :
Prise en charge de la planification matérielle
Pour la prise en charge de la planification matérielle facultative, des pointeurs vers les fonctions suivantes doivent également être fournis :
- DxgkDdiCreateHwContext
- DxgkDdiCreateHwQueue
- DxgkDdiDestroyHwContext
- DxgkDdiDestroyHwQueue
- DxgkDdiPresentToHwQueue
- [DxgkDdiResetHwEngine
- DxgkDdiResumeContext
- DxgkDdiResumeHwEngine
- DxgkDdiSetContextSchedulingProperties
- DxgkDdiSetSchedulingLogBuffer
- DxgkDdiSetupPriorityBands
- DxgkDdiSignalMonitoredFence
- DxgkDdiSubmitCommandToHwQueue
- DxgkDdiSuspendContext
- DxgkDdiSwitchToHwContextList
- DxgkDdiUpdateHwContextState
Prise en charge de UpdateAllocationProperty
Pour la prise en charge facultative de UpdateAllocationProperty, des pointeurs vers les fonctions suivantes doivent également être fournis :
- DxgkDdiValidateUpdateAllocationProperty
Prise en charge de l’échappement
Pour la prise en charge facultative de l’échappement, des pointeurs vers les fonctions suivantes doivent également être fournis :
Prise en charge du suivi d’événements pour Windows
Pour la prise en charge facultative d’ETW, des pointeurs vers les fonctions suivantes doivent également être fournis :
Prise en charge des appareils enfants
Pour la prise en charge facultative des appareils enfants, des pointeurs vers les fonctions suivantes doivent également être fournis :
Prise en charge des rapports de consommation d’énergie
Pour la prise en charge facultative des rapports de consommation d’énergie, des pointeurs vers les fonctions suivantes doivent également être fournis :
Validation de l’envoi de commandes
Pour la validation facultative de l’envoi de commandes, des pointeurs vers les fonctions suivantes doivent également être fournis :
Prise en charge de IOCTL
Pour la prise en charge facultative de IOCTL, un pointeur vers la fonction suivante peut être fourni :
Fonctions interdites
Les DDIs suivants ne doivent pas être fournis dans un pilote MCDM :
- 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
Fonctions WDDM 1.x
Les fonctions suivantes sont utilisées uniquement pour les pilotes WDDM 1.x :
- DxgkDdiQueryDiagnosticTypesSupport
- DxgkDdiQueryVidPnHWCapability
- DxgkDdiRecommendFunctionalVidPn
- DxgkDdiRecommendMonitorModes
- DxgkDdiRecommendVidPnTopology
- DxgkDdiReleaseSwizzlingRange
- DxgkDdiRenderGdi
- DxgkDdiRenderKm
- DxgkDdiSetDisplayPrivateDriverFormat
- DxgkDdiSetPalette
- DxgkDdiSetPointerPosition
- DxgkDdiSetPointerShape
- DxgkDdiSetPowerPState (le pilote ne doit pas signaler de composants d’alimentation à état P)
- DxgkDdiSetTargetAdjustedColorimetry
- DxgkDdiSetTargetAdjustedColorimetry2
- DxgkDdiSetTargetAnalogCopyProtection
- DxgkDdiSetTargetContentType
- DxgkDdiSetTargetGamma
- DxgkDdiSetTimingsFromVidPn
- DxgkDdiSetVideoProtectedRegion
- DxgkDdiSetVidPnSourceAddress
- DxgkDdiSetVidPnSourceAddressWithMultiPlaneOverlay
- DxgkDdiSetVidPnSourceAddressWithMultiPlaneOverlay2
- DxgkDdiSetVidPnSourceAddressWithMultiPlaneOverlay3
- DxgkDdiSetVidPnSourceVisibility
- DxgkDdiStopCapture
- DxgkDdiStopDeviceAndReleasePostDisplayOwnership
- DxgkDdiSubmitRender
- DxgkDdiSystemDisplayEnable
- DxgkDdiSystemDisplayWrite
- DxgkDdiUpdateActiveVidPnPresentPath
- DxgkDdiUpdateMonitorLinkInfo
- DxgkDdiUpdateOverlay
Configuration requise pour les informations de l’adaptateur de requête
Comme indiqué précédemment, un pilote de calcul uniquement doit prendre en charge DxgkDdiQueryAdapterInfo.
Les types de DXGK_QUERYADAPTERINFOTYPE suivants doivent être pris en charge :
- DXGKQAITYPE_DRIVERCAPS
- DXGKQAITYPE_NUMPOWERCOMPONENTS
- DXGKQAITYPE_HISTORYBUFFERPRECISION
- DXGKQAITYPE_QUERYSEGMENT4 (pour plus d’informations, consultez Utilisation de segments de mémoire pour décrire l’espace d’adressage GPU)
La prise en charge des types DXGK_QUERYADAPTERINFOTYPE suivants est facultative :
- DXGK_ADAPTER_PERFDATA
- DXGK_ADAPTER_PERFDATACAPS
- DXGKQAITYPE_UMDRIVERPRIVATE
- DXGKQAITYPE_PHYSICALADAPTERCAPS
- DXGK_NODE_PERFDATA
- DXGK_GPUVERSION
Si un ou plusieurs blocs de mémoire non valides ont été signalés, les DXGK_QUERYADAPTERINFOTYPE suivantes doivent être prises en charge :
- DXGKQAITYPE_SEGMENTMEMORYSTATE
Si GPUVA est pris en charge, les DXGK_QUERYADAPTERINFOTYPE suivantes doivent être prises en charge :
- DXGKQAITYPE_GPUMMUCAPS
- DXGKQAITYPE_PAGETABLELEVELDESC
Si le nombre de composants d’alimentation signalés est supérieur à zéro, les DXGK_QUERYADAPTERINFOTYPE suivantes doivent être prises en charge :
- DXGKQAITYPE_POWERCOMPONENTINFO
Si la limite IoMmuSecureModeSupported est définie, les DXGK_QUERYADAPTERINFOTYPE suivantes doivent être prises en charge :
- DXGKQAITYPE_FRAMEBUFFERSAVESIZE
- DXGKQAITYPE_HARDWARERESERVEDRANGES
Les DXGK_QUERYADAPTERINFOTYPE suivantes ne doivent pas être prises en charge :
- 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
Exigences en matière de capacité de pilote
Les DXGK_DRIVERCAPS membres de structure suivants doivent être définis sur les valeurs appropriées :
Membre | Notes |
---|---|
HighestAcceptableAddress | Si cette adresse est inférieure à l’adresse physique la plus élevée de la mémoire système présente pendant le chargement du pilote, le chargement échoue. |
InterruptMessageNumber | Définissez le cas échéant. |
SchedulingCaps | Consultez Configuration requise pour SchedulingCaps. |
MemoryManagementCaps | Consultez Configuration requise pour MemoryManagementCaps. |
GpuEngineTopology | Définissez NbAsymetricProcessingNodes sur le nombre de moteurs GPU pris en charge. |
WDDMVersion | Doit être défini sur DXGKDDI_WDDMv2_6 ou version ultérieure. |
PreemptionCaps | Définissez GraphicsPreemptionGranularity de manière appropriée sur le niveau pris en charge par le matériel. Au minimum, vous devez essayer de prendre en charge la préemption au niveau des paquets ; autrement dit, un paquet de suppression de la file d’attente qui a été planifié mais qui n’a pas encore commencé à s’exécuter. Définissez ComputePreemptionGranularity sur autre chose que D3DKMDT_COMPUTE_PREEMPTION_NONE. |
SupportPerEngineTDR | Doit être défini sur TRUE. Consultez Modifications TDR dans Windows 8 et versions ultérieures. |
SupportRuntimePowerManagement | Définissez le cas échéant. Consultez Gestion de l’alimentation GPU des états inactifs et de l’alimentation active. |
SupportSurpriseRemovalInHibernation | Définissez sur TRUE si le pilote prend en charge la suppression surprise lors de la mise en veille prolongée ; sinon, définissez comme il convient. Voir DXGKDDI_NOTIFY_SURPRISE_REMOVAL. |
HybridDiscrete | Doit être défini sur FALSE. |
HybridIntegrated | Doit être défini sur FALSE. |
InternalGpuVirtualAddressRangeStart | Définissez le cas échéant. Si GpuVA n’est pas pris en charge, définissez sur zéro. Si GpuVA est pris en charge, cette valeur spécifie le début de la plage va être utilisée par le système d’exploitation lors de l’allocation de ressources internes pour une utilisation interne du système d’exploitation. |
InternalGpuVirtualAddressRangeEnd | Définissez le cas échéant. Si GpuVA n’est pas pris en charge, définissez sur zéro. Si gpuVA est pris en charge, cette valeur spécifie la fin de la plage va être utilisée par le système d’exploitation lors de l’allocation de ressources internes pour une utilisation interne du système d’exploitation. Si les valeurs de début et de fin sont égales à zéro, le système d’exploitation utilise l’intégralité de la plage d’évaluation disponible. |
SupportSurpriseRemoval | Définissez le cas échéant. Définissez sur TRUE si le pilote prend en charge la suppression surprise même en dehors de la mise en veille prolongée. Voir DXGKDDI_NOTIFY_SURPRISE_REMOVAL. |
ComputeOnly | Doit être défini sur TRUE. Cet indicateur doit être implémenté. |
Les membres de structure DXGK_DRIVERCAPS suivants doivent être définis sur zéro ou FALSE, en conséquence :
- MaxAllocationListSlotId
- ApertureSegmentCommitLimit
- MaxPointerWidth
- MaxPointerHeight
- PointerCaps
- NumberOfSwizzlingRanges
- MaxOverlays
- GammaRampCaps
- ColorTransformCaps
- PresentationCaps
- MaxQueuedFlipOnVSync
- FlipCaps
- SupportNonVGA
- SupportSmoothRotation
- SupportDirectFlip
- SupportMultiPlaneOverlay
- MaxOverlayPlanes
- SupportMultiPlaneOverlayImmediateFlip
- CursorScaledWithMultiPlaneOverlayPlane0
- HybridAcpiChainingRequiredred
- MaxQueuedMultiPlaneOverlayFlipVSync
- SupportContextlessPresent
- Détachable
Exigences de SchedulingCaps
Le DXGK_DRIVERCAPS suivant. Les membres de la structure SchedulingCaps doivent être définis sur les valeurs appropriées :
Membre | Notes |
---|---|
MultiEngineAware | Doit avoir la valeur TRUE. Consultez Préemption GPU. |
VSyncPowerSaveAware | Doit avoir la valeur FALSE. |
PréemptionAware | Doit avoir la valeur TRUE. Consultez Préemption GPU. |
NoDmaPatching | Doit avoir la valeur FALSE. |
CancelCommandAware | Définissez le cas échéant. Voir DXGKDDI_CANCELCOMMAND. |
No64BitAtomics | Définissez le cas échéant. Consultez Analyse du contexte. |
LowIrqlPreemptCommand | Définissez sur TRUE. Le système d’exploitation appelle la commande DxgkDdiPreemptCommand du pilote à faible IRQL. |
HwQueuePacketCap | Réservés au; défini sur zéro. |
Configuration requise pour MemoryManagementCaps
Le DXGK_DRIVERCAPS suivant. Les membres de la structure MemoryManagementCaps doivent être définis sur les valeurs appropriées :
Membre | Notes |
---|---|
OutOfOrderLock | Doit avoir la valeur FALSE. |
DedicatedPagingEngine | Doit avoir la valeur FALSE. |
PagingEngineCanSwizzle | Doit avoir la valeur FALSE. |
SectionBackedPrimary | Doit avoir la valeur FALSE. |
CrossAdapterResource | Définissez le cas échéant. Consultez Utilisation de ressources inter-adaptateurs dans un système hybride. |
VirtualAddressingSupported | Définissez le cas échéant. Consultez Mémoire virtuelle GPU dans WDDM 2.0. Si ce membre est défini, le pilote doit également définir GpuMmuSupported et/ou IoMmuSupported. |
GpuMmuSupported | Définissez le cas échéant. Consultez Modèle GpuMmu. |
IoMmuSupported | Définissez le cas échéant. Cette limite est définie lorsque l’appareil partage des tables de page avec le processeur (mémoire virtuelle partagée (SVM)). Consultez Modèle IoMmu. |
ReplicateGdiContent | Doit avoir la valeur FALSE. |
NonCpuVisiblePrimary | Doit avoir la valeur FALSE. |
ParavirtualizationSupported | Les pilotes hôtes MCDM qui prennent en charge la virtualisation de l’appareil via l’interface de partitionnement GPU (GPU-P avec SR-IOV) doivent définir ce champ sur FALSE. Tous les autres cas (pilotes pour les machines physiques sans prise en charge GPU-P ou pilotes invités de processeurs virtuels qui ont été exposés via GPU-P) doivent définir ce champ sur TRUE. |
IoMmuSecureModeSupported | Définissez le cas échéant. Si cette limite est définie sur TRUE, le pilote prend en charge l’isolation IoMmu (l’appareil dispose d’une table de pages dédiée pour l’unité IoMmu). Si cette limite est définie sur FALSE, l’appareil ne peut pas être utilisé dans les machines virtuelles « sécurisées » (Bac à sable Windows ou MDAG). |
DisableSelfRefreshVRAMInS3 | Définissez le cas échéant. |
Gestion de la mémoire
L’adressage virtuel est requis. La prise en charge de l’adressage physique peut être activée à l’avenir.
Les appareils ne sont pas nécessaires pour prendre en charge une ouverture de mémoire.
Seuls les segments d’espace mémoire linéaire et les segmentsd’espace d’ouverture linéaire sont pris en charge.