D3DKMTPresent, fonction (d3dkmthk.h)
La fonction D3DKMTPresent envoie une commande actuelle au sous-système du noyau graphique Microsoft DirectX (Dxgkrnl.sys).
Syntaxe
NTSTATUS D3DKMTPresent(
[in] D3DKMT_PRESENT *unnamedParam1
);
Paramètres
[in] unnamedParam1
pData: pointeur vers une structure D3DKMT_PRESENT qui décrit les paramètres de présentation.
Valeur de retour
D3DKMTPresent retourne une valeur NTSTATUS, telle que l’une des valeurs suivantes :
code de retour | Description |
---|---|
STATUS_SUCCESS | Le présent a été exécuté avec succès. |
STATUS_DEVICE_REMOVED | La carte graphique a été arrêtée ou le contexte d’affichage a été réinitialisé. |
STATUS_INVALID_PARAMETER | Les paramètres ont été validés et déterminés comme incorrects. |
STATUS_NO_MEMORY | D3DKMTPresent n’a pas pu se terminer en raison d’une mémoire insuffisante. |
STATUS_GRAPHICS_ALLOCATION_INVALID | Le handle de surface principal a été invalidé en raison d’une modification du mode d’affichage. Si le pilote client installable OpenGL reçoit ce code d’erreur, il doit rouvrir ou recréer le handle principal, remplacer toutes les références dans la mémoire tampon de commande par l’ancien handle par le nouveau handle, puis renvoyer la mémoire tampon. |
STATUS_GRAPHICS_GPU_EXCEPTION_ON_DEVICE | Une erreur s’est produite sur le contexte de l’appareil de rendu que le membre hContext de D3DKMT_PRESENT spécifie. |
Note
Le code d’erreur STATUS_GRAPHICS_GPU_EXCEPTION_ON_DEVICE n’indique pas l’initiation d’un processus TDR (Timeout Detection and Recovery) ou que le GPU a cessé de répondre. Par exemple, le sous-système du noyau graphique DirectX place un appareil dans un état d’erreur si le pilote de miniport d’affichage indique qu’une mémoire tampon DMA envoyée à partir de cet appareil a provoqué une erreur ou si le gestionnaire de mémoire vidéo n’a pas pu pager toutes les allocations requises pour une mémoire tampon DMA, même après le fractionnement de la mémoire tampon DMA. Une fois qu’un appareil est dans un état d’erreur, il ne peut pas effectuer d’opérations supplémentaires et doit être détruit et recréé. L’ICD peut appeler la fonction D3DKMTGetDeviceState pour déterminer une raison plus précise de l’erreur.
Remarques
La fonction D3DKMTPresent peut retourner STATUS_INVALID_PARAMETER, en fonction de la combinaison de valeurs de paramètre (c’est-à-dire des valeurs dans les membres de la structure D3DKMT_PRESENT vers laquelle pData pointe). La liste suivante décrit les combinaisons les plus courantes de valeurs de paramètre susceptibles de provoquer D3DKMTPresent pour retourner STATUS_INVALID PARAMETER :
Le membre hDestination n’est pas NULL et au moins l’une des conditions suivantes est remplie :
- Le membre pSrcSubRects est NULL.
- Le membre SubRectCnt est 0.
- L’indicateur blt de champ binaire du membre indicateurs de n’est pas défini.
- L’indicateur de champ binaire SrcRectValid de indicateurs n’est pas défini.
- L’indicateur ColorFill de champ binaire de Indicateurs est défini.
- L'Flip, FlipDoNotFlip, FlipDoNotWaitou indicateur de champ binaire de Indicateurs est défini.
- L’indicateur SrcColorKey ou DstColorKey indicateur de champ binaire de indicateurs est défini.
- Le membre hSource est égal à hDestination .
- La source et la destination ne sont pas une surface principale.
L’indicateur Retourner champ binaire de indicateurs est défini et au moins l’une des conditions suivantes est remplie :
- L’indicateur ColorFill de champ binaire de Indicateurs est défini.
- L’indicateur blt de champ binaire de indicateurs est défini.
- L’indicateur SrcColorKey ou DstColorKey indicateur de champ binaire de indicateurs est défini.
- L’indicateur SrcRectValid ou indicateur de champ binaire DstRectValid des indicateurs de est défini.
- L’indicateur de faire pivoter champ binaire de indicateurs est défini.
- L’indicateur RestrictVidPnSource de champ binaire de Indicateurs est défini.
- La source n’est pas une surface primaire.
- Le pilote miniport d’affichage ne prend pas en charge l’intervalle de retournement spécifié par le membre FlipInterval.
- La fonction D3DKMTSetDisplayMode n’a pas été appelée précédemment.
L’indicateur de champ bit ColorFill de indicateurs est défini et l’une des conditions suivantes est remplie :
- pSrcSubRects est NULL .
- SubRectCnt est 0.
- L’indicateur blt de champ binaire de indicateurs est défini.
- L'Flip, FlipDoNotFlip, FlipDoNotWaitou indicateur de champ binaire de Indicateurs est défini.
- L’indicateur SrcColorKey ou DstColorKey indicateur de champ binaire de indicateurs est défini.
- L’indicateur de champ de SrcRectValid de indicateurs est défini.
L’indicateur blt bit-field de Flags est défini et l’une des conditions suivantes est remplie :
- pSrcSubRects est NULL .
- SubRectCnt est 0.
- L’indicateur ColorFill de champ binaire de Indicateurs est défini.
- L'Flip, FlipDoNotFlip, FlipDoNotWaitou indicateur de champ binaire de Indicateurs est défini.
Les pilotes graphiques en mode utilisateur qui appellent D3DKMTPresent pour le style blit présent, avec l’indicateur Blt bit-field de indicateurs set, doivent prendre soin de veiller à ce que tous les travaux précédemment soumis au ou les contextes présentés soient entièrement drainables. L’échec de cette opération peut entraîner l’interblocage de l’application lui-même ou dans certains cas d’interblocage du bureau utilisateur actuel. Un contexte est entièrement drainable s’il contient uniquement des attentes sur l’objet de synchronisation GPU où le signal correspondant a déjà été mis en file d’attente vers la base de données du planificateur GPU et où ce signal lui-même n’est pas derrière une autre attente indrainable. En d’autres termes, si l’espace utilisateur de tous les processus du système a été suspendu immédiatement après l’appel à D3DKMTPresent, l’attente serait satisfaite une fois que la chaîne de rendu dépendante déjà mise en file d’attente vers le planificateur GPU terminerait le rendu. Un pilote ne doit jamais appeler blit présent sur un contexte dépendant d’une attente GPU qui n’est pas actuellement satisfaite et censée être satisfaite par une opération ultérieure provenant de ce ou d’un autre processus.
Exemples
L’exemple de code suivant montre comment un ICD OpenGL peut utiliser D3DKMTPresent pour présenter des données.
HRESULT Present(D3DKMT_HANDLE hDevice,
HWND hWnd,
RECT* pSrcRect,
RECT* pDstRect)
{
D3DKMT_PRESENT PresentData = {0};
PresentData.hDevice = hDevice;
PresentData.Flags.Blt =
PresentData.Flags.DstRectValid =
PresentData.Flags.SrcRectValid = TRUE;
PresentData.hWindow = hWnd;
PresentData.DstRect = *pDstRect;
PresentData.SrcRect = *pSrcRect;
PresentData.SubRectCnt = 1;
PresentData.pSrcSubRects = pSrcRect;
if (NT_SUCCESS((*pfnKTPresent)(&PresentData))) {
return S_OK;
}
return E_FAIL;
}
Exigences
Exigence | Valeur |
---|---|
client minimum pris en charge | Windows Vista |
plateforme cible | Universel |
d’en-tête | d3dkmthk.h (include D3dkmthk.h) |
bibliothèque | Gdi32.lib |
DLL | Gdi32.dll |