Compartir a través de


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

Crea una cadena de intercambio asociada al objeto CoreWindow para la ventana de salida de la cadena de intercambio.

Sintaxis

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 y versiones anteriores de Direct3D, se trata de un puntero al dispositivo Direct3D para la cadena de intercambio. Para Direct3D 12, es un puntero a una cola de comandos directa (consulte ID3D12CommandQueue). Este parámetro no puede ser NULL.

[in] pWindow

Puntero al objeto CoreWindow asociado a la cadena de intercambio que crea CreateSwapChainForCoreWindow .

[in] pDesc

Puntero a una estructura de DXGI_SWAP_CHAIN_DESC1 para la descripción de la cadena de intercambio. Este parámetro no puede ser NULL.

[in, optional] pRestrictToOutput

Puntero a la interfaz IDXGIOutput a la que está restringida la cadena de intercambio. Si la cadena de intercambio se mueve a una salida diferente, el contenido es negro. Opcionalmente, puede establecer este parámetro en un destino de salida que use DXGI_PRESENT_RESTRICT_TO_OUTPUT para restringir el contenido de esta salida. Si no establece este parámetro para restringir el contenido en un destino de salida, puede establecerlo en NULL.

[out] ppSwapChain

Puntero a una variable que recibe un puntero a la interfaz IDXGISwapChain1 de la cadena de intercambio que crea CreateSwapChainForCoreWindow .

Valor devuelto

CreateSwapChainForCoreWindow devuelve:

  • S_OK si creó correctamente una cadena de intercambio.
  • E_OUTOFMEMORY si la memoria no está disponible para completar la operación.
  • DXGI_ERROR_INVALID_CALL si la aplicación que realiza la llamada proporcionó datos no válidos, por ejemplo, si pDesc o ppSwapChain es NULL.
  • Posiblemente otros códigos de error que se describen en el tema DXGI_ERROR definidos por el tipo de dispositivo que se pasa a pDevice.

Actualización de la plataforma para Windows 7: En Windows 7 o Windows Server 2008 R2 con la actualización de plataforma para Windows 7 instalada, CreateSwapChainForCoreWindow genera un error con E_NOTIMPL. Para obtener más información sobre la actualización de plataforma para Windows 7, consulta Actualización de plataforma para Windows 7.

Comentarios

Nota Usa este método en aplicaciones de la Tienda Windows en lugar de IDXGIFactory2::CreateSwapChainForHwnd.
 
Si especifica el ancho, alto o ambos (miembros Width y Height de DXGI_SWAP_CHAIN_DESC1 a los que apunta pDesc ) de la cadena de intercambio como cero, el runtime obtiene el tamaño de la ventana de salida que especifica el parámetro pWindow .

Posteriormente, puede llamar al método IDXGISwapChain1::GetDesc1 para recuperar el valor de ancho o alto asignados.

Dado que solo puede asociar una cadena de intercambio de modelos de presentación invertida (por capa) a la vez con coreWindow, la directiva de Microsoft Direct3D 11 de aplazar la destrucción de objetos puede causar problemas si intenta destruir una cadena de intercambio de modelos de presentación invertida y reemplazarla por otra cadena de intercambio. Para obtener más información sobre esta situación, consulta Problemas de destrucción diferida con cadenas de intercambio de presentación flip.

Para obtener información sobre cómo elegir un formato para el búfer de reserva de la cadena de intercambio, consulte Conversión de datos para el espacio de colores.

Cadenas de intercambio superpuestas

A partir de Windows 8.1, es posible crear una cadena de intercambio adicional en la capa de primer plano. Una cadena de intercambio en primer plano se puede usar para representar elementos de interfaz de usuario en resolución nativa mientras se escala verticalmente la representación en tiempo real en la cadena de intercambio en segundo plano (como el juego). Esto permite escenarios en los que se requiere una representación de resolución inferior para velocidades de relleno más rápidas, pero sin sacrificar la calidad de la interfaz de usuario.

Las cadenas de intercambio en primer plano se crean estableciendo la marca de cadena de intercambio DXGI_SWAP_CHAIN_FLAG_FOREGROUND_LAYER en la DXGI_SWAP_CHAIN_DESC1 a la que apunta pDesc . Las cadenas de intercambio en primer plano también deben usar el modo alfa de DXGI_ALPHA_MODE_PREMULTIPLIED y deben usar DXGI_SCALING_NONE. El alfa premultipado significa que se espera que los valores de color de cada píxel ya se multipliquen por el valor alfa antes de que se presente el fotograma. Por ejemplo, un píxel BGRA 100% blanco en un alfa del 50% se establecerá en (0,5, 0,5, 0,5, 0,5). El paso de premultiplicación alfa se puede realizar en la fase de fusión de salida aplicando un estado de combinación de aplicaciones (consulte ID3D11BlendState) con el campoSrcBlend de la estructura D3D11_RENDER_TARGET_BLEND_DESC establecido en D3D11_SRC_ALPHA. Si el paso de premultiplicación del alpha no se lleva a cabo, los colores de la cadena de intercambio en primer plano serán más brillantes de lo previsto.

La cadena de intercambio en primer plano usará superposiciones multiplano si es compatible con el hardware. Llame a IDXGIOutput2::SupportsOverlays para consultar el adaptador para obtener compatibilidad con la superposición.

En el ejemplo siguiente se crea una cadena de intercambio en primer plano para 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
    );

Presentar ambas cadenas de intercambio juntas una vez completada la representación.

En el ejemplo siguiente se presentan ambas cadenas de intercambio:


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

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

Requisitos

Requisito Value
Cliente mínimo compatible Windows 8 y Actualización de plataforma para Windows 7 [aplicaciones de escritorio | Aplicaciones para UWP]
Servidor mínimo compatible Windows Server 2012 y actualización de plataforma para Windows Server 2008 R2 [aplicaciones de escritorio | Aplicaciones para UWP]
Plataforma de destino Windows
Encabezado dxgi1_2.h
Library Dxgi.lib

Consulte también

CoreWindow

Para obtener el mejor rendimiento, use el modelo de volteo DXGI.

IDXGIFactory2