Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
Les chaînes d’échange contrôlent la rotation de la mémoire tampon arrière, formant la base de l’animation graphique.
Aperçu
Le modèle de programmation pour les chaînes d’échange dans Direct3D 12 n’est pas identique à celui dans les versions antérieures de D3D. La commodité de programmation, par exemple, de la prise en charge de la rotation automatique des ressources présentes dans D3D10 et D3D11 n’est plus prise en charge. La rotation automatique des ressources permet aux applications d’afficher le même objet API pendant que la surface réelle affichée modifie chaque image. Le comportement des chaînes d’échange est modifié avec Direct3D 12 pour permettre à d’autres fonctionnalités de Direct3D 12 d’avoir une faible surcharge processeur. La touche de couleur automatique et l’échantillonnage multiple ne sont pas pris en charge, même si notamment l’étirement et la rotation sont toujours.
Durée de vie de la mémoire tampon
Les applications sont autorisées à stocker des descripteurs prédéfinis qui référencent les tampons arrière. Cela est activé en garantissant que l’ensemble de mémoires tampons détenues par une chaîne d’échange ne change jamais pour la durée de vie de la chaîne d’échange. L’ensemble de mémoires tampons retournées par IDXGISwapChain ::GetBuffer ne change pas tant que certaines API ne sont pas appelées :
L’ordre des mémoires tampons retournées par GetBuffer ne change jamais.
IDXGISwapChain3 ::GetCurrentBackBufferIndex retourne l’index de la mémoire tampon back actuelle à l’application.
Effets d’échange
Les seuls effets d’échange pris en charge sont DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL et DXGI_SWAP_EFFECT_FLIP_DISCARD, ce qui nécessite que le nombre de mémoires tampons soit supérieur à un.
Transition entre les modes fenêtres et plein écran
Direct3D 12 ne prend pas en charge le mode exclusif plein écran (FSE). Au lieu de cela, lorsqu’un jeu est la seule application visible à l’écran, le système d’exploitation utilise une stratégie appelée optimisations en plein écran (FSO) pour obtenir un effet similaire à CELUI-ci sans les inconvénients des performances. Pour plus d'informations sur les optimisations plein écran, consultez Démystification des optimisations plein écran.
Direct3D 12 maintient la restriction que les applications doivent appeler ResizeBuffers après la transition entre les modes fenêtres et plein écran (les chaînes d’échange de modèle inversé D3D11 ont les mêmes restrictions).
Les transitions IDXGISwapChain ::SetFullscreenState ne modifient pas l’ensemble de mémoires tampons visibles par l’application dans la chaîne d’échange. Seuls les appels ResizeBuffers et ResizeTarget créent ou détruisent des mémoires tampons visibles par l’application. Toutefois, dans Direct3D 12 IDXGISwapChain ::SetFullscreenState n’entre pas en mode exclusif plein écran, il modifie simplement les résolutions et les taux d’actualisation pour autoriser les optimisations en plein écran. Ces modifications peuvent être apportées par une application sans utiliser cette méthode
Quand ou IDXGISwapChain ::P resent ou IDXGISwapChain1 ::P resent est appelé, la mémoire tampon de retour à présenter doit être dans l’état D3D12_RESOURCE_STATE_PRESENT . L'appel à Present échouera avec DXGI_ERROR_INVALID_CALL si ce n’est pas le cas.
Les chaînes d’échange plein écran continuent d’avoir la restriction que SetFullscreenState(FALSE, NULL) doit être appelée avant la version finale de la chaîne d’échange. SetFullscreenState(FALSE) réussit sur les chaînes d’échange fonctionnant sur les périphériques Direct3D 12.
Les opérations présentes se produisent sur la file d’attente 3D fournie lors de la création de la chaîne d’échange, et les applications sont libres de présenter simultanément plusieurs chaînes d’échange, d’enregistrer et d’exécuter des listes de commandes.
Lorsque la dernière partie du travail graphique (par exemple, le post-traitement d’images) est effectuée sur une file d’attente de calcul ou n’implique pas la file d’attente graphique de l’appareil, la création d’une deuxième file d’attente 3D à présenter peut être bénéfique et empêcher la latence de la présentation retardant le début de l’image suivante.
Example
L’exemple de code suivant est présent dans la boucle de rendu principale :
void Present()
{
m_swapChain->Present(0, m_presentFlags);
m_backBufferIndex = (m_backBufferIndex + 1) % m_backBufferCount;
}
Création de chaînes d’échange
Lors de l’utilisation des appels CreateSwapChainForHwnd, CreateSwapChainForCoreWindow ou CreateSwapChainForComposition , notez que le paramètre pDevice nécessite réellement un pointeur vers une file d’attente de commandes directe dans Direct3D 12 et non un appareil.
Présentation sur Windows 7
Lorsque vous ciblez Direct3D 12 sur Windows 7, les types DXGI nécessaires pour Direct3D 12 ne sont pas présents. Vous devez donc utiliser le ID3D12CommandQueueDownLevel fourni par D3D12On7 (obtenu de la file d'attente de commandes directe) pour présenter.
Vous fournissez une liste de commandes ouverte à la méthode actuelle de Windows 7, qui sera ensuite utilisée, fermée et automatiquement envoyée à l’appareil pour vous. Vous devez fournir une mémoire tampon de retour qui doit être créée par l’application, être une ressource validée, être échantillonné à un seul échantillon et doit être l’un des formats suivants.
- DXGI_FORMAT_R16G16B16A16_FLOAT
- DXGI_FORMAT_R10G10B10A2_UNORM
- DXGI_FORMAT_R8G8B8A8_UNORM
- DXGI_FORMAT_R8G8B8A8_UNORM_SRGB
- DXGI_FORMAT_B8G8R8X8_UNORM
- DXGI_FORMAT_R10G10B10_XR_BIAS_A2_UNORM
- DXGI_FORMAT_B8G8R8A8_UNORM
- DXGI_FORMAT_B8G8R8A8_UNORM_SRGB