Condividi tramite


Metodo IDXGIFactory2::CreateSwapChainForCoreWindow (dxgi1_2.h)

Crea una catena di scambio associata all'oggetto CoreWindow per la finestra di output per la catena di scambio.

Sintassi

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

Parametri

[in] pDevice

Per Direct3D 11 e le versioni precedenti di Direct3D, si tratta di un puntatore al dispositivo Direct3D per la catena di scambio. Per Direct3D 12 si tratta di un puntatore a una coda di comandi diretta (vedere ID3D12CommandQueue). Questo parametro non può essere NULL.

[in] pWindow

Puntatore all'oggetto CoreWindow associato alla catena di scambio creata da CreateSwapChainForCoreWindow .

[in] pDesc

Puntatore a una struttura DXGI_SWAP_CHAIN_DESC1 per la descrizione della catena di scambio. Questo parametro non può essere NULL.

[in, optional] pRestrictToOutput

Puntatore all'interfaccia IDXGIOutput a cui è limitata la catena di scambio. Se la catena di scambio viene spostata in un output diverso, il contenuto è nero. Facoltativamente, è possibile impostare questo parametro su una destinazione di output che usa DXGI_PRESENT_RESTRICT_TO_OUTPUT per limitare il contenuto in questo output. Se questo parametro non viene impostato per limitare il contenuto in una destinazione di output, è possibile impostarlo su NULL.

[out] ppSwapChain

Puntatore a una variabile che riceve un puntatore all'interfaccia IDXGISwapChain1 per la catena di scambio creata da CreateSwapChainForCoreWindow .

Valore restituito

CreateSwapChainForCoreWindow restituisce:

  • S_OK se è stata creata correttamente una catena di scambio.
  • E_OUTOFMEMORY se la memoria non è disponibile per completare l'operazione.
  • DXGI_ERROR_INVALID_CALL se l'applicazione chiamante ha fornito dati non validi, ad esempio se pDesc o ppSwapChain è NULL.
  • Possibilmente altri codici di errore descritti nell'argomento DXGI_ERROR definiti dal tipo di dispositivo passato a pDevice.

Aggiornamento della piattaforma per Windows 7: In Windows 7 o Windows Server 2008 R2 con l'aggiornamento della piattaforma per Windows 7 installato , CreateSwapChainForCoreWindow ha esito negativo con E_NOTIMPL. Per altre info sull'aggiornamento della piattaforma per Windows 7, vedi Platform Update per Windows 7.

Commenti

Nota Usa questo metodo nelle app di Windows Store anziché IDXGIFactory2::CreateSwapChainForHwnd.
 
Se si specifica la larghezza, l'altezza o entrambi (membri Width e Height di DXGI_SWAP_CHAIN_DESC1 a cui pDesc punta) della catena di scambio come zero, il runtime ottiene le dimensioni dalla finestra di output specificata dal parametro pWindow .

Successivamente puoi chiamare il metodo IDXGISwapChain1::GetDesc1 per recuperare il valore di larghezza o altezza assegnato.

Poiché è possibile associare una sola catena di scambio del modello di presentazione capovolta (per livello) alla volta con coreWindow, i criteri di Microsoft Direct3D 11 per rinviare la distruzione degli oggetti possono causare problemi se si tenta di distruggere una catena di scambio del modello di presentazione capovolto e sostituirla con un'altra catena di scambio. Per altre info su questa situazione, vedi Problemi di distruzione posticipata con catene di scambio di presentazioni capovolte.

Per informazioni su come scegliere un formato per il buffer nascosto della catena di scambio, vedi Conversione dei dati per lo spazio dei colori.

Catene di scambio sovrapposte

A partire da Windows 8.1, è possibile creare una catena di scambio aggiuntiva nel livello in primo piano. Una catena di scambio in primo piano può essere usata per eseguire il rendering degli elementi dell'interfaccia utente alla risoluzione nativa, aumentando il rendering in tempo reale nella catena di scambio in background ,ad esempio il gameplay. Ciò consente scenari in cui il rendering con risoluzione inferiore è necessario per velocità di riempimento più veloci, ma senza sacrificare la qualità dell'interfaccia utente.

Le catene di scambio in primo piano vengono create impostando il flag della catena di scambio DXGI_SWAP_CHAIN_FLAG_FOREGROUND_LAYER nel DXGI_SWAP_CHAIN_DESC1 a cui punta pDesc . Le catene di scambio in primo piano devono usare anche la modalità alfa DXGI_ALPHA_MODE_PREMULTIPLIED e devono usare DXGI_SCALING_NONE. Alfa premoltiplicato significa che si prevede che i valori di colore di ogni pixel siano già moltiplicati per il valore alfa prima della presentazione del fotogramma. Ad esempio, un pixel BGRA al 100% di bianco con alfa al 50% è impostato su (0,5, 0,5, 0,5, 0,5). Il passaggio alfa di premoltiplicazione può essere eseguito nella fase di unione dell'output applicando uno stato di fusione dell'app (vedere ID3D11BlendState) con il campo SrcBlend della struttura D3D11_RENDER_TARGET_BLEND_DESC impostato su D3D11_SRC_ALPHA. Se il passaggio della premoltiplicazione per alfa non viene eseguito, i colori della catena di scambio in primo piano saranno più luminosi del previsto.

La catena di scambio in primo piano userà sovrapposizioni multiplane se supportate dall'hardware. Chiamare IDXGIOutput2::SupportsOverlays per eseguire una query sull'adattatore per il supporto della sovrimpressione.

L'esempio seguente crea una catena di scambio in primo piano per 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
    );

Presentare entrambe le catene di scambio insieme dopo il completamento del rendering.

L'esempio seguente presenta entrambe le catene di scambio:


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

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

Requisiti

Requisito Valore
Client minimo supportato Windows 8 e aggiornamento della piattaforma per Windows 7 [app desktop | App UWP]
Server minimo supportato Windows Server 2012 e aggiornamento della piattaforma per Windows Server 2008 R2 [app desktop | App UWP]
Piattaforma di destinazione Windows
Intestazione dxgi1_2.h
Libreria Dxgi.lib

Vedi anche

CoreWindow

Per ottenere prestazioni ottimali, usare il modello flip DXGI

IDXGIFactory2