IDXGIFactory2::CreateSwapChainForCoreWindow 方法 (dxgi1_2.h)

为交换链的输出窗口创建与 CoreWindow 对象关联的交换链。

语法

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

参数

[in] pDevice

对于 Direct3D 11 和早期版本的 Direct3D,这是指向交换链的 Direct3D 设备的指针。 对于 Direct3D 12,这是指向直接命令队列的指针, (引用 ID3D12CommandQueue) 。 此参数不能为 NULL

[in] pWindow

指向 CoreWindow 对象的指针,该对象与 CreateSwapChainForCoreWindow 创建的交换链相关联。

[in] pDesc

指向交换链说明 DXGI_SWAP_CHAIN_DESC1 结构的指针。 此参数不能为 NULL

[in, optional] pRestrictToOutput

指向交换链限制的 IDXGIOutput 接口的指针。 如果交换链移动到其他输出,则内容为黑色。 可以选择将此参数设置为使用 DXGI_PRESENT_RESTRICT_TO_OUTPUT 限制此输出内容的输出目标。 如果未将此参数设置为限制输出目标上的内容,则可以将其设置为 NULL

[out] ppSwapChain

指向变量的指针,该变量接收指向 CreateSwapChainForCoreWindow 创建的交换链的 IDXGISwapChain1 接口的指针。

返回值

CreateSwapChainForCoreWindow 返回:

  • S_OK成功创建交换链。
  • E_OUTOFMEMORY内存不可用以完成操作。
  • DXGI_ERROR_INVALID_CALL 调用应用程序是否提供了无效数据,例如,如果 pDescppSwapChainNULL
  • 可能是 DXGI_ERROR 主题中介绍的其他错误代码,这些错误代码由传递给 pDevice 的设备类型定义。

适用于 Windows 7 的平台更新: 在安装了适用于 Windows 7 的平台更新的 Windows 7 或 Windows Server 2008 R2 上, CreateSwapChainForCoreWindow 因E_NOTIMPL失败。 有关适用于 Windows 7 的平台更新的详细信息,请参阅 适用于 Windows 7 的平台更新

注解

注意 在 Windows 应用商店应用中而不是 IDXGIFactory2::CreateSwapChainForHwnd 中使用此方法。
 
如果将 pDesc 指向交换链) (widthHeightDXGI_SWAP_CHAIN_DESC1 成员指定为零,运行时将从 pWindow 参数指定的输出窗口中获取大小。

随后可以调用 IDXGISwapChain1::GetDesc1 方法来检索分配的宽度或高度值。

由于一次只能将一个翻转表示模型交换链 (每层) 与 CoreWindow 相关联,因此如果尝试销毁翻转表示模型交换链并将其替换为另一个交换链,则延迟对象销毁的 Microsoft Direct3D 11 策略可能会导致问题。 有关这种情况的详细信息,请参阅 翻转演示文稿交换链的延迟销毁问题

有关如何为交换链的后台缓冲区选择格式的信息,请参阅 转换颜色空间的数据

重叠交换链

从Windows 8.1开始,可以在前台层中创建额外的交换链。 前台交换链可用于以本机分辨率呈现 UI 元素,同时纵向扩展后台交换链 ((例如游戏) )中的实时呈现。 这样一来,需要较低的分辨率呈现才能提高填充率,但不牺牲 UI 质量。

通过在 pDesc 指向的DXGI_SWAP_CHAIN_DESC1中设置DXGI_SWAP_CHAIN_FLAG_FOREGROUND_LAYER交换链标志来创建前台交换链。 前台交换链还必须使用 DXGI_ALPHA_MODE_PREMULTIPLIED alpha 模式,并且必须使用 DXGI_SCALING_NONE。 预乘 alpha 表示在显示帧之前,每个像素的颜色值应已乘以 alpha 值。 例如,一个 Alpha 值为 50% 的 100% 白色 BGRA 像素设置为 (0.5, 0.5, 0.5, 0.5)。 alpha 预乘步骤可以在输出合并阶段完成,方法是应用应用混合状态 (请参阅 ID3D11BlendState) , 并将 D3D11_RENDER_TARGET_BLEND_DESC 结构的 SrcBlend 字段设置为 D3D11_SRC_ALPHA。 如果未完成 Alpha 预乘步骤,前台交换链上的颜色会比预期明亮。

如果硬件支持,前台交换链将使用多平面覆盖。 调用 IDXGIOutput2::SupportsOverlays 查询适配器以获取覆盖支持。

以下示例为 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
    );

呈现完成后,将两个交换链一起呈现。

以下示例演示了这两个交换链:


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

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

要求

要求
最低受支持的客户端 适用于 Windows 7 的Windows 8和平台更新 [桌面应用 |UWP 应用]
最低受支持的服务器 适用于 Windows Server 2008 R2 的Windows Server 2012和平台更新 [桌面应用 |UWP 应用]
目标平台 Windows
标头 dxgi1_2.h
Library Dxgi.lib

另请参阅

CoreWindow

为了获得最佳性能,请使用 DXGI 翻转模型

IDXGIFactory2