Método IDXGIFactory2::CreateSwapChainForCoreWindow (dxgi1_2.h)

Cria uma cadeia de troca associada ao objeto CoreWindow para a janela de saída da cadeia de troca.

Sintaxe

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

Parâmetros

[in] pDevice

Para Direct3D 11 e versões anteriores do Direct3D, esse é um ponteiro para o dispositivo Direct3D para a cadeia de troca. Para Direct3D 12, esse é um ponteiro para uma fila de comandos direta (consulte ID3D12CommandQueue). Esse parâmetro não pode ser NULL.

[in] pWindow

Um ponteiro para o objeto CoreWindow associado à cadeia de troca criada por CreateSwapChainForCoreWindow .

[in] pDesc

Um ponteiro para uma estrutura DXGI_SWAP_CHAIN_DESC1 para a descrição da cadeia de troca. Esse parâmetro não pode ser NULL.

[in, optional] pRestrictToOutput

Um ponteiro para a interface IDXGIOutput à qual a cadeia de troca está restrita. Se a cadeia de troca for movida para uma saída diferente, o conteúdo será preto. Opcionalmente, você pode definir esse parâmetro como um destino de saída que usa DXGI_PRESENT_RESTRICT_TO_OUTPUT para restringir o conteúdo nessa saída. Se você não definir esse parâmetro para restringir o conteúdo em um destino de saída, poderá defini-lo como NULL.

[out] ppSwapChain

Um ponteiro para uma variável que recebe um ponteiro para a interface IDXGISwapChain1 para a cadeia de troca criada por CreateSwapChainForCoreWindow .

Retornar valor

CreateSwapChainForCoreWindow retorna:

  • S_OK se ele criou com êxito uma cadeia de troca.
  • E_OUTOFMEMORY se a memória não estiver disponível para concluir a operação.
  • DXGI_ERROR_INVALID_CALL se o aplicativo de chamada forneceu dados inválidos, por exemplo, se pDesc ou ppSwapChain for NULL.
  • Possivelmente outros códigos de erro descritos no tópico DXGI_ERROR que são definidos pelo tipo de dispositivo que você passa para pDevice.

Atualização de plataforma para Windows 7: No Windows 7 ou Windows Server 2008 R2 com a Atualização de Plataforma para Windows 7 instalada, CreateSwapChainForCoreWindow falha com E_NOTIMPL. Para obter mais informações sobre a Atualização de Plataforma para Windows 7, consulte Atualização de plataforma para Windows 7.

Comentários

Nota Use esse método em aplicativos da Windows Store em vez de IDXGIFactory2::CreateSwapChainForHwnd.
 
Se você especificar a largura, altura ou ambos (membros Width e Height de DXGI_SWAP_CHAIN_DESC1 que pDesc aponta para) da cadeia de troca como zero, o runtime obterá o tamanho da janela de saída especificada pelo parâmetro pWindow .

Posteriormente, você pode chamar o método IDXGISwapChain1::GetDesc1 para recuperar o valor de largura ou altura atribuído.

Como você pode associar apenas uma cadeia de troca de modelo de apresentação invertida (por camada) por vez a um CoreWindow, a política do Microsoft Direct3D 11 de adiar a destruição de objetos pode causar problemas se você tentar destruir uma cadeia de troca de modelo de apresentação flip e substituí-la por outra cadeia de troca. Para obter mais informações sobre essa situação, consulte Problemas de destruição adiada com cadeias de troca de apresentação flip.

Para obter informações sobre como escolher um formato para o buffer traseiro da cadeia de troca, consulte Convertendo dados para o espaço de cor.

Sobreposição de cadeias de troca

Começando com Windows 8.1, é possível criar uma cadeia de troca adicional na camada de primeiro plano. Uma cadeia de troca em primeiro plano pode ser usada para renderizar elementos de interface do usuário em resolução nativa enquanto aumenta a renderização em tempo real na cadeia de troca em segundo plano (como jogabilidade). Isso permite cenários em que a renderização de resolução mais baixa é necessária para taxas de preenchimento mais rápidas, mas sem sacrificar a qualidade da interface do usuário.

As cadeias de troca de primeiro plano são criadas definindo o sinalizador de cadeia de troca de DXGI_SWAP_CHAIN_FLAG_FOREGROUND_LAYER no DXGI_SWAP_CHAIN_DESC1 para o qual o pDesc aponta. As cadeias de troca de primeiro plano também devem usar o modo alfa DXGI_ALPHA_MODE_PREMULTIPLIED e devem usar DXGI_SCALING_NONE. Alfa pré-multiplicado significa que os valores de cor de cada pixel devem já estar multiplicados pelo valor alfa antes da apresentação do quadro. Por exemplo, um pixel BGRA de 100% branco em alfa de 50% é definido como (0,5 - 0,5 - 0,5 - 0,5). A etapa de pré-duplicação alfa pode ser feita no estágio de fusão de saída aplicando um estado de combinação de aplicativos (consulte ID3D11BlendState) com o campo SrcBlend da estrutura D3D11_RENDER_TARGET_BLEND_DESC definido como D3D11_SRC_ALPHA. Se a etapa de premultiplicação de alfa não for executada, as cores na cadeia de troca de primeiro plano estarão mais brilhantes do que o esperado.

A cadeia de troca em primeiro plano usará sobreposições multiplano se houver suporte do hardware. Chame IDXGIOutput2::SupportsOverlays para consultar o adaptador para obter suporte à sobreposição.

O exemplo a seguir cria uma cadeia de troca em primeiro plano para um 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
    );

Apresente as duas cadeias de troca juntas após a conclusão da renderização.

O exemplo a seguir apresenta as duas cadeias de troca:


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

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

Requisitos

Requisito Valor
Cliente mínimo com suporte Windows 8 e Atualização de Plataforma para Windows 7 [aplicativos da área de trabalho | Aplicativos UWP]
Servidor mínimo com suporte Windows Server 2012 e Atualização de Plataforma para Windows Server 2008 R2 [aplicativos da área de trabalho | Aplicativos UWP]
Plataforma de Destino Windows
Cabeçalho dxgi1_2.h
Biblioteca Dxgi.lib

Confira também

CoreWindow

Para obter melhor desempenho, use o modelo de inversão DXGI

IDXGIFactory2