DXGKDDI_PRESENT fonction de rappel (d3dkmddi.h)
La fonction DxgkDdiPresent copie le contenu des allocations sources vers une surface primaire (et parfois vers des allocations de mémoire système hors écran).
Syntaxe
DXGKDDI_PRESENT DxgkddiPresent;
NTSTATUS DxgkddiPresent(
[in] IN_CONST_HANDLE hContext,
[in/out] INOUT_PDXGKARG_PRESENT pPresent
)
{...}
Paramètres
[in] hContext
Handle dans le contexte de l’appareil pour les informations de copie. La fonction DxgkDdiCreateContext du pilote miniport d’affichage a précédemment retourné ce handle dans le membre hContext de la structure DXGKARG_CREATECONTEXT vers laquelle pointe le paramètre pCreateContext de DxgkDdiCreateContext .
Si le pilote ne prend pas en charge la création de contexte, le sous-système du noyau graphique Microsoft DirectX remplace le handle du contexte par un handle pour l’appareil. La fonction DxgkDdiCreateDevice du pilote miniport d’affichage a précédemment retourné le handle d’appareil dans le membre hDevice de la structure DXGKARG_CREATEDEVICE vers laquelle pointe le paramètre pCreateDevice de DxgkDdiCreateDevice .
[in/out] pPresent
Pointeur vers une structure de DXGKARG_PRESENT qui contient des informations sur l’opération de copie.
Valeur retournée
DxgkDdiPresent retourne l’une des valeurs suivantes :
Code de retour | Description |
---|---|
STATUS_SUCCESS | DxgkDdiPresent a correctement copié le contenu. |
STATUS_NO_MEMORY ou STATUS_INSUFFICIENT_RESOURCES | DxgkDdiPresent n’a pas pu allouer la mémoire nécessaire à sa fin. |
STATUS_GRAPHICS_INSUFFICIENT_DMA_BUFFER | La mémoire tampon d’accès direct à la mémoire (DMA) actuelle est épuisée. |
STATUS_GRAPHICS_CANNOTCOLORCONVERT | Le pilote de miniport d’affichage a détecté un transfert de bloc de bits (bitblt) pour la conversion de couleur que l’appareil n’a pas pu effectuer. Le runtime Microsoft Direct3D empêche l’application de continuer et l’application reçoit un échec de copie du contenu. |
STATUS_PRIVILEGED_INSTRUCTION | DxgkDdiPresent a détecté des instructions non privilégiées (c’est-à-dire des instructions qui accèdent à la mémoire au-delà du privilège du processus actuel de l’unité de traitement centrale [UC] ). |
STATUS_ILLEGAL_INSTRUCTION | DxgkDdiPresent a détecté des instructions que le matériel graphique ne peut pas prendre en charge. |
STATUS_INVALID_HANDLE | DxgkDdiPresent a détecté un handle non valide dans la mémoire tampon de commande. |
STATUS_GRAPHICS_GPU_EXCEPTION_ON_DEVICE | Le pilote de miniport d’affichage a détecté une erreur dans le flux DMA. Le périphérique de contexte graphique est placé dans un état perdu si le pilote retourne ce code d’erreur. |
Remarques
Le sous-système du noyau graphique DirectX appelle la fonction DxgkDdiPresent du pilote miniport d’affichage pour copier le contenu des allocations sources vers la surface primaire. (Cette fonction peut également copier du contenu dans une allocation de mémoire système hors écran.) Étant donné qu’une surface primaire est définie de manière vague, DxgkDdiPresent peut être implémenté dans les scénarios suivants :
- Selon la position de la fenêtre, la fonction DxgkDdiPresent doit être exécutée sur différentes primaires qui peuvent se trouver sur le même adaptateur ou sur différentes cartes.
- Le principal se trouve sur un moniteur distant et est accessible via un client de services terminal ou Microsoft NetMeeting.
- Un changement de mode s’est récemment produit et le format principal est différent du format source. Une conversion de couleur est donc nécessaire. En outre, l’opération DxgkDdiPresent peut être clippée en raison du découpage et de l’ordre de la fenêtre.
Le pilote de miniport d’affichage n’est pas nécessaire pour connaître les spécificités des scénarios précédents tant que le pilote prend en charge les abstractions suivantes :
- Dans une opération de copie d’une source de mémoire vidéo vers une destination de mémoire système ou vidéo principale, une copie d’une source de mémoire système hors écran vers la destination principale, une copie de et vers la source principale ou une copie de la source primaire vers une destination de mémoire système hors écran, la source est spécifiée par le membre hDeviceSpecificAllocation de l’élément de tableau pAllocationList[DXGK_PRESENT_SOURCE_INDEX] de la structure DXGKARG_PRESENT que le pPresentent paramètre de DxgkDdiPresent pointe vers. La destination, qui est le principal actuel de l’appareil ou une allocation de mémoire système hors écran, est spécifiée par le membre hDeviceSpecificAllocation de l’élément de tableau pAllocationList[DXGK_PRESENT_DESTINATION_INDEX] de DXGKARG_PRESENT. Si la destination est égale à la source (c’est-à-dire, destination == source), l’opération de copie est un transfert de bloc de bits d’écran à écran (bitblt). Par conséquent, le sous-système graphique définit la source et la destination sur les valeurs suivantes :
- destination != NULL (autrement dit, destination == nonNULL)
- source != NULL (autrement dit, source == nonNULL)
- Dans un basculement de la mémoire vidéo de l’allocation actuelle vers une autre allocation, la source peut être spécifiée par le système d’exploitation et définie dans le membre hDeviceSpecificAllocation de l’élément de tableau pAllocationList[DXGK_PRESENT_SOURCE_INDEX] de DXGKARG_PRESENT. Le sous-système graphique définit la source et la destination sur les valeurs suivantes :
- destination == NULL
- source != NULL (autrement dit, source == nonNULL)
Note Un basculement sans opération peut être effectué à partir de la même allocation source que l’allocation actuellement analysée. Un basculement sans opération est utilisé pour insérer une attente en file d’attente pour un vide vertical dans le flux de rendu. Le pilote de miniport d’affichage doit insérer une commande de basculement matérielle comme s’il s’agissait d’un basculement vers une autre allocation. - Dans une opération de remplissage de couleur sur la surface primaire, aucune allocation source n’est requise et la destination est un handle d’allocation primaire spécifié par le membre hDeviceSpecificAllocation de l’élément de tableau pAllocationList[DXGK_PRESENT_DESTINATION_INDEX] de DXGKARG_PRESENT. Le membre Color de DXGKARG_PRESENT est généralement au format D3DDDIFMT_A8R8G8B8 du type d’énumération D3DDDIFORMAT . Toutefois, lorsque le format principal est RVB palettisé, Color contient l’index de palette. Par conséquent, le sous-système graphique définit la source et la destination sur les valeurs suivantes :
- destination != NULL (autrement dit, destination == nonNULL)
- source == NULL
Le sous-système graphique acquiert ensuite une nouvelle mémoire tampon DMA et appelle à nouveau la fonction DxgkDdiPresent du pilote avec la même liste de structures RECT que l’appel DxgkDdiPresent précédent. Le pilote doit utiliser le membre MultipassOffset de la structure DXGKARG_PRESENT pointée par pPresent pour enregistrer la progression de l’exécution de la liste RECT dans l’appel précédent à DxgkDdiPresent afin que le pilote puisse continuer à partir de l’endroit où il s’est arrêté avec la nouvelle mémoire tampon DMA. Lorsque la fonction DxgkDdiPresent du pilote termine la liste des structures RECT, elle retourne STATUS_SUCCESS.
En plus de générer une mémoire tampon DMA, le pilote miniport d’affichage doit générer une liste d’emplacements de correctif qui indique les différents décalages dans la mémoire tampon DMA qui doivent être corrigés ultérieurement lorsque les adresses physiques pour les allocations sont connues. Parfois, le gestionnaire de mémoire vidéo fournit au pilote des informations pré-corrigées (c’est-à-dire les dernières adresses physiques de la source et de la destination) dans la liste d’allocation.
Lorsque le gestionnaire de mémoire vidéo fournit ces informations, le pilote doit générer la mémoire tampon DMA en déterminant que ces adresses physiques sont les adresses finales fournies par le sous-système du noyau graphique DirectX. Le sous-système graphique n’appelle peut-être pas la fonction DxgkDdiPatch sur la mémoire tampon DMA pour la corriger ultérieurement. Par conséquent, le pilote doit utiliser les informations préalables au correctif pour générer correctement la mémoire tampon DMA. Des informations pré-corrigées sont fournies pour l’élément N lorsque le membre SegmentId du Nième élément du tableau pAllocationList de DXGKARG_PRESENT est différent de zéro.
L’allocation primaire d’une source est spécifiée dans la fonction DxgkDdiCommitVidPn . Si plusieurs chemins proviennent de la source donnée (mode clone), le pilote miniport d’affichage doit s’assurer que les sorties sont correctement pivotées en fonction du mode de rotation du chemin pour les différentes cibles. Tous les paramètres fournis à DxgkDdiPresent sont indépendants de la rotation. Les rectangles source et cible peuvent être l’intégralité de l’écran que les clients perçoivent (par exemple, 768 x 1024).
DxgkDdiPresent doit être rendu paginable.
Configuration requise
Condition requise | Valeur |
---|---|
Client minimal pris en charge | Windows Vista |
Plateforme cible | Desktop (Expérience utilisateur) |
En-tête | d3dkmddi.h |
IRQL | PASSIVE_LEVEL |
Voir aussi
DXGKARG_PRESENT