Partager via


Flux d’opération du modèle de pilote d’affichage Windows (WDDM)

Le diagramme suivant montre le flux d’opérations WDDM qui se produisent à partir du moment où un appareil de rendu est créé lorsque le contenu est présenté à l’affichage. Les informations qui suivent le diagramme décrivent la séquence ordonnée du flux d’opération plus en détail.

Diagramme montrant le flux d’opération WDDM de la création d’un appareil de rendu à la présentation du contenu sur l’affichage.

  • Création d’un appareil de rendu

    Après une demande d’application pour créer un appareil de rendu :

    • 1 : Le sous-système du noyau DirectX Graphics (Dxgkrnl) appelle la fonction DxgkDdiCreateDevice du pilote de miniport en mode noyau.

      KMD initialise l’accès direct à la mémoire (DMA) en retournant un pointeur vers une structure de DXGK_DEVICEINFO remplie dans le membre pInfo de la structure DXGKARG_CREATEDEVICE.

    • 2 : Si l’appel à DxgkDdiCreateDevice réussit, le runtime Direct3D appelle la fonction CreateDevice du pilote d’affichage en mode utilisateur (UMD).

    • 3 : Dans l’appel CreateDevice, UMD doit appeler explicitement la fonction pfnCreateContextCb du runtime pour créer un ou plusieurs contextes GPU, qui sont des threads GPU d’exécution sur l’appareil nouvellement créé. Le runtime retourne des informations à UMD dans les membres pCommandBuffer et CommandBufferSize de la structure D3DDDICB_CREATECONTEXT pour initialiser la mémoire tampon de commande.

  • Création de Surfaces pour un appareil

    Une fois qu’une application demande de créer des surfaces pour l’appareil de rendu :

  • Envoi de la mémoire tampon de commande en mode noyau

    Une fois qu’une application demande de dessiner sur une surface :

    • 7 : Le runtime Direct3D appelle la fonction UMD liée à l’opération de dessin, par exemple DrawPrimitive2.

    • 8 : Le runtime Direct3D appelle la fonction Present ou Flush de l’UMD pour que la mémoire tampon de commande soit envoyée en mode noyau. Remarque : UMD envoie également la mémoire tampon de commande lorsque la mémoire tampon de commande est pleine.

    • 9 : En réponse à l’étape 8, UMD appelle l’une des fonctions fournies par le runtime suivantes :

      • Fonction pfnPresentCb du runtime si Present a été appelé.
      • La fonction pfnRenderCb du runtime si Flush a été appelé ou que la mémoire tampon de commande est pleine.
    • 10 : la fonction DxgkDdiPresent de KMD est appelée si pfnPresentCb a été appelée, ou la fonction DxgkDdiRender ou DxgkDdiRenderKm si pfnRenderCb a été appelée. KMD valide la mémoire tampon de commande, écrit dans la mémoire tampon DMA au format du matériel et produit une liste d’allocation qui décrit les surfaces utilisées.

  • Envoi de la mémoire tampon DMA au matériel

    • 11 : Dxgkrnl appelle la fonction DxgkDdiBuildPagingBuffer de KMD pour créer des mémoires tampons DMA à usage spécial qui déplacent les allocations spécifiées dans la liste d’allocations vers et depuis la mémoire accessible par GPU. Ces mémoires tampons DMA spéciales sont appelées mémoires tampons de pagination. DxgkDdiBuildPagingBuffer n’est pas appelé pour chaque image.

    • 12 : Dxgkrnl appelle la fonction DxgkDdiSubmitCommand de KMD pour mettre en file d’attente les mémoires tampons de pagination vers l’unité d’exécution GPU.

    • 13 : Dxgkrnl appelle la fonction DxgkDdiPatch de KMD pour affecter des adresses physiques aux ressources de la mémoire tampon DMA.

    • 14 : Dxgkrnl appelle la fonction DxgkDdiSubmitCommand de KMD pour mettre en file d’attente la mémoire tampon DMA vers l’unité d’exécution GPU. Chaque mémoire tampon DMA envoyée au GPU contient un identificateur de clôture, qui est un nombre. Une fois le GPU terminé le traitement de la mémoire tampon DMA, le GPU génère une interruption.

    • 15 : KMD est averti de l’interruption dans sa fonction DxgkDdiInterruptRoutine . KMD doit lire, à partir du GPU, l’identificateur de clôture de la mémoire tampon DMA qui vient de se terminer.

    • 16 : KMD doit appeler DxgkCbNotifyInterrupt pour informer le DXGK que la mémoire tampon DMA s’est terminée. KMD doit également appeler DxgkCbQueueDpc pour mettre en file d’attente un appel de procédure différée (DPC).