Рекомендации по реализации драйвера в режиме ядра MCDM

В этой статье содержатся рекомендации по написанию части драйвера в режиме ядра (KMD) драйвера только вычислений Майкрософт (MCDM), который также называется драйвером только для вычислений.

См. также следующие статьи:

INF-файл драйвера

Устройства MCDM относятся к классу ComputeAccelerator , который необходимо указать в INF-файле драйвера:

[Version]
...
Class=ComputeAccelerator
ClassGuid={F01A9D53-3FF6-48D2-9F97-C8A7004BE10C}
...

Инициализация драйвера

Драйвер MCDM должен предоставить функцию DriverEntry , которая выполняет следующие действия:

Требования к поддержке функции драйвера

Драйвер MCDM предоставляет функции, которые он реализует в структуре DRIVER_INITIALIZATION_DATA .

Минимальная требуемая поддержка

Как минимум, драйвер MCDM должен предоставлять следующие функции интерфейса драйвера устройства (DDI):

Поддержка диафрагмы узла ЦП

Если поддерживается диафрагма узла ЦП, необходимо также указать указатели на следующие функции:

Дополнительные сведения см. в разделе "Диафрагма узла ЦП".

Поддержка физического адресования

Если используется физическое адресация, необходимо также указать указатели на следующие функции:

Поддержка виртуальной адресации GPU

Если используется виртуальная адресация GPU, необходимо также указать указатели на следующие функции:

Поддержка изоляции IoMmu

Если изоляция IoMmu поддерживается, необходимо также указать указатели на следующие функции:

Для поддержки дополнительного адаптера ссылок необходимо также указать указатель на следующую функцию:

Поддержка управления питанием

Для дополнительной поддержки управления питанием необходимо также указать указатели на следующие функции:

Поддержка управления питанием необходима в современных резервных или подключенных резервных системах.

Дополнительные сведения см. в разделе "Управление питанием GPU" для состояния простоя и активной мощности.

Поддержка устранения неожиданных ситуаций

Для дополнительной поддержки удаления сюрпризов необходимо также указать указатели на следующие функции:

Отменить поддержку

Для дополнительной поддержки отмены необходимо также указать указатели на следующие функции:

Поддержка интерфейса

Для поддержки необязательных интерфейсов необходимо также указать указатели на следующие функции:

Поддержка планирования оборудования

Для дополнительной поддержки планирования оборудования необходимо также указать указатели на следующие функции:

Поддержка функции UpdateAllocationProperty

Для дополнительной поддержки UpdateAllocationProperty необходимо также указать указатели на следующие функции:

Поддержка выхода

Для дополнительной поддержки escape-обхода необходимо также указать указатели на следующие функции:

Трассировка событий для поддержки Windows

Для дополнительной поддержки ETW необходимо также указать указатели на следующие функции:

Поддержка дочерних устройств

Для дополнительной поддержки дочерних устройств необходимо также указать указатели на следующие функции:

Поддержка отчетов о потреблении электроэнергии

Для дополнительной поддержки отчетов о потреблении электроэнергии необходимо также указать указатели на следующие функции:

Проверка отправки команд

Для необязательной проверки отправки команд необходимо также указать указатели на следующие функции:

Поддержка IOCTL

Для дополнительной поддержки IOCTL можно указать указатель на следующую функцию:

DxgkDdiDispatchIoRequest

Запрещенные функции

В драйвере MCDM не должны быть использованы следующие DDI:

  • DxgkDdiAcquireSwizzlingRange
  • DxgkDdiCheckMultiPlaneOverlaySupport
  • DxgkDdiCheckMultiPlaneOverlaySupport2
  • DxgkDdiCheckMultiPlaneOverlaySupport3
  • DxgkDdiCommitVidPn
  • DxgkDdiControlDiagnosticReporting
  • DxgkDdiControlInterrupt
  • DxgkDdiControlInterrupt2
  • DxgkDdiControlModeBehavior
  • DxgkDdiCreateOverlay
  • DxgkDdiCreatePeriodicFrameNotification
  • DxgkDdiCreateProtectedSession
  • DxgkDdiDestroyOverlay
  • DxgkDdiDestroyPeriodicFrameNotification
  • DxgkDdiУничтожитьЗащищеннуюСессию
  • DxgkDdiDisplayDetectControl
  • DxgkDdiEnumVidPnCofuncModality
  • DxgkDdiExchangePreStartInfo
  • DxgkDdiFlipOverlay
  • DxgkDdiGetMultiPlaneOverlayCaps
  • DxgkDdiGetPostCompositionCaps
  • DxgkDdiGetScanLine
  • DxgkDdiIsSupportedVidPn
  • DxgkDdiNotifyAcpiEvent
  • DxgkDdiNotifyFocusPresent
  • DxgkDdiPostMultiPlaneOverlayPresent
  • DxgkDdiPresent
  • DxgkDdiQueryConnectionChange
  • DxgkDdiQueryCurrentFence

Функции WDDM 1.x

Следующие функции используются только для драйверов WDDM 1.x:

  • DxgkDdiQueryDiagnosticTypesSupport
  • DxgkDdiQueryVidPnHWCapability
  • DxgkDdiRecommendFunctionalVidPn
  • DxgkDdiRecommendMonitorModes
  • DxgkDdiRecommendVidPnTopology
  • DxgkDdiReleaseSwizzlingRange
  • DxgkDdiRenderGdi
  • DxgkDdiRenderKm
  • DxgkDdiSetDisplayPrivateDriverFormat
  • DxgkDdiSetPalette
  • DxgkDdiSetPointerPosition
  • DxgkDdiSetPointerShape
  • DxgkDdiSetPowerPState (драйвер не должен сообщать о каких-либо компонентах энергетического состояния P)
  • DxgkDdiSetTargetAdjustedColorimetry
  • DxgkDdiSetTargetAdjustedColorimetry2
  • DxgkDdiSetTargetAnalogCopyProtection
  • DxgkDdiSetTargetContentType
  • DxgkDdiSetTargetGamma
  • DxgkDdiSetTimingsFromVidPn
  • DxgkDdiSetVideoProtectedRegion
  • DxgkDdiSetVidPnSourceAddress
  • DxgkDdiSetVidPnSourceAddressWithMultiPlaneOverlay
  • DxgkDdiSetVidPnSourceAddressWithMultiPlaneOverlay2
  • DxgkDdiSetVidPnSourceAddressWithMultiPlaneOverlay3
  • DxgkDdiSetVidPnSourceVisibility
  • DxgkDdiStopCapture
  • DxgkDdiStopDeviceAndReleasePostDisplayOwnership
  • DxgkDdiSubmitRender
  • DxgkDdiSystemDisplayEnable
  • DxgkDdiSystemDisplayWrite
  • DxgkDdiUpdateActiveVidPnPresentPath
  • DxgkDdiUpdateMonitorLinkInfo
  • DxgkDdiUpdateOverlay

Требования к сведениям о адаптере запросов

Как упоминалось ранее, драйвер только для вычислений должен поддерживать DxgkDdiQueryAdapterInfo.

Должны поддерживаться следующие DXGK_QUERYADAPTERINFOTYPE типы:

Поддержка следующих типов DXGK_QUERYADAPTERINFOTYPE является необязательной:

  • DXGK_ADAPTER_PERFDATA
  • DXGK_ADAPTER_PERFDATACAPS
  • DXGKQAITYPE_UMDRIVERPRIVATE
  • DXGKQAITYPE_PHYSICALADAPTERCAPS
  • DXGK_NODE_PERFDATA
  • DXGK_GPUVERSION

Если сообщалось о одном или нескольких недопустимых блоках памяти, необходимо поддерживать следующие DXGK_QUERYADAPTERINFOTYPE:

  • DXGKQAITYPE_SEGMENTMEMORYSTATE

В случае поддержки GPUVA должен поддерживаться следующий DXGK_QUERYADAPTERINFOTYPE:

  • DXGKQAITYPE_GPUMMUCAPS
  • DXGKQAITYPE_PAGETABLELEVELDESC

Если число сообщаемых компонентов питания больше нуля, необходимо поддерживать следующие DXGK_QUERYADAPTERINFOTYPE:

  • DXGKQAITYPE_POWERCOMPONENTINFO

Если задано ограничение IoMmuSecureModeSupported , необходимо поддерживать следующие DXGK_QUERYADAPTERINFOTYPE:

  • DXGKQAITYPE_FRAMEBUFFERSAVESIZE
  • DXGKQAITYPE_HARDWARERESERVEDRANGES

Следующие DXGK_QUERYADAPTERINFOTYPE не должны поддерживаться:

  • DXGKQAITYPE_DEVICE_TYPE_CAPS
  • DXGKQAITYPE_DISPLAY_DRIVERCAPS_EXTENSION
  • DXGKQAITYPE_DISPLAYID_DESCRIPTOR
  • DXGKQAITYPE_INTEGRATED_DISPLAY_DESCRIPTOR
  • DXGKQAITYPE_INTEGRATED_DISPLAY_DESCRIPTOR2
  • DXGKQAITYPE_POWERCOMPONENTPSTATEINFO
  • DXGKQAITYPE_PREFERREDGPUNODE
  • DXGKQAITYPE_QUERYCOLORIMETRYOVERRIDES
  • DXGKQAITYPE_QUERYSEGMENT
  • DXGKQAITYPE_QUERYSEGMENT2
  • DXGKQAITYPE_QUERYSEGMENT3
  • DXGKQAITYPE_UEFIFRAMEBUFFERRANGES

Требования к возможностям драйвера

Следующие элементы структуры DXGK_DRIVERCAPS должны иметь соответствующие значения:

Член Примечания.
Наивысший допустимый адрес Если этот адрес меньше самого высокого физического адреса системной памяти, присутствующего во время загрузки драйвера, загрузка завершается ошибкой.
НомерПрерыванияСообщения Задайте соответствующим образом.
ПланированиеCaps См. требования SchedulingCaps.
MemoryManagementCaps См. требования MemoryManagementCaps.
GpuEngineTopology Задайте NbAsymetricProcessingNodes число поддерживаемых движков GPU.
WDDMVersion Необходимо задать значение DXGKDDI_WDDMv2_6 или более поздней версии.
PreemptionCaps Задайте значение GraphicsPreemptionGranularity так, чтобы оно соответствовало уровню, поддерживаемому оборудованием. Как минимум, следует попытаться поддерживать вытеснение пакетов на уровне их обработки для запланированных, но еще не начавших выполняться пакетов. Задайте значение ComputePreemptionGranularity, отличное от D3DKMDT_COMPUTE_PREEMPTION_NONE.
SupportPerEngineTDR Должно быть задано значение TRUE. См. изменения TDR в Windows 8 и более поздних версиях.
Поддержка управления питанием во время выполнения Задайте соответствующим образом. См. сведения об управлении питанием GPU для состояний простоя и активной мощности.
Поддержка неожиданного удаления в режиме гибернации Установите значение TRUE, если драйвер поддерживает неожиданное удаление во время гибернации; в противном случае задайте соответствующее значение. См. DXGKDDI_NOTIFY_SURPRISE_REMOVAL.
HybridDiscrete Должно быть задано значение FALSE.
HybridIntegrated Должно быть задано значение FALSE.
Внутренний адресный диапазон виртуальной памяти GPU InternalGpuVirtualAddressRangeStart Задайте соответствующим образом. Если GpuVA не поддерживается, установите значение нулю. Если GpuVA поддерживается, это значение указывает начало диапазона VA, который будет использоваться ОС при выделении внутренних ресурсов для её внутреннего использования.
InternalGpuVirtualAddressRangeEnd (Конец внутреннего диапазона виртуальных адресов GPU) Задайте соответствующим образом. Если GpuVA не поддерживается, установите значение нулю. Если GpuVA поддерживается, это значение указывает конец диапазона VA, который будет использоваться ОС при выделении ресурсов для её внутренних нужд. Если начальные и конечные значения равны нулю, ОС будет использовать весь доступный диапазон va.
Поддержка неожиданного удаления Задайте соответствующим образом. Установите значение TRUE, если драйвер поддерживает неожиданное удаление даже за пределами гибернации. См. DXGKDDI_NOTIFY_SURPRISE_REMOVAL.
ComputeOnly Должно быть задано значение TRUE. Этот флаг должен быть реализован.

Следующие элементы структуры DXGK_DRIVERCAPS должны иметь значение нулю или FALSE, соответственно:

  • МаксИдентификаторСлотаСпискаРаспределения
  • Предел фиксации сегмента диафрагмы
  • МаксимальнаяШиринаУказателя
  • МаксВысотаУказателя
  • PointerCaps
  • КоличествоДиапазоновСвизлинга
  • MaxOverlays
  • GammaRampCaps
  • ColorTransformCaps
  • Презентационные колпаки
  • MaxQueuedFlipOnVSync
  • FlipCaps
  • ПоддержкаНеVGA
  • Поддержка Плавного Поворота
  • SupportDirectFlip
  • SupportMultiPlaneOverlay
  • MaxOverlayPlanes
  • ПоддержкаМногослойныхНаложенийНемедленнойСмены
  • CursorScaledWithMultiPlaneOverlayPlane0
  • HybridAcpiChainingRequired
  • MaxQueuedMultiPlaneOverlayFlipVSync
  • ПоддержкаБезКонтекстногоПрисутствия
  • Съемный

Требования к SchedulingCaps

Следующие DXGK_DRIVERCAPS. Элементы структуры SchedulingCaps должны иметь соответствующие значения:

Член Примечания.
MultiEngineAware Должно быть задано значение TRUE. См. предварительное прерывание GPU.
VSyncPowerSaveAware Должно быть задано значение FALSE.
PreemptionAware Должно быть задано значение TRUE. См. приостановку GPU.
NoDmaPatching Должно быть задано значение FALSE.
CancelCommandAware Задайте соответствующим образом. См. DXGKDDI_CANCELCOMMAND.
No64BitAtomics Задайте соответствующим образом. См. мониторинг контекста.
LowIrqlPreemptCommand Задайте значение TRUE. ОС вызовет DxgkDdiPreemptCommand драйвера на низком уровне IRQL.
HwQueuePacketCap Скрытный; установите значение нулю.

Требования к MemoryManagementCaps

Следующие DXGK_DRIVERCAPS. Элементы структуры MemoryManagementCaps должны иметь соответствующие значения:

Член Примечания.
OutOfOrderLock Должно быть задано значение FALSE.
DedicatedPagingEngine Должно быть задано значение FALSE.
PagingEngineCanSwizzle Должно быть задано значение FALSE.
Первичный на основе разделов Должно быть задано значение FALSE.
CrossAdapterResource Задайте соответствующим образом. Ознакомьтесь с использованием ресурсов кроссплатформенного адаптера в гибридной системе.
ПоддержкаВиртуальнойАдресации Задайте соответствующим образом. См. сведения о виртуальной памяти GPU в WDDM 2.0. Если этот элемент задан, драйвер также должен задать GpuMmuSupported и/или IoMmuSupported.
GpuMmuSupported Задайте соответствующим образом. Смотрите модель GpuMmu.
IoMmuSupported Задайте соответствующим образом. Это ограничение задается, когда устройство делит таблицы страниц с ЦП (общая виртуальная память (SVM)). Смотрите модель IoMmu.
РеплицироватьGdiContent Должно быть задано значение FALSE.
Основной, невидимый для CPU Должно быть задано значение FALSE.
Поддержка паравиртуализации Драйверы узлов MCDM, поддерживающие виртуализацию устройства с помощью интерфейса секционирования GPU (GPU-P с SR-IOV), должны задать для этого поля значение FALSE. Все остальные варианты (драйверы для физических компьютеров без поддержки GPU-P или гостевых драйверов виртуальных GPU, предоставляемых через GPU-P), должны задать для этого поля значение TRUE.
IoMmuSecureModeSupported Задайте соответствующим образом. Если параметр установлен в TRUE, драйвер поддерживает изоляцию IoMmu (устройство имеет выделенную таблицу страниц для модуля IoMmu). Если это ограничение имеет значение FALSE, устройство не может использоваться в "безопасных" виртуальных машинах (песочница Windows или MDAG).
DisableSelfRefreshVRAMInS3 Задайте соответствующим образом.

Управление памятью

Требуется виртуальная адресация. Поддержка физической адресации может быть включена в будущем.

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

Поддерживаются только линейные сегменты пространства памяти и сегменты линейной диафрагмы.