Catene di scambio

Le catene di scambio controllano la rotazione del buffer nascosto, formando la base dell'animazione grafica.

Panoramica

Il modello di programmazione per le catene di scambio in Direct3D 12 non è identico a quello nelle versioni precedenti di D3D. La praticità di programmazione, ad esempio, di supportare la rotazione automatica delle risorse presente in D3D10 e D3D11 non è più supportata. La rotazione automatica delle risorse consente alle app di eseguire il rendering dello stesso oggetto API mentre la superficie effettiva di cui viene eseguito il rendering cambia ogni fotogramma. Il comportamento delle catene di scambio viene modificato con Direct3D 12 per consentire ad altre funzionalità di Direct3D 12 di avere un sovraccarico della CPU ridotto. La chiave di colore automatica e il multicampionamento non sono supportati, anche se in particolare l'estensione e la rotazione sono ancora.

Durata del buffer

Le app possono archiviare descrittori creati in precedenza che fanno riferimento ai buffer back Questa funzionalità è abilitata assicurando che il set di buffer di proprietà di una catena di scambio non cambi mai per la durata della catena di scambio. Il set di buffer restituiti da IDXGISwapChain::GetBuffer non cambia finché non vengono chiamate determinate API:

L'ordine dei buffer restituiti da GetBuffer non cambia mai.

IDXGISwapChain3::GetCurrentBackBufferIndex restituisce l'indice del buffer nascosto corrente all'app.

Effetti di scambio

Gli unici effetti di scambio supportati sono DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL e DXGI_SWAP_EFFECT_FLIP_DISCARD, che richiede che il numero di buffer sia maggiore di uno.

Transizione tra modalità finestra e a schermo intero

Direct3D 12 non supporta la modalità esclusiva a schermo intero (FSE). Al contrario, quando un gioco è l'unica applicazione visibile sullo schermo, il sistema operativo usa una strategia denominata ottimizzazioni a schermo intero (FSO) per ottenere un effetto simile a FSE senza gli svantaggi delle prestazioni. Per altre info su FSO, vedi Demystifying Fullscreen Optimizations (Ottimizzazioni fullscreen).

Direct3D 12 mantiene la restrizione che le applicazioni devono chiamare ResizeBuffers dopo la transizione tra le modalità finestrate e a schermo intero (le catene di scambio dei modelli capovolto D3D11 hanno le stesse restrizioni).

Le transizioni IDXGISwapChain::SetFullscreenState non modificano il set di buffer visibili dall'app nella catena di scambio. Solo le chiamate ResizeBuffers e ResizeTarget creano o distruggono i buffer visibili all'app. Tuttavia, in Direct3D 12 IDXGISwapChain::SetFullscreenState non entra in modalità esclusiva a schermo intero e cambia semplicemente le risoluzioni e le frequenze di aggiornamento per consentire ottimizzazioni a schermo intero. Queste modifiche possono essere apportate da un'app senza l'uso di questo metodo

Quando o IDXGISwapChain::P resent o IDXGISwapChain1::P resent , il buffer nascosto da presentare deve essere nello stato D3D12_RESOURCE_STATE_PRESENT . Il presente avrà esito negativo con DXGI_ERROR_INVALID_CALL se non è così.

Le catene di scambio a schermo intero continuano ad avere la restrizione che SetFullscreenState(FALSE, NULL) deve essere chiamata prima del rilascio finale della catena di scambio. SetFullscreenState(FALSE) ha esito positivo nelle catene di scambio in esecuzione nei dispositivi Direct3D 12.

Le operazioni presenti si verificano nella coda 3D fornita durante la creazione della porta di scambio e le app sono libere di presentare simultaneamente più catene di scambio e registrare ed eseguire elenchi di comandi.

Quando la parte finale del lavoro grafico (ad esempio, la post-elaborazione dei fotogrammi) viene eseguita in una coda di calcolo o non coinvolge la coda grafica del dispositivo, la creazione di una seconda coda 3D su può essere utile e impedire la latenza della presentazione ritardando l'inizio del frame successivo.

Esempio

Il codice di esempio seguente è presente nel ciclo di rendering principale:

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

Creazione di catene di scambio

Quando si usano le chiamate CreateSwapChainForHwnd, CreateSwapChainForCoreWindow o CreateSwapChainForComposition , si noti che il parametro pDevice richiede effettivamente un puntatore a una coda di comandi diretta in Direct3D 12 e non un dispositivo.

Presentazione in Windows 7

Quando la destinazione è Direct3D 12 in Windows 7, i tipi DXGI necessari per Direct3D 12 non sono presenti, quindi è necessario usare l'ID3D12On7 fornito da ID3D12CommandQueueDownLevel (sottoposto a query dalla coda dei comandi diretta) per presentare.

Fornisci un elenco di comandi aperto al metodo presente di Windows 7, che verrà quindi usato, chiuso e inviato automaticamente al dispositivo. È necessario specificare un buffer nascosto che deve essere creato dall'app, deve essere una risorsa di cui è stato eseguito il commit, deve essere a campionamento singolo e deve essere uno dei formati seguenti.

  • 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