Cadeias de Troca
As cadeias de troca controlam a rotação do buffer traseiro, formando a base da animação gráfica.
Visão geral
O modelo de programação para cadeias de troca no Direct3D 12 não é idêntico ao das versões anteriores do D3D. A conveniência de programação, por exemplo, de dar suporte à rotação automática de recursos que estava presente em D3D10 e D3D11 não tem mais suporte. Aplicativos habilitados para rotação automática de recursos para renderizar o mesmo objeto de API enquanto a superfície real sendo renderizada altera cada quadro. O comportamento das cadeias de troca é alterado com o Direct3D 12 para permitir que outros recursos do Direct3D 12 tenham baixa sobrecarga de CPU. Não há suporte para chave de cor automática e multisampling, embora, notavelmente, alongamento e rotação ainda sejam.
Tempo de vida do buffer
Os aplicativos têm permissão para armazenar descritores pré-criados que fazem referência a buffers de back habilitados, garantindo que o conjunto de buffers pertencentes a uma cadeia de troca nunca mude durante o tempo de vida da cadeia de troca. O conjunto de buffers retornados por IDXGISwapChain::GetBuffer não é alterado até que determinadas APIs sejam chamadas:
A ordem dos buffers retornados por GetBuffer nunca é alterada.
IDXGISwapChain3::GetCurrentBackBufferIndex retorna o índice do buffer de fundo atual para o aplicativo.
Efeitos de troca
Os únicos efeitos de troca com suporte são DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL e DXGI_SWAP_EFFECT_FLIP_DISCARD, o que exige que a contagem de buffers seja maior que uma.
Transição entre os modos de janela e tela inteira
O Direct3D 12 não dá suporte ao FSE (modo exclusivo de tela inteira). Em vez disso, quando um jogo é o único aplicativo visível na tela, o sistema operacional usa uma estratégia chamada FSO (otimizações de tela inteira) para obter um efeito semelhante ao FSE sem as desvantagens de desempenho. Para obter mais informações sobre o FSO, consulte Desmistificando as otimizações de tela inteira.
O Direct3D 12 mantém a restrição de que os aplicativos devem chamar ResizeBuffers após a transição entre os modos de tela inteira e janela (as cadeias de troca de modelo de flip D3D11 têm as mesmas restrições).
As transiçõesIDXGISwapChain::SetFullscreenStatenão alteram o conjunto de buffers visíveis do aplicativo na cadeia de troca. Somente o ResizeBuffers e chamadas resizeTarget criar ou destruir buffers visíveis do aplicativo. No entanto, no Direct3D 12 IDXGISwapChain::SetFullscreenState não entra no modo exclusivo de tela inteira e simplesmente altera as resoluções e as taxas de atualização para permitir otimizações de tela inteira. Essas alterações podem ser feitas por um aplicativo sem o uso desse método
Quando ou IDXGISwapChain::P ent ou IDXGISwapChain1::P resent é chamado, o buffer de fundo a ser apresentado deve estar no estado D3D12_RESOURCE_STATE_PRESENT. O presente falhará com DXGI_ERROR_INVALID_CALL se esse não for o caso.
Cadeias de troca de tela inteira continuam a ter a restrição de que SetFullscreenState(FALSE, NULL) deve ser chamado antes da versão final da cadeia de troca. SetFullscreenState(FALSE) é bem-sucedido em cadeias de troca em execução em dispositivos Direct3D 12.
As operações presentes ocorrem na fila 3D fornecida na criação de swapchain e os aplicativos são livres para apresentar simultaneamente várias cadeias de troca e registrar e executar listas de comandos.
Quando a parte final dos gráficos funciona (por exemplo, pós-processamento de quadro) é feita em uma fila de computação ou não envolve a fila de gráficos do dispositivo, criar uma segunda fila 3D para apresentar pode ser benéfico e impedir a latência da apresentação atrasando o início do próximo quadro.
Exemplo
O código de exemplo a seguir estaria presente no loop de renderização principal:
void Present()
{
m_swapChain->Present(0, m_presentFlags);
m_backBufferIndex = (m_backBufferIndex + 1) % m_backBufferCount;
}
Criando cadeias de troca
Ao usar o CreateSwapChainForHwnd, CreateSwapChainForCoreWindowou chamadas CreateSwapChainForComposition, observe que o parâmetro pDevice realmente requer um ponteiro para uma fila de comandos direta no Direct3D 12 e não um dispositivo.
Apresentando no Windows 7
Ao direcionar o Direct3D 12 no Windows 7, os tipos de DXGI necessários para Direct3D 12 não estão presentes, portanto, você deve usar o ID3D12CommandQueueDownLevel fornecido pela D3D12On7 (consultado fora da fila de comandos direta) para apresentar.
Você fornece uma lista de comandos aberta para o método presente do Windows 7, que será usado, fechado e enviado automaticamente ao dispositivo para você. Você deve fornecer um buffer de fundo que deve ser criado pelo aplicativo, deve ser um recurso confirmado, deve ser de amostra única e deve ser um dos seguintes formatos.
- 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