Общий доступ к резервному хранилищу с помощью KMD
Начиная с Windows 11 версии 22H2 (WDDM 3.1), WDDM был расширен, чтобы разрешить доступ к хранилищу выделения графики из драйвера режима ядра (KMD). Резервное хранилище ссылается на зафиксированный буфер памяти, содержащий содержимое выделения графики, когда он не находится в памяти видео.
Эта функция позволяет драйверу пользовательского режима (UMD) и KMD получить доступ к одной памяти выделения. Эту функцию можно использовать при запуске UMD на узле или виртуальной машине с помощью паравиртуализации GPU (GPU-PV).
Эта функция была перенесена обратно в Windows 10 версии 20H1. DDI доступен для драйверов WDDM 3.1 или более поздней версии.
Выделение графики WDDM и резервные хранилища
Каждое выделение графики в модели WDDM имеет резервное хранилище. Выделение графики создается при вызове функции D3DKMTCreateAllocation dxgkrnl. UMD передает частные данные для этого выделения, который Dxgkrnl передает kmD через вызов DxgkddiCreateAllocation. KMD возвращает требуемые флаги выделения в Dxgkrnl.
Проверка доступности компонентов
Чтобы проверить, доступна ли функция общего доступа к резервному хранилищу, KMD должен сначала вызвать один из следующих обратных вызовов с параметром FeatureId, заданным для DXGK_FEATURE_SHARE_BACKING_STORE_WITH_KMD:
- DXGKCB_QUERYFEATURESUPPORT (доступно начиная с WDDM 2.9)
- DXGKCB_ISFEATUREENABLED
Эту функцию можно использовать только в том случае, если обратный вызов выполнен успешно, и параметр Enable имеет значение TRUE.
Поток функций
После успешного определения того, что функция включена, UMD вызывает D3DKMTCreateAllocation , чтобы создать общее выделение ЦП и указывает KMD через частные данные, что выделение должно быть предоставлено kmD. В ходе этого вызова происходит следующее:
KMD задает флаг shareBackingStoreWithKmd DXGK_ALLOCATIONINFOFLAGS2 при вызове обратного вызова KMD dxgkddiCreateAllocation. Если функция не включена, KMD не должен задать флаг ShareBackingStoreWithKmd .
Dxgkrnl вызывает DXGKDDI_SETALLOCATIONBACKINGSTORE DDI, чтобы предоставить KMD адрес режима ядра в хранилище резервной копии выделения.
UMD вызывает D3DKMTLock2 , чтобы получить адрес пользовательского режима выделения.
Свойства выделения
Выделение, созданное таким образом, должно иметь следующие свойства:
- Выделение допускается только в сегменте системной памяти.
- Выделение должно быть создано как общее.
- Выделение не может использовать существующую системную память в качестве резервного хранилища.
- UMD может выполнять любую операцию как для регулярного выделения.
- UMD может вызвать D3DKMTLock2 , чтобы получить указатель на выделение.
- UMD может вызывать D3DKMTMakeResident , чтобы сделать выделение доступным gpu.