Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
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 :
- Allouez et initialisez une structure DRIVER_INITIALIZATION_DATA . Pour plus d’informations, consultez la configuration requise pour la prise en charge des fonctions de pilote .
- Appelez DxgkInitialize avec la structure initialisée.
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 :
- DxgkDdiAddDevice
- DxgkDdiBuildPagingBuffer
- DxgkDdiCalibrateGpuClock
- DxgkDdiCloseAllocation
- DxgkDdiCollectDbgInfo
- DxgkDdiCreateAllocation
- DxgkDdiCreateContext
- DxgkDdiCreateDevice
- DxgkDdiDescribeAllocation
- DxgkDdiDestroyAllocation
- DxgkDdiDestroyContext
- DxgkDdiDestroyDevice
- DxgkDdiDpcRoutine
- DxgkDdiFormatHistoryBuffer
- DxgkDdiGetNodeMetadata
- DxgkDdiGetStandardAllocationDriverData
- DxgkDdiInterruptRoutine
- DxgkDdiOpenAllocation
- DxgkDdiPreemptCommand (commande de préemption DxgkDdi)
- DxgkDdiQueryAdapterInfo (pour plus d’informations, consultez les exigences de DxgkDdiQueryAdapterInfo)
- DxgkDdiQueryDependentEngineGroup
- DxgkDdiQueryDeviceDescriptor
- DxgkDdiQueryEngineStatus
- DxgkDdiRemoveDevice
- DxgkDdiResetDevice
- DxgkDdiResetEngine
- DxgkDdiResetFromTimeout
- DxgkDdiRestartFromTimeout
- DxgkDdiSetPowerState
- DxgkDdiSetStablePowerState
- DxgkDdiSetVirtualMachineData
- DxgkDdiStartDevice
- DxgkDdiStopDevice
- DxgkDdiUnload
- DxgkDdiQueryChildStatus
- DxgkDdiQueryChildRelations
- DxgkDdiQueryConnectionChange
- DxgkDdiQueryDeviceDescriptor
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 :
- DxgkDdiPatch
- DxgkDdiRender
- DxgkDdiSubmitCommand
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 :
- DxgkDdiCreateProcess
- DxgkDdiDestroyProcess
- DxgkDdiGetRootPageTableSize
- DxgkDdiSetRootPageTable
- DxgkDdiSubmitCommandVirtual
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 :
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, les pointeurs vers les fonctions suivantes doivent également être fournis :
- DxgkDdiSetPowerComponentFState ; obligatoire si les composants signalés prennent en charge les états F.
- DxgkDdiPowerRuntimeControlRequest
- DxgkDdiPowerRuntimeSetDeviceHandle
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 :
- 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, 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 :
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 :
- 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, 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.