Partager via


Préemption GPU

Un modèle de préemption GPU plus récent était disponible à partir de Windows 8. Dans ce modèle, le système d’exploitation n’autorise plus la désactivation de la préemption des paquets d’accès direct à la mémoire (DMA) GPU et garantit que les demandes de préemption seront envoyées au GPU avant qu’un processus de détection et de récupération de délai d’expiration (TDR) ne soit lancé.

Condition requise Description
Version minimale du modèle de pilote d’affichage Windows (WDDM) 1,2
Version minimale de Windows 8
Implémentation du pilote : graphiques complets et rendu uniquement Obligatoire
Exigences et tests WHLK Device.Graphics... Test de préemption, Device.Graphics... FlipOnVSyncMmIo

Si les paquets de longue durée ne peuvent pas être correctement préemptés, le travail GPU de priorité élevée, tel que le travail requis par le Gestionnaire de fenêtres de bureau (DWM), peut être retardé, ce qui entraîne des problèmes lors des transitions de fenêtre et des animations. En outre, les paquets GPU de longue durée qui ne peuvent pas être préemptés peuvent entraîner une réinitialisation répétée du GPU par un processus TDR, et éventuellement une vérification d’erreur système peut se produire.

Note Tous les pilotes miniports d’affichage WDDM 1.2 doivent prendre en charge le modèle de préemption Windows 8. Toutefois, lorsqu’ils sont en fonctionnement, les pilotes WDDM 1.2 peuvent également rejeter le modèle de préemption Windows 8 et conserver le comportement de Windows 7 par le planificateur du sous-système du noyau graphique Microsoft DirectX.

Interfaces de pilote de périphérique de préemption GPU (DDIs)

Les interfaces de pilote de périphérique (DDIs) suivantes sont disponibles pour le pilote miniport d’affichage afin d’implémenter le modèle de préemption GPU Windows 8.

Afficher l’implémentation du pilote miniport

Suivez ces étapes générales pour implémenter le modèle de préemption GPU Windows 8 dans votre pilote de miniport d’affichage :

  1. Compilez votre pilote sur les en-têtes qui ont DXGKDDI_INTERFACE_VERSION>= DXGKDDI_INTERFACE_VERSION_WIN8.
  2. Déclarez la prise en charge du modèle de préemption GPU Windows 8 en définissant les membres PreemptionAware et MultiEngineAware de la structure DXGK_VIDSCHCAPS sur 1. Pour prendre en charge le modèle de préemption Windows 7, définissez PreemptionAware sur zéro.
  3. Spécifiez le niveau de granularité de préemption pris en charge dans la structure D3DKMDT_PREEMPTION_CAPS , qui prend des valeurs constantes des énumérations D3DKMDT_GRAPHICS_PREEMPTION_GRANULARITY et D3DKMDT_COMPUTE_PREEMPTION_GRANULARITY .
  4. Si le matériel prend en charge le basculement de contexte différé, envoyez une mémoire tampon de longueur nulle à la fonction DxgkDdiSubmitCommand et définissez le membre pSubmitCommand-Flags-ContextSwitch>> sur 1. Notez la discussion sous le membre ContextSwitch de la structure DXGK_SUBMITCOMMANDFLAGS .
  5. Définissez les allocations de contexte GPU et les allocations de contexte d’appareil en appelant la fonction DxgkCbCreateContextAllocation . Notez les instructions et restrictions spécifiques fournies dans Remarques pour la fonction .
  6. Appelez la fonction DxgkCbDestroyContextAllocation pour détruire les allocations de contexte GPU et les allocations de contexte d’appareil créées avec DxgkCbCreateContextAllocation.
  7. Lors de la préparation de la mémoire tampon DMA en réponse à un appel à la fonction DxgkDdiBuildPagingBuffer , initialisez la ressource de contexte en remplissant la structure interne InitContextResource dans la structure DXGKARG_BUILDPAGINGBUFFER . Si des ressources de contexte sont supprimées ou déplacées, le gestionnaire de mémoire vidéo conserve le contenu des ressources de contexte.
  8. Le pilote doit prendre en charge le retournement d’E/S mappée en mémoire lors de la synchronisation verticale suivante. Dans Windows 8, le planificateur GPU tente de préempter le matériel même si des retournements sont en attente. Par conséquent, pour empêcher le déchirage et le rendu des artefacts, le pilote doit prendre en charge le modèle de retournement d’E/S mappé en mémoire et doit définir le membre FlipOnVSyncMmIo de la structure DXGK_FLIPCAPS sur 1 et prendre en charge les opérations décrites sous FlipOnVSyncMmIo.

Considérations relatives au mappage de mémoire dans votre implémentation

Créez un pilote robuste qui prend en charge le modèle de préemption GPU Windows 8 et fournit une expérience utilisateur de qualité en suivant ces conseils :

  • Demandez la préemption de la mémoire tampon mid-DMA à partir du GPU lorsque le planificateur du noyau graphique DirectX (Dxgkrnl) envoie une commande de préemption. Les appareils matériels qui ont une granularité plus fine de préemption de mémoire tampon mi-DMA doivent produire une meilleure expérience client.
  • Autoriser la réutilisation des ID de clôture de commande de pagination : si une demande de préemption a entraîné la préemption des commandes de pagination dans la file d’attente matérielle, le planificateur Dxgkrnl soumettrea à nouveau les commandes de pagination préemptées avec les mêmes ID de clôture que ceux utilisés à l’origine pour elles, et les commandes de pagination seront planifiées avant d’autres commandes sur ce moteur. Les commandes sans pagination seront resoumises avec des ID de clôture nouvellement attribués.
  • Fournissez une liste d’emplacements de correctif pour les mémoires tampons DMA fractionnées. Consultez Fractionnement d’une mémoire tampon DMA.
  • Un mode de vérification, appelé détection des fuites de liaison, est disponible, qui décrit la liste des emplacements des correctifs et rejette les paquets qui ne sont pas dissociés ou qui ne reprogramment pas les allocations pour chaque paquet fractionné. Certains matériels prennent en charge les adresses virtuelles, ce qui permet un niveau d’indirection supplémentaire qui peut rendre cette vérification inutile. Dans ce cas, pour indiquer que le pilote refuse le mode de vérification, définissez le membre NoDmaPatching de la structure DXGK_VIDSCHCAPS sur 1.
  • Dans Windows 7, le planificateur Dxgkrnl garantit que tous les paquets DMA fractionnés qui correspondent à la même commande de rendu sont exécutés séquentiellement sans basculer vers un autre contexte de rendu. Dans le modèle de préemption Windows 8, le planificateur peut exécuter des paquets de rendu à partir d’un contexte différent entre deux paquets fractionnés qui correspondent à la même commande render. Par conséquent, les pilotes qui sont conscients de la préemption doivent gérer une soumission de paquets DMA fractionnée/partielle de la même façon qu’une soumission de paquets complets standard. En particulier, l’état du GPU doit être enregistré ou restauré à la limite de ces soumissions.
  • Un pilote prenant en charge la préemption ne doit pas modifier le contenu d’une mémoire tampon DMA fractionnée lorsqu’elle est diffusée sur plusieurs cartes en mode LDA (Linked Display Adapter), où plusieurs GPU physiques sont liés pour former un gpu virtuel unique, plus rapide. En effet, dans le modèle de préemption Windows 8, le planificateur Dxgkrnl ne garantit plus l’exécution synchrone d’une séquence de paquets fractionnés sans basculer vers un autre contexte. Un pilote qui a modifié le contenu d’un paquet DMA fractionné compromettrait l’intégrité des données du paquet, car si le paquet était exécuté sur un autre moteur, il fonctionnerait sur la même copie des données de mémoire tampon DMA.
  • Dans le modèle de préemption GPU Windows 8, le planificateur Dxgkrnl active la préemption pour les paquets qui ont des primitives de synchronisation « signal on submit » associées. Si un appareil utilise des primitives de synchronisation « signal lors de l’envoi » conjointement avec des états d’attente basés sur le matériel, il doit prendre en charge la possibilité de préempter une instruction d’attente avant que la condition d’attente soit satisfaite.

Conditions de certification matérielle

Pour plus d’informations sur les exigences que les appareils matériels doivent respecter lorsqu’ils implémentent cette fonctionnalité, reportez-vous à la documentation WHCK appropriée sur Device.Graphics... Test de préemption et appareil.Graphics... FlipOnVSyncMmIo.

Consultez fonctionnalités WDDM 1.2 pour passer en revue les fonctionnalités ajoutées avec Windows 8.