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


Обновления для IddCx версии 1.6 и более поздних

Следующие обновления в IddCx версии 1.6 применяются как к драйверам консоли, так и к драйверам удаленного непрямого отображения (IDD).

Выпуск, предшествующий IddCx версии 1.6, был версией 1.4. IddCx версии 1.5 содержит только внутренние изменения, которые не влияют на внешние косвенные драйверы отображения (IDD). Дополнительные сведения о версии 1.4 см. в разделе Обновления IddCx 1.4.

Обновленная версия IddCxGetVersion

Версия IddCx, возвращенная IddCxGetVersion в Windows 10 версии 20H2, была обновлена до IDDCX_VERSION_MANGANESE (0x1600). Полный список сведений о версиях, связанных с IddCx, см. в разделе Версии IddCx .

Сведения о WPP в общедоступных символах IddCx

Начиная с IddCx версии 1.6 общедоступные файлы символов IddCx содержат все сведения о обработчике трассировки программного обеспечения Windows (WPP). Это означает, что команда отладчика !wmitrace.logdump декодирует и отображает сообщение WPP в отладчике ядра.

Возможность доступа к буферам, выделенным в системной памяти

В некоторых сценариях буферы цепочки буферов размещаются в системной памяти; например, если используется адаптер отрисовки WARP (платформа расширенной растеризации Windows, программный отрисовщик, поставляемый системой). IddCx 1.6 добавляет следующие обратные вызовы ОС, которые позволяют драйверу получать доступ к буферам в системной памяти, что позволяет избежать копирования подресурсов:

  • IddCxSwapChainSystemMemory позволяет idD проверка, находятся ли буферы для цепочки буферов в системной памяти. Результат этого обратного вызова остается неизменным на протяжении всего времени существования цепочки буферов. Драйвер должен проверка значение этого обратного вызова в обратном вызовеEvtIddCxMonitorAssignSwapChain и настроить состояние для освобождения и получения буферов.

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

    В момент назначения новой цепочки буферов драйвер должен решить, какой вариант IddCxSwapChainReleaseAndAcquireBuffer/IddCxSwapChainReleaseAndAcquireSystemBuffer будет вызываться для конкретной цепочки буферов, и должен продолжать использовать этот вариант до конца времени существования этой цепочки буферов. Чтобы принять решение, драйвер должен учитывать его конкретные требования и результат вызова IddCxSwapChainInSystemMemory. Драйвер вызовет ошибку операционной системы в процессе UMDF, если он:

    • Вызывает другой вариант IddCxSwapChainReleaseAndAcquireSystemBuffer/IddCxSwapChainReleaseAndAcquireBuffer.
    • Вызывает IddCxSwapChainReleaseAndAcquireSystemBuffer , когда IddCxSwapChainSystemMemory возвращает значение false.

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

Возможность доступа к буферам в физической непрерывной памяти

Начиная с IddCx 1.6, были добавлены флаг IDDCX_ADAPTER_FLAGS_PREFER_PHYSICALLY_CONTIGUOUS и функция обратного вызова IDdCxSwapChainGetPhysicallyContiguousAddress , чтобы доступ к буферам можно было получить в физически непрерывной памяти.

Драйверы дисплея могут запрашивать выделение основных поверхностей в физически непрерывной системной памяти, установив флаг IDDCX_ADAPTER_FLAGS_PREFER_PHYSICALLY_CONTIGUOUS в IDDCX_ADAPTER_CAPS. Это позволяет драйверу напрямую сканировать поверхность без промежуточной копии.

Запрос драйвера во время инициализации не гарантируется. Если запрос не выполнен, вызов IddCxAdapterInitAsync не завершится ошибкой. Вместо этого, когда драйвер выполнил iddCxSwapChainReleaseAndAcquireBuffer (или IddCxSwapChainReleaseAndAcquireSystemBuffer), он должен вызвать IddCxSwapChainGetPhysicallyContiguousAddress , чтобы получить физический адрес поверхности. IddCxSwapChainGetPhysicallyContiguousAddress сначала ожидает выполнения всех команд отрисовки, а затем очищает и делает недействительными кэши ЦП, связанные с диапазоном адресов, в котором хранится поверхность. Однако если первоначальный запрос на выделение поверхностей в физически непрерывной памяти завершился сбоем, iddCxSwapChainGetPhysicallyContiguousAddress вернет E_NOINTERFACE.