Отображаемые поверхности
Прежде чем отображаемые поверхности, презентация обычно была выполнена путем создания цепочки буферов с идентичными свойствами, которые затем циклировались (перевернуты) через многократное представление на экране. Если вы хотите изменить свойства буфера, который необходимо представить, необходимо было уничтожить эту цепочку буферов и создать новую с всеми буферами, обновленными до тех же новых свойств.
Функция отображаемых поверхностей добавляет новое поведение операционной системы , которое устраняет эти ограничения (но требуется поддержка драйверов для правильного поведения). В частности, функция означает, что буферы, представленные, могут иметь различные свойства, и вы можете представить их в любом порядке.
В 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::D XGI_FORMAT_B8G8R8A8_UNORM
- DXGI_FORMAT_R8G8B8A8_UNORM
- DXGI_FORMAT_R16G16B16A16_FLOAT
- DXGI_FORMAT_R10G10B10A2_UNORM
- DXGI_FORMAT_NV12
- DXGI_FORMAT_YUY2
Драйвер также может поддерживать следующие форматы:
- 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 .