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


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

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

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

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

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

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

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

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

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

Чтобы представить отображаемую текстуру на экране, можно использовать 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::D 3D11_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 .