Partager via


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 :

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 :

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 :

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 :

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 :

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 :

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 :

DxgkDdiDispatchIoRequest

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 :

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.