Fonction D3DKMTPresent (d3dkmthk.h)

La fonction D3DKMTPresent envoie une commande present 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 retournée

D3DKMTPresent retourne une valeur NTSTATUS, telle que l’une des valeurs suivantes :

Code de retour Description
STATUS_SUCCESS Le présent a été effectué 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 principale a été invalidé en raison d’un changement de mode d’affichage. Si le pilote client installable OpenGL (ICD) 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 d’appareil de rendu spécifié par le membre hContext de D3DKMT_PRESENT .

Notes

Le code d’erreur STATUS_GRAPHICS_GPU_EXCEPTION_ON_DEVICE n’indique pas le lancement d’un processus de détection et de récupération de délai d’attente (TDR) 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 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 plus effectuer d’opérations 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ètres qui peuvent entraîner le retour de D3DKMTPresent STATUS_INVALID PARAMETER :

  • Le membre hDestination n’a pas la valeur NULL et au moins l’une des conditions suivantes est vraie :

    • Le membre pSrcSubRects est NULL.
    • Le membre SubRectCnt est 0.
    • L’indicateur de champ de bits Blt du membre Flags n’est pas défini.
    • L’indicateur de champ de bits SrcRectValid des indicateurs n’est pas défini.
    • L’indicateur de champ de bits ColorFill des indicateurs est défini.
    • L’indicateur de champ de bits Flip, FlipDoNotFlip, FlipDoNotWait ou FlipRestart des indicateurs est défini.
    • L’indicateur de champ de bits SrcColorKey ou DstColorKey des indicateurs est défini.
    • Le membre hSource est égal à hDestination.
    • La source et la destination ne sont pas une surface principale.
  • L’indicateur de champ de bits retournerdes indicateurs est défini et au moins l’une des conditions suivantes est vraie :

    • L’indicateur de champ de bits ColorFill des indicateurs est défini.
    • L’indicateur de champ de bits Blt des indicateurs est défini.
    • L’indicateur de champ de bits SrcColorKey ou DstColorKey des indicateurs est défini.
    • L’indicateur de champ de bits SrcRectValid ou DstRectValid des indicateurs est défini.
    • L’indicateur de champ de bits Pivoter des indicateurs est défini.
    • L’indicateur de champ de bits RestrictVidPnSource des 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 de bits ColorFill des indicateurs est défini et l’une des conditions suivantes est true :

    • pSrcSubRects a la valeur NULL.
    • SubRectCnt est 0.
    • L’indicateur de champ de bits Blt des indicateurs est défini.
    • L’indicateur de champ de bits Flip, FlipDoNotFlip, FlipDoNotWait ou FlipRestart des indicateurs est défini.
    • L’indicateur de champ de bits SrcColorKey ou DstColorKey des indicateurs est défini.
    • L’indicateur de champ de bits SrcRectValid des indicateurs est défini.
  • L’indicateur de champ de bits Blt des indicateurs est défini et l’une des conditions suivantes est true :

    • pSrcSubRects a la valeur NULL.
    • SubRectCnt est 0.
    • L’indicateur de champ de bits ColorFill des indicateurs est défini.
    • L’indicateur de champ de bits Flip, FlipDoNotFlip, FlipDoNotWait ou FlipRestart des indicateurs est défini.

Les pilotes graphiques en mode utilisateur qui appellent D3DKMTPresent pour le style blit présent, avec l’indicateur de champ de bits Blt défini des indicateurs , doivent veiller particulièrement à ce que tous les travaux précédemment soumis aux contextes présentés à partir de sont entièrement drainables. Si vous ne le faites pas, l’application peut se bloquer elle-même ou, dans certains cas, bloquer le bureau de l’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 insupportable. 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 a terminé le rendu. Un pilote ne doit jamais appeler blit présent sur un contexte qui dépend d’une attente GPU qui n’est actuellement pas satisfaite et qui devrait être satisfaite par une opération ultérieure provenant de ce processus 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;
}

Configuration requise

Condition requise Valeur
Client minimal pris en charge Windows Vista
Plateforme cible Universal
En-tête d3dkmthk.h (inclure D3dkmthk.h)
Bibliothèque Gdi32.lib
DLL Gdi32.dll

Voir aussi

D3DKMTGetDeviceState

D3DKMTSetDisplayMode

D3DKMT_PRESENT