Fonction D3DKMTRender (d3dkmthk.h)

La fonction D3DKMTRender envoie la mémoire tampon de commande actuelle au sous-système du noyau graphique Microsoft DirectX (Dxgkrnl.sys).

Syntaxe

NTSTATUS D3DKMTRender(
  D3DKMT_RENDER *unnamedParam1
);

Paramètres

unnamedParam1

pData [in, out]

Pointeur vers une structure de D3DKMT_RENDER qui décrit les paramètres pour soumettre la mémoire tampon de commande actuelle au sous-système du noyau graphique.

Valeur retournée

D3DKMTRender retourne l’une des valeurs suivantes :

Code de retour Description
STATUS_SUCCESS La mémoire tampon de commande a été envoyée 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 D3DKMTRender n’a pas pu se terminer en raison d’une mémoire insuffisante.
STATUS_INVALID_HANDLE L’ICD OpenGL a détecté un handle non valide dans la mémoire tampon de commande.
STATUS_PRIVILEGED_INSTRUCTION D3DKMTRender 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 uc actuel).

Cette fonction peut également retourner d’autres valeurs NTSTATUS .

Remarques

Une mémoire tampon de commandes contient généralement de nombreuses commandes graphiques.

Si D3DKMTRender retourne STATUS_GRAPHICS_ALLOCATION_INVALID, l’ICD OpenGL doit rouvrir ou recréer le handle principal, remplacer toutes les références de la mémoire tampon de commande au handle précédent par le nouveau handle, puis appeler à nouveau D3DKMTRender pour soumettre à nouveau la mémoire tampon.

Après un appel à D3DKMTRender, l’ICD OpenGL doit déterminer l’adresse de base et la taille de la mémoire tampon de commande qu’il doit utiliser pour sa prochaine soumission à partir des valeurs retournées dans les membres pCommandBuffer et CommandBufferSize de la structure D3DKMT_RENDER pointées par le paramètre pData .

Pour un appareil qui utilise le mode de contrat de mémoire tampon DMA garanti (pour plus d’informations sur ce mode, consultez Utilisation du modèle de mémoire tampon DMA de contrat garanti), la taille de la mémoire tampon DMA disponible pour le pilote miniport d’affichage pour traduire la mémoire tampon de commande à la prochaine soumission est identique à la taille de la mémoire tampon de commande elle-même. Pour un tel appareil, l’ICD OpenGL doit également déterminer la taille de la liste d’allocation qui sera disponible pour le pilote miniport d’affichage lors de la traduction de la mémoire tampon de commande à la prochaine soumission à partir de la valeur retournée dans le membre AllocationListSize de D3DKMT_RENDER.

Pour les appareils qui n’utilisent pas de contrat de mémoire tampon DMA garanti, l’ICD OpenGL peut utiliser les informations retournées dans les membres CommandBufferSize et AllocationListSize pour déterminer la taille de la liste de mémoire tampon et d’allocation DMA suivante qui sera disponible pour la traduction. Toutefois, dans des conditions de mémoire faible, la mémoire tampon et la liste d’allocation DMA réelles fournies au pilote miniport d’affichage peuvent être plus petites que nécessaire.

Si l’ICD OpenGL détecte que la plupart des vidages de mémoire tampon de commande sont dus au manque d’espace du pilote dans la mémoire tampon ou la liste d’allocation de commandes, le pilote peut demander leur redimensionnement. Pour redimensionner la mémoire tampon de commande, le pilote définit l’indicateur de champ bit ResizeCommandBuffer dans le membre Flags de D3DKMT_RENDER et place la taille demandée dans le membre CommandBufferSize de D3DKMT_RENDER. De même, pour redimensionner la liste d’allocation, le pilote définit l’indicateur de champ bit ResizeAllocationList dans le membre Indicateurs de D3DKMT_RENDER et place le nombre d’éléments demandé dans le membre AllocationListSize de D3DKMT_RENDER.

Notes

Même si le pilote peut demander un redimensionnement de la mémoire tampon de commande et de la liste d’allocation, le gestionnaire de mémoire vidéo peut ne pas être en mesure de se conformer. Par conséquent, si l’appel à D3DKMTRender réussit, le pilote doit vérifier les valeurs retournées dans les membres pCommandBuffer, CommandBufferSize et AllocationListSize .
Toutefois, si l’appel à D3DKMTRender échoue, le pilote détermine que la mémoire tampon de commandes, la liste d’allocation ou les deux n’ont pas été redimensionnées. Par conséquent, le pilote ne doit pas traiter les valeurs retournées dans les membres pCommandBuffer, CommandBufferSize et AllocationListSize , car elles ne sont pas valides.

Exemples

L’exemple de code suivant montre comment un ICD OpenGL peut utiliser D3DKMTRender pour afficher des primitives 3D.

HRESULT Render(D3DKMT_HANDLE hDevice, UINT CommandOffset, UINT CommandLength)
{
    D3DKMT_RENDER RenderData;

    memset(&RenderData, 0, sizeof(RenderData));
    RenderData.hDevice = hDevice;
    RenderData.CommandOffset = CommandOffset;
    RenderData.CommandLength = CommandLength;

    if (NT_SUCCESS((*pfnKTRender)(&RenderData))) {
        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

D3DKMT_RENDER