Partager via


IDXGIFactory2 ::CreateSwapChainForCoreWindow, méthode (dxgi1_2.h)

Crée une chaîne d’échange associée à l’objet CoreWindow pour la fenêtre de sortie de la chaîne d’échange.

Syntaxe

HRESULT CreateSwapChainForCoreWindow(
  [in]           IUnknown                    *pDevice,
  [in]           IUnknown                    *pWindow,
  [in]           const DXGI_SWAP_CHAIN_DESC1 *pDesc,
  [in, optional] IDXGIOutput                 *pRestrictToOutput,
  [out]          IDXGISwapChain1             **ppSwapChain
);

Paramètres

[in] pDevice

Pour Direct3D 11 et les versions antérieures de Direct3D, il s’agit d’un pointeur vers l’appareil Direct3D pour la chaîne d’échange. Pour Direct3D 12, il s’agit d’un pointeur vers une file d’attente de commandes directes (reportez-vous à ID3D12CommandQueue). Ce paramètre ne peut pas être NULL.

[in] pWindow

Pointeur vers l’objet CoreWindow associé à la chaîne d’échange créée par CreateSwapChainForCoreWindow .

[in] pDesc

Pointeur vers une structure DXGI_SWAP_CHAIN_DESC1 pour la description de la chaîne d’échange. Ce paramètre ne peut pas être NULL.

[in, optional] pRestrictToOutput

Pointeur vers l’interface IDXGIOutput à laquelle la chaîne d’échange est limitée. Si la chaîne d’échange est déplacée vers une autre sortie, le contenu est noir. Vous pouvez éventuellement définir ce paramètre sur une cible de sortie qui utilise DXGI_PRESENT_RESTRICT_TO_OUTPUT pour restreindre le contenu de cette sortie. Si vous ne définissez pas ce paramètre pour restreindre le contenu sur une cible de sortie, vous pouvez le définir sur NULL.

[out] ppSwapChain

Pointeur vers une variable qui reçoit un pointeur vers l’interface IDXGISwapChain1 pour la chaîne d’échange créée par CreateSwapChainForCoreWindow .

Valeur retournée

CreateSwapChainForCoreWindow retourne :

  • S_OK s’il a correctement créé une chaîne d’échange.
  • E_OUTOFMEMORY si la mémoire n’est pas disponible pour terminer l’opération.
  • DXGI_ERROR_INVALID_CALL si l’application appelante a fourni des données non valides, par exemple, si pDesc ou ppSwapChain a la valeur NULL.
  • Peut-être d’autres codes d’erreur décrits dans la rubrique DXGI_ERROR qui sont définis par le type d’appareil que vous passez à pDevice.

Mise à jour de plateforme pour Windows 7 : Sur Windows 7 ou Windows Server 2008 R2 avec la mise à jour de plateforme pour Windows 7 installée, CreateSwapChainForCoreWindow échoue avec E_NOTIMPL. Pour plus d’informations sur la mise à jour de plateforme pour Windows 7, consultez Mise à jour de plateforme pour Windows 7.

Remarques

Note Utilisez cette méthode dans les applications du Windows Store plutôt que IDXGIFactory2 ::CreateSwapChainForHwnd.
 
Si vous spécifiez la largeur, la hauteur ou les deux (membres Width et Height de DXGI_SWAP_CHAIN_DESC1 vers lesquelles pDesc pointe) de la chaîne d’échange comme zéro, le runtime obtient la taille de la fenêtre de sortie spécifiée par le paramètre pWindow .

Vous pouvez ensuite appeler la méthode IDXGISwapChain1 ::GetDesc1 pour récupérer la valeur de largeur ou de hauteur affectée.

Étant donné que vous ne pouvez associer qu’une seule chaîne d’échange de modèle de présentation inversée (par couche) à la fois à un CoreWindow, la stratégie Microsoft Direct3D 11 de report de la destruction des objets peut entraîner des problèmes si vous tentez de détruire une chaîne de permutation de modèle de présentation inversée et de la remplacer par une autre chaîne d’échange. Pour plus d’informations sur cette situation, consultez Problèmes de destruction différée avec les chaînes d’échange de présentation à retournement.

Pour plus d’informations sur le choix d’un format pour la mémoire tampon d’arrière-plan de la chaîne d’échange, consultez Conversion de données pour l’espace de couleurs.

Chaînes d’échange qui se chevauchent

À compter de Windows 8.1, il est possible de créer une chaîne d’échange supplémentaire dans la couche de premier plan. Une chaîne d’échange de premier plan peut être utilisée pour afficher les éléments d’interface utilisateur à une résolution native tout en mettant à l’échelle le rendu en temps réel dans la chaîne d’échange d’arrière-plan (par exemple, le jeu). Cela permet des scénarios dans lesquels un rendu de résolution inférieure est requis pour des taux de remplissage plus rapides, mais sans sacrifier la qualité de l’interface utilisateur.

Les chaînes d’échange de premier plan sont créées en définissant l’indicateur de chaîne d’échange DXGI_SWAP_CHAIN_FLAG_FOREGROUND_LAYER dans le DXGI_SWAP_CHAIN_DESC1 vers lequel pDesc pointe. Les chaînes d’échange de premier plan doivent également utiliser le mode alpha DXGI_ALPHA_MODE_PREMULTIPLIED et utiliser DXGI_SCALING_NONE. L’alpha prémultipliée signifie que les valeurs de couleur de chaque pixel sont censées être déjà multipliées par la valeur alpha avant la présentation du cadre. Par exemple, un pixel BVRA (bleu/vert/rouge/alpha) 100 % blanc, ayant 50 % d’alpha, a la valeur (0.5, 0.5, 0.5, 0.5). L’étape de prémultiplication alpha peut être effectuée dans l’étape sortie-fusion en appliquant un état de fusion d’application (voir ID3D11BlendState) avec le champ SrcBlend de la structure D3D11_RENDER_TARGET_BLEND_DESC défini sur D3D11_SRC_ALPHA. Si l’étape de prémultiplication alpha n’est pas effectuée, les couleurs de la chaîne de permutation de premier plan seront plus brillantes que prévu.

La chaîne d’échange de premier plan utilise des superpositions multiplanes si elles sont prises en charge par le matériel. Appelez IDXGIOutput2 ::SupportsOverlays pour demander à l’adaptateur la prise en charge de la superposition.

L’exemple suivant crée une chaîne d’échange de premier plan pour un CoreWindow :


DXGI_SWAP_CHAIN_DESC1 swapChainDesc = { 0 };

swapChainDesc.Width = static_cast<UINT>(m_d3dRenderTargetSize.Width);
swapChainDesc.Height = static_cast<UINT>(m_d3dRenderTargetSize.Height);
swapChainDesc.Format = DXGI_FORMAT_B8G8R8A8_UNORM;
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;
swapChainDesc.SwapEffect = DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL;
swapChainDesc.Flags = DXGI_SWAP_CHAIN_FLAG_FOREGROUND_LAYER;
swapChainDesc.AlphaMode = DXGI_ALPHA_MODE_PREMULTIPLIED;
swapChainDesc.Scaling = DXGI_SCALING_NONE;

ComPtr<IDXGISwapChain1> swapChain;
HRESULT hr = dxgiFactory->CreateSwapChainForCoreWindow(
    m_d3dDevice.Get(),
    reinterpret_cast<IUnknown*>(m_window.Get()),
    &swapChainDesc,
    nullptr,
    &swapChain
    );

Présentez les deux chaînes d’échange ensemble une fois le rendu terminé.

L’exemple suivant présente les deux chaînes d’échange :


HRESULT hr = m_swapChain->Present(1, 0);

if (SUCCEEDED(hr) && m_foregroundSwapChain)
{
    m_foregroundSwapChain->Present(1, 0);
}

Configuration requise

Condition requise Valeur
Client minimal pris en charge Windows 8 et mise à jour de plateforme pour Windows 7 [applications de bureau | Applications UWP]
Serveur minimal pris en charge Windows Server 2012 et mise à jour de plateforme pour Windows Server 2008 R2 [applications de bureau | Applications UWP]
Plateforme cible Windows
En-tête dxgi1_2.h
Bibliothèque Dxgi.lib

Voir aussi

CoreWindow

Pour de meilleures performances, utilisez le modèle de retournement DXGI

IDXGIFactory2