Partager via


Instructions d’implémentation du pilote en mode noyau MCDM

Cet article fournit des conseils sur la façon d’écrire la partie KMD (Kernel-Mode Driver) d’un pilote Microsoft Compute Only Driver (MCDM), également appelée 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 du pilote :

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

Initialisation du pilote

Un pilote MCDM doit fournir une fonction DriverEntry qui effectue les étapes suivantes :

Configuration requise pour la prise en charge des fonctions de pilote

Un pilote MCDM expose les fonctions qu’il implémente dans la structure DRIVER_INITIALIZATION_DATA .

Prise en charge minimale requise

Au minimum, un pilote MCDM doit fournir les fonctions DDI (Device Driver Interface) suivantes :

Prise en charge de l'aperture d'hôte CPU

Si l’ouverture de l’hôte du processeur est prise en charge, les pointeurs vers les fonctions suivantes doivent également être fournis :

Pour plus d’informations, consultez ouverture de l’hôte processeur.

Prise en charge de l’adressage physique

Si l’adressage physique est utilisé, les pointeurs vers les fonctions suivantes doivent également être fournis :

Prise en charge de l'adressage virtuel du GPU

Si l’adressage virtuel GPU est utilisé, les pointeurs vers les fonctions suivantes doivent également être fournis :

Prise en charge de l’isolation IoMmu

Si l’isolation IoMmu est prise en charge, les pointeurs vers les fonctions suivantes doivent également être fournis :

Pour la prise en charge facultative de l’adaptateur de liaison, un pointeur vers la fonction suivante doit également être fourni :

  • DxgkDdiLinkDevice

Prise en charge de la gestion de l’alimentation

Pour la prise en charge facultative de la gestion de l’alimentation, les pointeurs vers les fonctions suivantes doivent également être fournis :

La prise en charge de la gestion de l’alimentation est nécessaire 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.

Assistance pour suppression imprévue

Pour un support facultatif à la déconnexion imprévue, des pointeurs vers les fonctions suivantes doivent également être fournis :

Annuler la prise en charge

Pour la prise en charge facultative de l’annulation, les pointeurs vers les fonctions suivantes doivent également être fournis :

Prise en charge de l’interface

Pour la prise en charge facultative de l’interface, les pointeurs vers les fonctions suivantes doivent également être fournis :

Prise en charge de la planification matérielle

Pour la prise en charge facultative de la planification matérielle, les pointeurs vers les fonctions suivantes doivent également être fournis :

Prise en charge de UpdateAllocationProperty

Pour la prise en charge facultative de UpdateAllocationProperty, les pointeurs vers les fonctions suivantes doivent également être fournis :

Support d'évasion

Pour la prise en charge facultative de l'évasion, il convient également de fournir des pointeurs vers les fonctions suivantes :

Prise en charge du suivi des événements pour Windows

Pour la prise en charge facultative d’ETW, les pointeurs vers les fonctions suivantes doivent également être fournis :

Prise en charge des appareils enfants

Pour la prise en charge facultative des appareils enfants, les pointeurs vers les fonctions suivantes doivent également être fournis :

Prise en charge du suivi de la consommation d'énergie

Pour la prise en charge facultative des rapports de consommation d’alimentation, les pointeurs vers les fonctions suivantes doivent également être fournis :

Validation de la soumission de commandes

Pour la validation facultative de la soumission de commandes, les pointeurs vers les fonctions suivantes doivent également être fournis :

Prise en charge IOCTL

Pour la prise en charge facultative de IOCTL, un pointeur vers la fonction suivante peut être fourni :

DxgkDdiDispatchIoRequest

Fonctions interdites

Les DDI suivants ne doivent en aucun cas être fournis dans un pilote MCDM :

  • DxgkDdiAcquireSwizzlingRange
  • DxgkDdiCheckMultiPlaneOverlaySupport
  • DxgkDdiCheckMultiPlaneOverlaySupport2 (vérification du support de superposition multiplaque)
  • 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 de puissance d'état P)
  • DxgkDdiSetTargetAdjustedColorimetry
  • DxgkDdiSetTargetAdjustedColorimetry2
  • DxgkDdiSetTargetAnalogCopyProtection
  • DxgkDdiSetTargetContentType
  • DxgkDdiSetTargetGamma
  • DxgkDdiSetTimingsFromVidPn
  • DxgkDdiSetVideoProtectedRegion
  • DxgkDdiSetVidPnSourceAddress
  • DxgkDdiSetVidPnSourceAddressWithMultiPlaneOverlay
  • DxgkDdiSetVidPnSourceAddressWithMultiPlaneOverlay2
  • DxgkDdiSetVidPnSourceAddressWithMultiPlaneOverlay3
  • DxgkDdiSetVidPnSourceVisibility
  • DxgkDdiStopCapture
  • DxgkDdiStopDeviceAndReleasePostDisplayOwnership
  • DxgkDdiSubmitRender
  • DxgkDdiSystemDisplayEnable
  • DxgkDdiSystemDisplayWrite
  • DxgkDdiUpdateActiveVidPnPresentPath
  • DxgkDdiUpdateMonitorLinkInfo
  • DxgkDdiUpdateOverlay

Exigences d'informations pour l'adaptateur de requête

Comme indiqué précédemment, un pilote de calcul uniquement doit prendre en charge DxgkDdiQueryAdapterInfo.

Les types DXGK_QUERYADAPTERINFOTYPE suivants doivent être pris en charge :

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, la DXGK_QUERYADAPTERINFOTYPE suivante doit être prise 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, la DXGK_QUERYADAPTERINFOTYPE suivante doit être prise en charge :

  • DXGKQAITYPE_POWERCOMPONENTINFO

Si la limite IoMmuSecureModeSupported est définie, la DXGK_QUERYADAPTERINFOTYPE suivante doit être prise 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 membres de la structure DXGK_DRIVERCAPS suivants doivent être définis sur les valeurs appropriées :

Membre Remarques
AdresseMaximaleAcceptable Si cette adresse est inférieure à l’adresse physique la plus élevée de la mémoire système présente pendant la charge du pilote, la charge échoue.
NuméroDeMessageD'interruption Définissez le cas échéant.
Capacités de Planification Consultez les exigences de SchedulingCaps.
MemoryManagementCaps Consultez la configuration requise de 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 correctement au niveau pris en charge par le matériel. Au minimum, vous devez tenter de prendre en charge la préemption au niveau des paquets de file d’attente qui sont planifiés, mais qui n’ont pas encore démarré l’exécution. Affectez à ComputePreemptionGranularity une valeur autre que D3DKMDT_COMPUTE_PREEMPTION_NONE.
SupportPerEngineTDR Doit être défini sur TRUE. Consultez les modifications TDR dans Windows 8 et versions ultérieures.
Prise en charge de la gestion de l'énergie en temps réel Définissez le cas échéant. Consultez la gestion de l’alimentation du processeur graphique pour les états inactifs et la puissance active.
SupportSurpriseRemovalInHibernation Réglez sur TRUE si le pilote prend en charge la suppression surprise lors de la mise en veille prolongée ; sinon, réglez selon le besoin. Voir DXGKDDI_NOTIFY_SURPRISE_REMOVAL.
HybridDiscrete Doit être défini sur FAUX.
HybridIntegrated Doit être défini sur FAUX.
Début de la plage d'adresses virtuelles GPU interne Définissez le cas échéant. Si GpuVA n’est pas pris en charge, définissez-le à zéro. Si gpuVA est pris en charge, cette valeur spécifie le début de la plage VA que le système d’exploitation utilisera lors de l’allocation de ressources internes pour l’utilisation interne du système d’exploitation.
PlageDAdresseVirtuelleGpuInterneFin Définissez le cas échéant. Si GpuVA n’est pas pris en charge, définissez la valeur sur zéro. Si gpuVA est pris en charge, cette valeur spécifie la fin de la plage VA que le système d’exploitation utilisera lors de l’allocation de ressources internes pour l’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’ensemble de la plage va disponible.
Support de suppression surprise Définissez le cas échéant. Définissez la valeur TRUE si le pilote prend en charge la suppression surprise même en dehors de la veille prolongée. Voir DXGKDDI_NOTIFY_SURPRISE_REMOVAL.
ComputeOnly Doit être défini sur TRUE. Cet indicateur doit être implémenté.

Les membres de la structure DXGK_DRIVERCAPS suivants doivent être définis sur zéro ou FALSE, en conséquence :

  • MaxAllocationListSlotId
  • ApertureSegmentCommitLimit
  • MaxPointerWidth
  • HauteurMaximaleDuPointeur
  • PointerCaps
  • NumberOfSwizzlingRanges
  • MaxOverlays
  • GammaRampCaps
  • ColorTransformCaps
  • Capsules de présentation
  • MaxQueuedFlipOnVSync
  • FlipCaps
  • SupportNonVGA
  • SupportSmoothRotation
  • SupportDirectFlip
  • SupportMultiPlaneOverlay
  • MaxOverlayPlanes
  • SupportMultiPlaneOverlayImmediateFlip
  • CurseurMisÀÉchelleAvecPlanDeSuperpositionMultiplansPlan0
  • HybridAcpiChainingRequired
  • MaxQueuedMultiPlaneOverlayFlipVSync
  • SupportContextlessPresent
  • Amovible

Configuration requise de PlanningCaps

Les membres suivants dans la structure DXGK_DRIVERCAPS.SchedulingCaps doivent être définis sur les valeurs appropriées :

Membre Remarques
MultiEngineAware Doit être défini sur TRUE. Consultez la préemption GPU.
VSyncPowerSaveAware Doit être défini sur FAUX.
PreemptionAware Doit être défini sur TRUE. Consultez la préemption GPU.
NoDmaPatching Doit être défini sur FAUX.
CancelCommandAware Définissez le cas échéant. Voir DXGKDDI_CANCELCOMMAND.
No64BitAtomics Définissez le cas échéant. Consultez Surveillance du contexte.
LowIrqlPreemptCommand Défini sur TRUE. Le système d’exploitation appelle le DxgkDdiPreemptCommand du pilote à faible IRQL.
HwQueuePacketCap Réservé; défini sur zéro.

Configuration requise pour MemoryManagementCaps

Les membres de la structure DXGK_DRIVERCAPS.MemoryManagementCaps doivent être définis sur les valeurs appropriées :

Membre Remarques
OutOfOrderLock Doit être défini sur FAUX.
DedicatedPagingEngine Doit être défini sur FAUX.
PagingEngineCanSwizzle Doit être défini sur FAUX.
SectionPrincipaleSoutenue Doit être défini sur FALSE.
CrossAdapterResource Définissez le cas échéant. Consultez l'utilisation de ressources inter-adaptateur dans un système hybride.
VirtualAddressingSupported Définissez le cas échéant. Consultez la mémoire virtuelle du 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 le modèle GpuMmu.
IoMmuSupported Définissez le cas échéant. Cette limite est définie lorsque l’appareil partage des tables de pages avec l’UC (mémoire virtuelle partagée (SVM)). Consultez le modèle IoMmu.
Reproduire le contenu GDI Doit être défini sur false.
NonCpuVisiblePrimary Doit être défini sur FAUX.
Paravirtualisation prise en charge 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 exposés via GPU-P) doivent définir ce champ sur TRUE.
IoMmuSecureModeSupported Définissez le cas échéant. Si ce paramètre est défini sur VRAI, 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 » (Windows Sandbox ou MDAG).
DésactiverAutoRafraîchissementVRAMEnS3 Définissez le cas échéant.

Gestion de la mémoire

L’adressage virtuel est requis. La prise en charge de l’adressage physique pourrait être activée à l’avenir.

Les dispositifs ne sont pas tenus de prendre en charge une fenêtre de mémoire.

Seuls les segments d’espace mémoire linéaire et les segments d’espace d’ouverture linéaire sont pris en charge.