Compartilhar via


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. A rotação automática de recursos habilitou aplicativos para renderizar o mesmo objeto de API enquanto a superfície real que está 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 multiamostragem, embora ainda haja alongamento e rotação.

Tempo de vida do buffer

Os aplicativos têm permissão para armazenar descritores pré-criados que fazem referência a buffers back Isso é habilitado garantindo que o conjunto de buffers pertencentes a uma cadeia de troca nunca seja alterado durante o tempo de vida da cadeia de troca. O conjunto de buffers retornado 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 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 janela e de tela inteira (as cadeias de troca de modelo de flip-model D3D11 têm as mesmas restrições).

As transições IDXGISwapChain::SetFullscreenState não alteram o conjunto de buffers visíveis do aplicativo na cadeia de troca. Somente as chamadas ResizeBuffers e ResizeTarget criam ou destroem 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 resent 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.

As 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 da cadeia de troca 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 do trabalho gráfico (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 main:

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

Criando cadeias de troca

Ao usar as chamadas CreateSwapChainForHwnd, CreateSwapChainForCoreWindow ou 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 DXGI necessários para Direct3D 12 não estão presentes, portanto, você deve usar o ID3D12CommandQueueDownLevel fornecido por 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 formatos a seguir.

  • 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