Поддержка сканирования ресурсов перекрестного адаптера (CASO)
Производительность до CASO (путь с двумя копиями)
Начиная с Windows 8.1 (WDDM 1.3), приложения D3D9 и DXGI смогли использовать поддержку презентаций между адаптерами в конфигурациях с несколькими адаптерами, таких как гибридные системы. При такой поддержке отрисовка выполняется на адаптере отрисовки (обычно это дискретный GPU), а затем выполняется две копии, чтобы получить содержимое в видеоадаптер (как правило, интегрированный GPU) для сканирования на дисплее.
- Копировать 1 из ресурса адаптера отрисовки к ресурсу перекрестного адаптера.
- Копия 2 выполняется из ресурса кросс-адаптера в ресурс адаптера дисплея.
Эти копии могут ограничивать производительность приложений, особенно для приложений, оптимизированных для низкой задержки.
Использование CASO для оптимизации модели представления с пролистыванием (путь с одной копией)
Драйверы Windows Server 2022 (WDDM 2.9) и более поздних версий могут объявлять о поддержке соответствующего уровня ресурсов между адаптерами, что позволяет системному стеку презентаций оптимизировать представления между адаптерами. Драйверы должны объявлять поддержку этой функции на основе собственных возможностей адаптера, независимо от конфигурации устройства, так что значение функции масштабируется во всех применимых конфигурациях оборудования. Это масштабирование включает, помимо прочего, одно устройство GPU с динамическим подключением других внешних GPU.
Если видеоадаптер поддерживает CASO, система выполняет только первое копирование с поверхности адаптера отрисовки на поверхность перекрестного адаптера, а затем сканирует ее напрямую. Эта функция приводит к сокращению обработки, пропускной способности, мощности и задержки.
Функция CASO реализована для среды выполнения DXGI для модели представления пролистывания.
Изменения и дополнения DDI для CASO
Указание уровня поддержки для ресурсов кроссадаптера
DXGI реализует три уровня поддержки ресурсов между адаптерами:
- Копирование в ресурсы кроссадаптера и из нее (самый низкий уровень)
- Texturing from cross-adapter resources
- Сканирование ресурсов перекрестного адаптера (самый высокий уровень)
Каждый более высокий уровень поддержки должен гарантировать поддержку уровней ниже него. Например, чтобы запросить поддержку сканирования ресурсов перекрестного адаптера, драйвер также должен поддерживать форматирование и копирование.
Драйверы объявляют поддержку каждого уровня, задавая следующие значения битовых полей DXGK_VIDMMCAPS в DXGK_DRIVERCAPS. MemoryManagementCaps:
Уровень | Значение уровня | Значение DXGK_VIDMMCAPS |
---|---|---|
Уровень 1 | Поддержка копирования. Копирование в ресурсы между адаптерами и из нее | CrossAdapterResource (предоставляется в пользовательском режиме ядром графики через бит SupportCrossAdapterResource в D3DKMT_WDDM_1_3_CAPS |
Уровень 2 | Поддержка текстур: текстура из ресурсов перекрестных адаптеров) | CrossAdapterResourceTexture (включает поддержку представления ресурсов шейдера, представления неупорядоченного доступа и целевого объекта отрисовки) |
Уровень 3 | Поддержка CASO: сканирование из ресурсов перекрестных адаптеров | CrossAdapterResourceScanout |
Графическому ядру не удается запустить адаптер, если он не указывает на поддержку в режиме надмножества для трех уровней. Например, параметр CrossAdapterResource должен быть задан, если задан параметр CrossAdapterResourceTexture .
Требования к поддержке уровня 1
Ресурсы между адаптерами по-прежнему определяются так же, как и для поддержки копирования WDDM 1.3 уровня 1.
Требования к поддержке уровня 2
Требования аналогичны возможности Драйвера пользовательского режима D3D12 CrossAdapterRowMajorTextureSupported (cap); то есть устройство поддерживает представления ресурсов шейдера, неупорядоченные представления доступа и целевые представления текстур с перекрестными адаптерами строк. Однако, хотя crossAdapterRowMajorTextureSupported D3D12 требует поддержки всех соответствующих форматов текстур, это ограничение уровня 2 требует поддержки только форматов DisplayScanOut , перечисленных в требованиях к поддержке уровня 3, как минимум.
Так как ограничение D3D12 является надмножеством этого ограничения уровня 2, D3D12CreateDevice также проверяет, задано ли ограничение CrossAdapterResourceTexture драйвера ядра, если задано его ограничение CrossAdapterRowMajorTextureSupported , и не создает устройство, если это не так.
Требования к поддержке уровня 3
Система должна иметь возможность выполнять поддерживаемые возможности перелистывания, объявленные драйвером в DXGK_FLIPCAPS, для ресурсов кроссадаптера со следующими минимальными спецификациями:
- Размер основного буфера между адаптерами 1920 x 1080 или меньше
- Формат буфера в пикселях любого из поддерживаемых форматов DisplayScanOut . Начиная с Windows 10 версии 20H1, следующие форматы:
- 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 запрашивает у драйвера поддержку CrossAdapterResourceScanout . Если это поддерживается, стек презентаций переходит по пути с одной копией. Поэтому драйверы, которые объявляют поддержку CrossAdapterResourceScanout , необходимы для поддержки DXGKDDI_CHECKMULTIPLANEOVERLAYSUPPORT3 DDI. Кроме того, он также должен поддерживать все соответствующие DDIs, связанные с презентацией, для основных перекрестных адаптеров с указанными выше минимальными спецификациями. Примеры: pfnCreateResource, pfnCheckMultiplaneOverlaySupport и pfnPresentMultiplaneOverlay/pfnPresent1. Дополнительные сведения см. в разделе Поддержка многопланового наложения. Дополнительные сведения о выходе из CASO см. в разделе DDIs драйвера для оптимизации презентации.
Оба этих уровня имеют сопутствующие тесты HLK для проверки.
Поддержка флага StaticCheck для DXGKDDI_CHECKMULTIPLANEOVERLAYSUPPORT3
Флаг StaticCheck был добавлен в DXGK_MULTIPLANE_OVERLAY_FLAGS в WDDM 3.0. Этот флаг расширяет возможности использования DXGKDDI_CHECKMULTIPLANEOVERLAYSUPPORT3 DDI для поддержки CASO. Этот флаг позволяет DXGKDDI_CHECKMULTIPLANEOVERLAYSUPPORT3 запрашивать драйвер, чтобы определить, может ли плоскость, помеченная флагом StaticCheck , выполнять сканирование. Этот вызов является одноразовым и не должен влиять на реальное поведение презентации. Поэтому драйверы, выполняющие кэширование сведений из DXGKDDI_CHECKMULTIPLANEOVERLAYSUPPORT3 , не должны включать сведения из вызовов DDI с плоскостью StaticCheck . Они должны просто выполнять определение поддержки в автономной или статической форме.
DXGKDDI_CHECKMULTIPLANEOVERLAYSUPPORT3 с установленным флагом StaticCheck гарантированно:
- Иметь ровно одну плоскость, помеченную флагом
- Не содержат сведений о плоскости PostComposition
Вызов DXGKDDI_CHECKMULTIPLANEOVERLAYSUPPORT3 с установленным флагом StaticCheck используется из процесса приложения из DXGI во время создания буфера, например во время создания цепочки буферов или ResizeBuffers, чтобы определить, поддерживается ли CASO для текущей конфигурации оборудования.
Особый случай HybridIntegrated
Важно отметить, что драйверы HybridIntegrated предназначены для поддержки сканирования уровня 3. Начиная с версии WDDM 3.0, драйверы HybridIntegrated должны объявлять о поддержке CrossAdapterResourceScanout. Тест HLK проверяет это требование.
Существующие гибридные ограничения могут быть признаны устаревшими в будущем. Поэтому важно, чтобы ограничение CrossAdapterResourceScanout было разделено, чтобы обеспечить большую гибкость для развития в этом пространстве в будущем. Таким образом, даже драйверы, не использующие HybridIntegrated , могут соответствующим образом задать уровень поддержки между адаптерами.
Изменения ядра графики
Начиная с версии WDDM 2.9, для поддержки ресурсов кросс-адаптера были внесены следующие дополнения и изменения:
Значение KMTQAITYPE_CROSSADAPTERRESOURCE_SUPPORT добавлено в существующее перечисление KMTQUERYADAPTERINFOTYPE .
Добавлены структура D3DKMT_CROSSADAPTERRESOURCE_SUPPORT и перечисление D3DKMT_CROSSADAPTERRESOURCE_SUPPORT_TIER
Ниже представлены примеры использования.
D3DKMT_CROSSADAPTERRESOURCE_SUPPORT KernelSupport = {};
D3DKMT_QUERYADAPTERINFO QueryAdapterInfo;
QueryAdapterInfo.hAdapter = m_hAdapter;
QueryAdapterInfo.Type = KMTQAITYPE_CROSSADAPTERRESOURCE_SUPPORT;
QueryAdapterInfo.pPrivateDriverData = &KernelSupport;
QueryAdapterInfo.PrivateDriverDataSize = sizeof( KernelSupport );
VERIFY_SUCCEEDED(D3DKMTQueryAdapterInfo(&QueryAdapterInfo));
// Use KernelSupport.SupportTier as appropriate
DDIs драйвера для оптимизации презентации
Драйверы используют следующие DIS, чтобы указать, поддерживается ли сканирование перекрестного адаптера:
DXGK_VIDMMCAPS::CrossAdapterResourceScanout cap
Система запрашивает это ограничение заранее, чтобы определить, поддерживает ли драйвер возможность CASO.
Если драйвер поддерживает CASO, DXGI продолжает путь CASO с одной копией; в противном случае DXGI возвращается к пути с двумя копиями.
-
По пути CASO с одной копией DXGI создает ресурс кросс-адаптера в качестве основного на видеоадаптере с помощью pfnCreateResource. Драйвер должен оценить на основе свойств ресурса, может ли он выполнить сканирование из этого ресурса.
Если драйвер поддерживает сканирование на основе свойств ресурса, DXGI продолжает путь CASO из одной копии. В противном случае драйвер должен отказаться от сканирования, возвратив DXGI_DDI_PRIMARY_DRIVER_FLAG_NO_SCANOUT. В этом случае DXGI возвращается к пути с двумя копиями. Этот резервный вариант должен происходить только в том случае, если свойства ресурса выходят за пределы минимальных требований, перечисленных в разделе Требования к поддержке уровня 3.
pfnCheckMultiplaneOverlaySupport DDI
В соответствии с текущим поведением диспетчер Windows (DWM) вызывает DDI pfnCheckMultiplaneOverlaySupport драйвера дисплея, чтобы точно определить, можно ли сканировать основную поверхность. При поддержке драйвера происходит сканирование. В противном случае DWM возвращается в режим композиции DWM.
Обратите внимание, что представления, состоящие из DWM, скорее всего, будут менее предпочтительными, чем независимые пролистывания (iFlip) через путь с двумя копиями или iFlip через путь CASO с одной копией. Следовательно, могут существовать распространенные сценарии отображения, в которых ограничена пропускная способность презентации, например с повернутым или несколькими дисплеями, где драйверы могут постоянно завершать сбой поддержки pfnCheckMultiplaneOverlaySupport в DWM, что, скорее всего, приведет к снижению производительности, чем путь с двумя копиями.
Чтобы устранить негативные последствия, DXGI вызывает pfnCheckMultiplaneOverlaySupport во время создания буфера с ресурсом кроссадаптера в качестве плоскости, помеченной флагом StaticCheck , чтобы проверить, может ли драйвер выполнить сканирование с учетом существующих известных характеристик пропускной способности. Если она поддерживается, DXGI продолжает использовать путь CASO с одной копией; в противном случае он возвращается к пути с двумя копиями.
Тестирование HLK
Добавлены требования и функция HLK WDDM 3.0 с соответствующими тестами HLK. Это требование привязано к DXGK_VIDMMCAPS поддержке, которую могут объявлять драйверы; в частности, CrossAdapterResourceTexture и CrossAdapterResourceScanout.
CrossAdapterResourceTexture
Добавлен тест HLK для проверки операций представления ресурсов шейдера (SRV) в ресурсах между адаптерами.
Для D3D12 существующий тест HLK "D3D12 - Cross Adapter Resource DX12" для Device.Graphics.AdapterRender.D3D12Core.CoreRequirement был добавлен в ; в частности, тестовый случай CrossAdapterResource::CrossAdapterTextureSRV.
В этот тестовый случай HLK добавлена проверка связи надмножества между ограничением KMD CrossAdapterResourceTexture и ограничением CrossAdapterRowMajorTextureSupported D3D12 UMD UMDRowMajorTextureSupported . Аналогичным образом в D3D12CreateDevice была добавлена логика, чтобы убедиться, что если задано ограничение UMD, необходимо также задать ограничение драйвера уровня ядра 2, а в противном случае создать устройство не удастся.
Для D3D11 приведенный выше тестовый случай был добавлен в тест HLK для Device.Graphics.WDDM30.Render.CrossAdapterScanOut; в частности, D3DConf_11_CrossAdapterResource::CrossAdapterResourceSRV.
Перекрестное сканирование ресурсов адаптера
Добавлены следующие тесты HLK:
Device.Graphics.WDDM30.Render.CrossAdapterScanOut
- Тест HLK, чтобы убедиться, что драйверы могут успешно создавать основные ресурсы перекрестных адаптеров, не отказываясь от поведения сканирования с помощью флага DXGI_DDI_PRIMARY_DRIVER_FLAG_NO_SCANOUT .
- Тест HLK, чтобы убедиться, что эти драйверы поддерживают DXGKDDI_CHECKMULTIPLANEOVERLAYSUPPORT3 DDI.
- Тест HLK вручную для тестировщика, чтобы проверить, что:
- Отсканированная поверхность перекрестного адаптера не содержит визуальных повреждений, артефактов или непредвиденного разрыва
- Поверхность перекрестного адаптера сканируется напрямую без каких-либо предварительных внутренних преобразований или копий.
Эти комплексные тесты также, естественно, проверяют, поддерживаются ли checkMultiplaneOverlaySupport и Present DDIs для ресурсов между адаптерами. Приложение для тестирования вручную имеет некоторые особые требования к оборудованию, такие как монитор с высоким разрешением и высокой частотой обновления. Дополнительные сведения см. в справочном документе , сопровождающем тест.
Device.Graphics.WDDM30.Render.CoreRequirement
- Тест HLK для проверки того, что драйверы, объявляющие ограничение HybridIntegrated , также объявляют ограничение CrossAdapterResourceScanout .
System.Fundamentals.Graphics.HybridGraphics.MultiGPU
- Системный тест HLK, позволяющий изготовителям оборудования выполнять эти тесты на гибридных устройствах, способных выполнять путь dxGI с одной копией в рамках комплексной проверки системы.