Chaînes de permutation

Les chaînes d’échange contrôlent la rotation de la mémoire tampon arrière, formant la base de l’animation graphique.

Vue d’ensemble

Le modèle de programmation pour les chaînes d’échange dans Direct3D 12 n’est pas identique à celui des versions antérieures de D3D. La fonctionnalité de programmation, par exemple, de la prise en charge de la rotation automatique des ressources présente dans D3D10 et D3D11 n’est plus prise en charge. La rotation automatique des ressources a permis aux applications de restituer le même objet API tandis que la surface réelle rendue modifie chaque image. Le comportement des chaînes d’échange est modifié avec Direct3D 12 pour permettre aux autres fonctionnalités de Direct3D 12 d’avoir une charge processeur faible. La touche de couleur automatique et le multi-échantillonnage ne sont pas pris en charge, même si l’étirement et la rotation notamment le sont toujours.

Durée de vie de la mémoire tampon

Les applications sont autorisées à stocker des descripteurs précréés qui référencent des mémoires tampons de retour Cette option est activée en veillant à ce que l’ensemble de mémoires tampons appartenant à une chaîne d’échange ne change jamais pendant 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 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êtré 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 à fse sans les inconvénients de performances. Pour plus d’informations sur l’authentification unique, consultez Démystification des optimisations en plein écran.

Direct3D 12 maintient la restriction selon laquelle les applications doivent appeler ResizeBuffers après la transition entre les modes fenêtré et plein écran (les chaînes d’échange de modèles inversés 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 tampons visibles par l’application. Toutefois, dans Direct3D 12 IDXGISwapChain::SetFullscreenState n’entre pas en mode exclusif plein écran et modifie simplement les résolutions et les taux d’actualisation pour permettre les optimisations en plein écran. Ces modifications peuvent être effectuées par une application sans utiliser cette méthode

Quand ou IDXGISwapChain::P resent ou IDXGISwapChain1::P resent est appelé, la mémoire tampon arrière à présenter doit être dans l’état D3D12_RESOURCE_STATE_PRESENT . Present échoue avec DXGI_ERROR_INVALID_CALL si ce n’est pas le cas.

Les chaînes d’échange en plein écran continuent d’avoir la restriction selon laquelle SetFullscreenState(FALSE, NULL) doit être appelé avant la version finale de la chaîne d’échange. SetFullscreenState(FALSE) réussit sur les chaînes d’échange s’exécutant sur les appareils 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 et d’enregistrer et d’exécuter des listes de commandes.

Lorsque la dernière partie du travail des graphiques (par exemple, le post-traitement de l’image) 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 sur peut être utile et empêcher la latence de la présentation retardant le début de l’image suivante.

Exemple

L’exemple de code suivant est présent dans la boucle de rendu main :

void Present()
{
    m_swapChain->Present(0, m_presentFlags);
    m_backBufferIndex = (m_backBufferIndex + 1) % m_backBufferCount;
}

Création de chaînes d’échange

Lorsque vous utilisez les appels CreateSwapChainForHwnd, CreateSwapChainForCoreWindow ou CreateSwapChainForComposition , notez que le paramètre pDevice nécessite en fait un pointeur vers une file d’attente de commandes directes 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 l’ID3D12On7 fourni par D3D12CommandQueueDownLevel (interrogé hors de la file d’attente de commandes directes) à présenter.

Vous fournissez une liste de commandes ouverte à la méthode actuelle de Windows 7, qui sera ensuite utilisée, fermée et envoyée automatiquement à l’appareil pour vous. Vous devez fournir une mémoire tampon arrière qui doit être créée par l’application, doit être une ressource validée, doit ê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