Отображаемые поверхности

До появления отображаемых поверхностей презентация обычно осуществлялась через создание цепочки буферов с идентичными свойствами, которые затем циклично сменялись (переворачивались) для отображения на экране. Если вы хотите изменить свойства буфера, который необходимо представить, необходимо было уничтожить эту цепочку буферов и создать новую с всеми буферами, обновленными до тех же новых свойств.

Функция отображаемых поверхностей добавляет новое поведение операционной системы , которое устраняет эти ограничения (но требуется поддержка драйверов для правильного поведения). В частности, функция означает, что буферы, представленные, могут иметь различные свойства, и вы можете представить их в любом порядке.

В Windows 11 (сборка 10.0.22000.194) были введены функции отображаемых поверхностей и гибкой презентации, а также их API. Функциональность активируется на поддерживаемых драйверах, начиная с драйверов WDDM 3.0, обеспечивая расширенные сценарии для презентации Direct3D 11.

Проверьте поддержку и используйте отображаемые поверхности

Чтобы определить, доступна ли функция отображаемых поверхностей в системе, вызовите ID3D11Device::CheckFeatureSupport. Передайте D3D11_FEATURE::D3D11_FEATURE_DISPLAYABLE и получите структуру D3D11_FEATURE_DATA_DISPLAYABLE.

API ID3D11Device::CreateTexture2D поддерживает D3D11_RESOURCE_MISC_FLAG::D3D11_RESOURCE_MISC_SHARED_DISPLAYABLE, который можно использовать в элементе D3D11_TEXTURE2D_DESC::MiscFlags структуры, передаваемой в CreateTexture2D через параметр pDesc.

Текстуры с D3D11_RESOURCE_MISC_SHARED_DISPLAYABLE ограничены размером массива 1 и до 1 уровня MIP.

При использовании флага D3D11_RESOURCE_MISC_SHARED_DISPLAYABLE можно отобразить текстуру на любом активном выводе (включая несколько выводов одновременно). В зависимости от сценария текстура может в конечном итоге использоваться композитором (DWM), быть сканированной или привязанной к различным частям конвейера — и потенциально это может происходить одновременно. Например, текстура захвата с камеры может одновременно отображаться на двух дисплеях, а ее миниатюра на третьем дисплее — и все это из одной области памяти, без дополнительных копий. В случае, когда отображаемая поверхность должна быть выведена на нескольких дисплеях, ОС будет координировать сбор информации о завершении смены кадра от задействованных выходов перед оповещением вашего приложения о том, что поверхность возвращена ему, — координация завершения смены кадра от драйвера не требуется.

Чтобы представить отображаемую текстуру на экране, можно использовать Composition Swapchain API. Используя отображаемые поверхности, а не обычные поверхности, система может оптимизировать презентацию в некоторых ситуациях, чтобы обойти системный компостатор и сканировать поверхности непосредственно, что снижает нагрузку на GPU или ЦП, а также общую задержку. Это похоже на использование DXGI свопчейна с режимами представления 'flip'. Дополнительные сведения см. в разделе об оптимальной производительности, используя модель переключения DXGI.

Такие текстуры, как описано выше, должны отображаться для гибкого использования презентации. Эти текстуры не обязаны иметь одинаковые свойства, например, форматы и размеры могут различаться, и эти текстуры должны отображаться в произвольном порядке ("вывод в произвольном порядке"). Презентация будет выполняться с помощью существующего DDI Present1 с существующими шаблонами вызовов. Например, рассмотрим пул из шести буферов, три, которые имеют 720p (A, B и C) и три, которые имеют 4K (D, E и F): допустимый порядок представления может быть A-E-C-B-F-E-D-C.C>>>>>>>.

Форматы

Флаг D3D11_RESOURCE_MISC_SHARED_DISPLAYABLE поддерживается для следующих форматов в Direct3D 11:

Драйвер также может поддерживать следующие форматы:

  • DXGI_FORMAT_P010

В следующем примере кода можно проверить поддержку отображаемых поверхностей для дополнительных форматов выше. Пример включает вызов ID3D11Device::CheckFeatureSupport и проверку D3D11_FEATURE_FORMAT_SUPPORT2.

D3D11_FEATURE_DATA_FORMAT_SUPPORT2 FormatSupport2;
FormatSupport2.InFormat = DXGI_FORMAT_P010;
if (SUCCEEDED (hr = GetDevice()->CheckFeatureSupport(D3D11_FEATURE_FORMAT_SUPPORT2, &FormatSupport2, sizeof(FormatSupport2))))
{
    if (FormatSupport2.OutFormatSupport2 & D3D11_FORMAT_SUPPORT2_DISPLAYABLE)
    {
        // optional displayable format is supported
    }
}

Флаги

Подходящие для совместного использования форматы уже поддерживают следующие флаги привязки: D3D11_BIND_FLAG::D3D11_BIND_SHADER_RESOURCE, D3D11_BIND_UNORDERED_ACCESS, D3D11_BIND_RENDER_TARGET и D3D11_BIND_DECODER.

Существующие поддерживаемые способы использования общих ресурсов с флагом D3D11_BIND_VIDEO_ENCODER дополнительно поддерживают флаг D3D11_RESOURCE_MISC_SHARED_DISPLAYABLE, добавляемый в этих случаях. Сохранены существующие ограничения на использование общих ресурсов с D3D11_BIND_VIDEO_ENCODER.

D3D11_BIND_VIDEO_ENCODER и D3D11_BIND_SHADER_RESOURCE ранее были взаимоисключающими, за исключением случаев их сочетания с некоторыми другими флагами привязки. Исключение было расширено, чтобы позволить D3D11_BIND_VIDEO_ENCODER и D3D11_BIND_SHADER_RESOURCE использоваться совместно при использовании D3D11_RESOURCE_MISC_SHARED_DISPLAYABLE.

Флаг D3D11_RESOURCE_MISC_HW_PROTECTED поддерживается с флагом D3D11_RESOURCE_MISC_SHARED_DISPLAYABLE .