Partager via


énumération DXGI_SWAP_EFFECT (dxgi.h)

Options de gestion des pixels dans une surface d’affichage après avoir appelé IDXGISwapChain1 ::P resent1.

Syntaxe

typedef enum DXGI_SWAP_EFFECT {
  DXGI_SWAP_EFFECT_DISCARD = 0,
  DXGI_SWAP_EFFECT_SEQUENTIAL = 1,
  DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL = 3,
  DXGI_SWAP_EFFECT_FLIP_DISCARD = 4
} ;

Constantes

 
DXGI_SWAP_EFFECT_DISCARD
Valeur : 0
Utilisez cet indicateur pour spécifier le modèle de transfert de bloc de bits (bitblt) et spécifier que DXGI ignore le contenu de la mémoire tampon back après avoir appelé IDXGISwapChain1 ::P resent1.
Cet indicateur est valide pour une chaîne d’échange avec plusieurs mémoires tampons de retour, bien que les applications aient uniquement un accès en lecture et en écriture à la mémoire tampon 0.
Utilisez cet indicateur pour permettre au pilote d’affichage de sélectionner la technique de présentation la plus efficace pour la chaîne d’échange.

Direct3D 12 : Cette valeur d’énumération n’est jamais prise en charge. Les applications D3D12 doivent utiliser DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL ou DXGI_SWAP_EFFECT_FLIP_DISCARD.

Remarque Il existe des différences entre UWP à écran intégral exclusif et plein écran. Si vous transférez une application Direct3D 11 vers UWP sur un PC Windows, sachez que l’utilisation de DXGI_SWAP_EFFECT_DISCARD lors de la création de chaînes d’échange fait
ne se comporte pas de la même façon dans UWP que dans Win32, et son utilisation peut nuire aux performances du GPU.

Cela est dû au fait que les applications UWP sont forcées en modes d’échange FLIP (même si d’autres modes d’échange sont définis), car cela réduit le calcul
heure utilisée par la mémoire copie initialement effectuée par l’ancien modèle bitblt.

L’approche recommandée consiste à convertir manuellement les chaînes d’échange DX11 pour utiliser des modèles de retournement au sein de UWP, à l’aide de DXGI_SWAP_EFFECT_FLIP_DISCARD au lieu de DXGI_SWAP_EFFECT_DISCARD le cas échéant.
Reportez-vous à l’exemple ci-dessous et consultez cet article pour plus d’informations.

 
DXGI_SWAP_EFFECT_SEQUENTIAL
Valeur : 1
Utilisez cet indicateur pour spécifier le modèle bitblt et spécifier que DXGI conserve le contenu de la mémoire tampon back après avoir appelé IDXGISwapChain1 ::P resent1.
Utilisez cette option pour présenter le contenu de la chaîne d’échange dans l’ordre, du premier tampon (tampon 0) au dernier tampon.
Cet indicateur ne peut pas être utilisé avec l’échantillonnage multiple.

Direct3D 12 : Cette valeur d’énumération n’est jamais prise en charge. Les applications D3D12 doivent utiliser DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL ou DXGI_SWAP_EFFECT_FLIP_DISCARD.


Remarque Pour des performances optimales, utilisez DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL au lieu de DXGI_SWAP_EFFECT_SEQUENTIAL. Pour plus d’informations, consultez cet article.

 
DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL
Valeur : 3
Utilisez cet indicateur pour spécifier le modèle de présentation inversé et spécifier que DXGI conserve le contenu de la mémoire tampon arrière après avoir appelé IDXGISwapChain1 ::P resent1. Cet indicateur ne peut pas être utilisé avec l’échantillonnage multiple.


Direct3D 11 : Cette valeur d’énumération est prise en charge à partir de Windows 8.
DXGI_SWAP_EFFECT_FLIP_DISCARD
Valeur : 4
Utilisez cet indicateur pour spécifier le modèle de présentation inversé et spécifier que DXGI ignore le contenu de la mémoire tampon back après avoir appelé IDXGISwapChain1 ::P resent1.
Cet indicateur ne peut pas être utilisé avec l’échantillonnage multiple et la présentation partielle.
Consultez améliorations de DXGI 1.4.


Direct3D 11 : Cette valeur d’énumération est prise en charge à partir de Windows 10.
Cet indicateur est valide pour une chaîne d’échange avec plusieurs mémoires tampons de retour ; même si les applications disposent d’un accès en lecture et en écriture uniquement à la mémoire tampon 0.


Remarque les applications du Windows Store doivent utiliser DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL ou DXGI_SWAP_EFFECT_FLIP_DISCARD.

 

Remarques

Cette énumération est utilisée par les structures DXGI_SWAP_CHAIN_DESC et DXGI_SWAP_CHAIN_DESC1.

Dans D3D12, seuls les DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL et les DXGI_SWAP_EFFECT_FLIP_DISCARD sont pris en charge, et les modèles bitblt ne sont pas. Pour cette raison, l’échantillonnage multiple d’une mémoire tampon arrière n’est pas pris en charge dans D3D12 et vous devez effectuer manuellement plusieurs échantillonnages dans l’application à l’aide de ID3D12GraphicsCommandList ::ResolveSubresource ou ID3D12GraphicsCommandList1 ::ResolveSubresourceRegion.

Pour utiliser l’échantillonnage multiple avec DXGI_SWAP_EFFECT_SEQUENTIAL ou DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL, vous devez effectuer l’échantillonnage multiple dans une cible de rendu distincte. Par exemple, créez une texture multisamplée en appelant ID3D11Device ::CreateTexture2D avec une structure de D3D11_TEXTURE2D_DESC remplie (BindFlags membre défini sur D3D11_BIND_RENDER_TARGET et Membre SampleDesc avec des paramètres multisampling). Appel suivant ID3D11Device ::CreateRenderTargetView pour créer une vue de cible de rendu pour la texture et restituer votre scène dans la texture. Enfin, appelez ID3D11DeviceContext ::ResolveSubresource pour résoudre la texture multisamplée dans votre chaîne d’échange non multisamplée.

La principale différence entre les modèles de présentation est la façon dont le contenu de la mémoire tampon back-tampon est obtenu dans le Gestionnaire de fenêtres de bureau (DWM) pour la composition. Dans le modèle bitblt, utilisé avec les valeurs DXGI_SWAP_EFFECT_DISCARD et DXGI_SWAP_EFFECT_SEQUENTIAL, le contenu de la mémoire tampon back est copié dans la surface de redirection sur chaque appel vers IDXGISwapChain1 ::P resent1. Dans le modèle de retournement, qui est utilisé avec la valeur DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL, toutes les mémoires tampons de retour sont partagées avec le DWM. Par conséquent, le DWM peut composer directement à partir de ces mémoires tampons arrière sans aucune opération de copie supplémentaire. En général, le modèle de retournement est le modèle plus efficace. Le modèle de retournement fournit également d’autres fonctionnalités, telles que les statistiques présentes améliorées.

La différence entre DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL et DXGI_SWAP_EFFECT_FLIP_DISCARD est que DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL force DXGI à garantir que le contenu de chaque mémoire tampon arrière est conservé entre les appels IDXGISwapChain::Present, tandis que DXGI_SWAP_EFFECT_FLIP_DISCARD ne fournit pas cette garantie. Le compositeur, dans certains scénarios, peut utiliser DirectFlip, où il utilise la mémoire tampon back de l’application comme mémoire tampon d’affichage entière, qui indique le coût de copie de la mémoire tampon back de l’application dans la mémoire tampon de retour du bureau finale. Avec DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL et DXGI_SWAP_EFFECT_FLIP_DISCARD, cette optimisation peut se produire lorsque l’application est le seul élément visible à l’écran. Toutefois, même lorsque l’application n’est pas le seul élément visible à l’écran, si le modèle de retournement est DXGI_SWAP_EFFECT_FLIP_DISCARD, le compositeur peut dans certains scénarios toujours effectuer cette optimisation, en dessinant d’autres contenus sur la mémoire tampon arrière de l’application.

Lorsque vous appelez IDXGISwapChain1 ::P resent1 sur une chaîne d’échange de modèle inversée (DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL) avec 0 spécifié dans le paramètre SyncInterval, IDXGISwapChain1 ::P resent1comportement est identique au comportement de Direct3D 9Ex's IDirect3DDevice9Ex ::P resentEx avec D3DSWAPEFFECT_FLIPEX et D3DPRESENT_FORCEIMMEDIATE. Autrement dit, le runtime présente non seulement l’image suivante au lieu d’images précédemment mises en file d’attente, elle met également fin à toute heure restante restante sur les images précédemment mises en file d’attente.

Peu importe si le modèle de retournement est plus efficace, une application peut toujours choisir le modèle bitblt, car le modèle bitblt est la seule façon de combiner GDI et La présentation DirectX. Dans le modèle inversé, l’application doit créer la chaîne d’échange avec DXGI_SWAP_CHAIN_FLAG_GDI_COMPATIBLE, puis utiliser getDC sur la mémoire tampon arrière explicitement. Après le premier appel réussi à IDXGISwapChain1 ::P resent1 sur une chaîne d’échange flip-model, GDI ne fonctionne plus avec le HWND associé à cette chaîne d’échange, même après la destruction de la chaîne d’échange. Cette restriction s’étend même aux méthodes telles que ScrollWindowEx.

Pour afficher les formats de mémoire tampon de la chaîne d’échange HDR et les espaces de couleur, un modèle de retournement est requis. Sinon, ils sont composés (et clippés) en SDR (sRVB avec une plage de 0 à 1).

Pour plus d’informations sur la chaîne d’échange de modèle inversé et l’optimisation de la présentation, consultez Amélioration de la présentation avec le modèle de retournement, les rectangles sales et les zones de défilement.

Exemples

Pour créer une chaîne d’échange dans UWP, vous devez simplement créer une instance du modèle DX11 et examiner l’implémentation de DeviceResources::CreateWindowSizeDependentResources dans les exemples D3D12.

DXGI_SWAP_CHAIN_DESC1 swapChainDesc = {0};

       swapChainDesc.Width = lround(m_d3dRenderTargetSize.Width);    // Match the size of the window.
       swapChainDesc.Height = lround(m_d3dRenderTargetSize.Height);
       swapChainDesc.Format = DXGI_FORMAT_B8G8R8A8_UNORM;            // This is the most common swap chain format.
       swapChainDesc.Stereo = false;
       swapChainDesc.SampleDesc.Count = 1;                           // Don't use multi-sampling.
       swapChainDesc.SampleDesc.Quality = 0;
       swapChainDesc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
       swapChainDesc.BufferCount = 2;                                // Use double-buffering to minimize latency.
       swapChainDesc.SwapEffect = DXGI_SWAP_EFFECT_FLIP_DISCARD;     // All Windows Store apps must use a flip effect.
       swapChainDesc.Flags = 2048;
       swapChainDesc.Scaling = scaling;
       swapChainDesc.AlphaMode = DXGI_ALPHA_MODE_IGNORE;

       // This sequence obtains the DXGI factory that was used to create the Direct3D device above.
       ComPtr<IDXGIDevice3> dxgiDevice;
       DX::ThrowIfFailed(m_d3dDevice.As(&dxgiDevice));

       ComPtr<IDXGIAdapter> dxgiAdapter;
       DX::ThrowIfFailed(dxgiDevice->GetAdapter(&dxgiAdapter));

       ComPtr<IDXGIFactory4> dxgiFactory;
       DX::ThrowIfFailed(dxgiAdapter->GetParent(IID_PPV_ARGS(&dxgiFactory)));

       ComPtr<IDXGISwapChain1> swapChain;
       DX::ThrowIfFailed(
              dxgiFactory->CreateSwapChainForCoreWindow(
                     m_d3dDevice.Get(),
                     reinterpret_cast<IUnknown*>(m_window.Get()),
                     &swapChainDesc,
                     nullptr,
                     &swapChain
                     )
              );

Exigences

Exigence Valeur
d’en-tête dxgi.h

Voir aussi

énumérations DXGI

Pour des performances optimales, utilisez le modèle de retournement DXGI