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
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
Pour de meilleures performances, utilisez le modèle de retournement DXGI