Поделиться через


Метод 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

Указатель на переменную, которая получает указатель на интерфейс IDXGISwapChain1 для цепочки буферов, создаваемой CreateSwapChainForCoreWindow .

Возвращаемое значение

CreateSwapChainForCoreWindow возвращает:

  • S_OK, если цепочка буферов успешно создана.
  • E_OUTOFMEMORY, если память недоступна для завершения операции.
  • DXGI_ERROR_INVALID_CALL , если вызывающее приложение предоставило недопустимые данные, например, если pDesc или ppSwapChain имеет значение NULL.
  • Возможно, другие коды ошибок, описанные в разделе DXGI_ERROR , которые определяются типом устройства, передаваемого в pDevice.

Обновление платформы для Windows 7: В Windows 7 или Windows Server 2008 R2 с установленным обновлением платформы для Windows 7createSwapChainForCoreWindow завершается сбоем с E_NOTIMPL. Дополнительные сведения об Обновлении платформы для Windows 7 см. в разделе Обновление платформы для Windows 7.

Комментарии

Примечание Используйте этот метод в приложениях Магазина Windows, а не IDXGIFactory2::CreateSwapChainForHwnd.
 
Если указать ширину, высоту или оба значения (элементы Width и HeightDXGI_SWAP_CHAIN_DESC1 , на которые указывает pDesc ) цепочки буферов в виде нуля, среда выполнения получит размер из окна вывода, заданного параметром pWindow .

Затем можно вызвать метод IDXGISwapChain1::GetDesc1 , чтобы получить назначенное значение ширины или высоты.

Так как с CoreWindow можно связать только одну цепочку буферов модели представления флипов (для каждого слоя), политика Microsoft Direct3D 11 отсрочки уничтожения объектов может вызвать проблемы, если попытаться уничтожить цепочку буферов модели представления флип и заменить ее другой цепочкой буферов. Дополнительные сведения об этой ситуации см. в разделе Проблемы с отложенным уничтожением при использовании цепочек буферов представления flip.

Сведения о том, как выбрать формат для обратного буфера цепочки буферов, см. в разделе Преобразование данных для цветового пространства.

Перекрывающиеся цепочки буферов

Начиная с Windows 8.1 можно создать дополнительную цепочку буферов в слое переднего плана. Цепочку буферов переднего плана можно использовать для отрисовки элементов пользовательского интерфейса в собственном разрешении при масштабировании отрисовки в режиме реального времени в фоновой цепочке буферов (например, в игровом процессе). Это позволяет реализовать сценарии, в которых требуется отрисовка с более низким разрешением для ускорения заполнения, но без ущерба для качества пользовательского интерфейса.

Цепочки буферов переднего плана создаются путем установки флага цепочки буферов DXGI_SWAP_CHAIN_FLAG_FOREGROUND_LAYER в DXGI_SWAP_CHAIN_DESC1 , на который указывает pDesc . Цепочки буферов переднего плана также должны использовать DXGI_ALPHA_MODE_PREMULTIPLIED альфа-режим и DXGI_SCALING_NONE. Предварительное альфа-значение означает, что значения цвета каждого пикселя должны быть уже умножены на альфа-значение перед представлением кадра. Например, 100 % белый пиксель BGRA при альфа-канале 50 % имеет значение (0,5, 0,5, 0,5, 0,5). Шаг предварительного альфа-преобразования можно выполнить на этапе слияния вывода, применив состояние смешения приложения (см. ID3D11BlendState) с полем SrcBlendструктуры D3D11_RENDER_TARGET_BLEND_DESC, равным D3D11_SRC_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 8 и обновление платформы для Windows 7 [классические приложения | Приложения UWP]
Минимальная версия сервера Windows Server 2012 и обновление платформы для Windows Server 2008 R2 [классические приложения | Приложения UWP]
Целевая платформа Windows
Header dxgi1_2.h
Библиотека Dxgi.lib

См. также раздел

CoreWindow

Для достижения оптимальной производительности используйте модель пролистывания DXGI.

IDXGIFactory2