Определение поддерживаемых форматов цепочки подкачки

При вызове IDXGIFactory1::CreateSwapChain с DXGI_FORMAT_B5G6R5_UNORM я получаю сообщение об ошибке, что этот формат не поддерживается, в частности E_INVALIDARG One or more arguments are invalid.. Однако он отлично работает с более стандартным форматом, например DXGI_FORMAT_B8G8R8A8_UNORM.

Я пытаюсь понять, как узнать, какие форматы цепочки подкачки поддерживаются. Покопавшись в документации, я могу найти списки поддерживаемых форматов для целей рендеринга, но, похоже, это не тот же набор форматов, который поддерживается для цепочек подкачки. B5G6R5 действительно нуждается в 11.1, чтобы иметь необходимую поддержку для большинства применений, но он работает как цель рендеринга.

В качестве теста я перебрал все форматы и попытался создать цепочки подкачки для каждого из них. Из 118 форматов на моем компьютере поддерживаются только 8 (RTX 2070):

DXGI_FORMAT_R16G16B16A16_FLOAT
DXGI_FORMAT_R10G10B10A2_UNORM
DXGI_FORMAT_R8G8B8A8_UNORM
DXGI_FORMAT_R8G8B8A8_UNORM_SRGB
DXGI_FORMAT_B8G8R8A8_UNORM
DXGI_FORMAT_B8G8R8A8_UNORM_SRGB
DXGI_FORMAT_NV12
DXGI_FORMAT_YUY2

Как правильно узнать, какие форматы цепочки подкачки поддерживаются?

Для дополнительного контекста я выполняю рендеринг вне экрана в 16-битном (565) формате. У меня есть дополнительное окно предварительного просмотра, которое я открываю время от времени, чтобы быстро увидеть результаты рендеринга. Когда я создаю окно, я создаю цепочку подкачки и делаю копию из реальной цели рендеринга в задний буфер цепочки подкачки. Я ориентируюсь на DirectX 11 или 11.1. Я отлично могу выполнить рендеринг в формате B5G6R5, жалуется только цепочка подкачки. Я использую Windows 10 1909.

Вот Gist с фрагментами создания ресурсов и полным примером кода. https://gist.github.com/akbyrd/c9d312048b49c5bd607ceba084d95bd0


person Adam    schedule 30.07.2020    source источник
comment
Это описано здесь: docs.microsoft.com/en-us/previous-versions/windows/desktop/. Не уверен насчет DXGI_FORMAT_NV12 и DXGI_FORMAT_YUY2   -  person Simon Mourier    schedule 31.07.2020


Ответы (1)


Для цепочки подкачки она должна поддерживаться для Display Scan-Out. Если вам нужно проверить поддержку формата во время выполнения, вы можете использовать:

UINT formatSupport = 0;
if (FAILED(device->CheckFormatSupport(backBufferFormat, &formatSupport)))
    formatSupport = 0;

UINT32 required = D3D11_FORMAT_SUPPORT_RENDER_TARGET | D3D11_FORMAT_SUPPORT_DISPLAY;
if ((formatSupport & required) != required)
{
    // Not supported
}

Для всех устройств Direct3D Hardware Feature Levels вы всегда можете рассчитывать на DXGI_FORMAT_R8G8B8A8_UNORM работу. Если вы не используете Windows Vista или устаревшие драйверы WDDM 1.0, вы также можете рассчитывать на DXGI_FORMAT_B8G8R8A8_UNORM

Для устройств Direct3D Hardware Feature Level 10.0 или выше вы также можете рассчитывать на поддержку DXGI_FORMAT_R16G16B16A16_FLOAT и DXGI_FORMAT_R10G10B10A2_UNORM.

Вы также можете рассчитывать на то, что все устройства уровня аппаратных функций Direct3D поддерживают DXGI_FORMAT_R8G8B8A8_UNORM_SRGB и DXGI_FORMAT_B8G8R8A8_UNORM_SRGB для цепочек подкачки, если вы используете «устаревшие» эффекты подкачки. Для современных эффектов подкачки, которые требуются для DirectX 12 и рекомендуются в Windows 10 для DirectX 11 (см. это сообщение в блоге), буфер цепочки подкачки не создается с помощью _SRGB, а вместо этого вы создаете с его помощью только представление цели рендеринга.

См. Анатомию Direct3D 11 Create Device

person Chuck Walbourn    schedule 30.07.2020