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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Поддержка физической адресации

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

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

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

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

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

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

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

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

ПРИМЕЧАНИЕ. В современных резервных или подключенных резервных системах требуется поддержка управления питанием.

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

Поддержка неожиданного удаления

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

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

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

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

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

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

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

Поддержка UpdateAllocationProperty

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

  • DxgkDdiValidateUpdateAllocationProperty

Поддержка escape-экранирования

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

Поддержка трассировки событий Windows

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

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

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

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

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

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

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

Поддержка IOCTL

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

DxgkDdiDispatchIoRequest

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

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

  • DxgkDdiAcquireSwizzlingRange
  • DxgkDdiCheckMultiPlaneOverlaySupport
  • DxgkDdiCheckMultiPlaneOverlaySupport2
  • DxgkDdiCheckMultiPlaneOverlaySupport3
  • DxgkDdiCommitVidPn
  • DxgkDdiControlDiagnosticReporting
  • DxgkDdiControlInterrupt
  • DxgkDdiControlInterrupt2
  • DxgkDdiControlModeBehavior
  • DxgkDdiCreateOverlay
  • DxgkDdiCreatePeriodicFrameNotification
  • DxgkDdiCreateProtectedSession
  • DxgkDdiDelayOverlay
  • DxgkDdiDepilPeriodicFrameNotification
  • DxgkDdiDeprotectedSession
  • 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 элементы структуры должны иметь соответствующие значения:

Член Примечания
HighestAcceptableAddress Если этот адрес меньше, чем самый высокий физический адрес системной памяти, который присутствует во время загрузки драйвера, загрузка завершится ошибкой.
InterruptMessageNumber Задайте соответствующий параметр.
SchedulingCaps См. раздел Требования к SchedulingCaps.
MemoryManagementCaps См . раздел Требования к MemoryManagementCaps.
GpuEngineTopology Задайте для NbAsymetricProcessingNodes число поддерживаемых обработчиков GPU.
WDDMVersion Должно быть задано значение DXGKDDI_WDDMv2_6 или более поздней версии.
PreemptionCaps Задайте GraphicsPreemptionGranularity соответствующим образом на уровне, поддерживаемом оборудованием. Как минимум следует попытаться поддерживать вытеснение на уровне пакетов; т. е. пакет вывода из очереди, который был запланирован, но еще не начал выполнение. Задайте для параметра ComputePreemptionGranularity значение, отличное от D3DKMDT_COMPUTE_PREEMPTION_NONE.
SupportPerEngineTDR Должно быть задано значение TRUE. См. раздел Изменения TDR в Windows 8 и более поздних версиях.
SupportRuntimePowerManagement Задайте соответствующий параметр. См. раздел Управление питанием GPU для состояний простоя и активного питания.
SupportSurpriseRemovalInHibernation Задайте значение TRUE, если драйвер поддерживает неожиданное удаление в режиме гибернации; в противном случае задайте соответствующее значение. См . DXGKDDI_NOTIFY_SURPRISE_REMOVAL.
HybridDiscrete Должно быть установлено значение FALSE.
Гибридная интегрированная Должно быть установлено значение FALSE.
InternalGpuVirtualAddressRangeStart Задайте соответствующий параметр. Если GpuVA не поддерживается, установите значение 0. Если поддерживается GpuVA, это значение указывает начало диапазона va, который ос будет использовать при выделении внутренних ресурсов для внутреннего использования ОС.
InternalGpuVirtualAddressRangeEnd Задайте соответствующий параметр. Если GpuVA не поддерживается, установите значение 0. Если gpuVA поддерживается, это значение указывает конец диапазона va, который ос будет использовать при выделении внутренних ресурсов для внутреннего использования ОС. Если начальное и конечное значения равны нулю, ОС будет использовать весь доступный диапазон va.
SupportSurpriseRemoval Задайте соответствующий параметр. Установите значение TRUE, если драйвер поддерживает неожиданное удаление даже за пределами гибернации. См . DXGKDDI_NOTIFY_SURPRISE_REMOVAL.
ComputeOnly Должно быть задано значение TRUE. Этот флаг должен быть реализован.

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

  • MaxAllocationListslotId
  • ApertureSegmentCommitLimit
  • MaxPointerWidth
  • MaxPointerHeight
  • PointerCaps
  • NumberOfSwizzlingRanges
  • MaxOverlays
  • GammaRampCaps
  • ColorTransformCaps
  • PresentationCaps
  • MaxQueuedFlipOnVSync
  • FlipCaps
  • SupportNonVGA
  • SupportSmoothRotation
  • SupportDirectFlip
  • SupportMultiPlaneOverlay
  • MaxOverlayPlanes
  • SupportMultiPlaneOverlayImmediateFlip
  • CursorScaledWithMultiPlaneOverlayPlane0
  • HybridAcpiChainingRequired
  • MaxQueuedMultiPlaneOverlayFlipVSync
  • SupportContextlessPresent
  • Detachable

Требования к 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.
SectionBackedPrimary Должно быть установлено значение FALSE.
CrossAdapterResource Задайте соответствующий параметр. См. раздел Использование ресурсов кроссадаптера в гибридной системе.
VirtualAddressingSupported Задайте соответствующий параметр. См. раздел Виртуальная память GPU в WDDM 2.0. Если этот член задан, драйвер также должен задать GpuMmuSupported и (или) IoMmuSupported.
GpuMmuSupported Задайте соответствующий параметр. См. раздел Модель GpuMmu.
IoMmuSupported Задайте соответствующий параметр. Это ограничение устанавливается, когда устройство использует общие таблицы страниц с ЦП (общая виртуальная память (SVM)). См. раздел Модель IoMmu.
ReplicateGdiContent Должно быть установлено значение FALSE.
NonCpuVisiblePrimary Должно быть установлено значение FALSE.
ParavirtualizationSupported Драйверы узла MCDM, поддерживающие виртуализацию устройства с помощью интерфейса секционирования GPU (GPU-P с SR-IOV), должны установить для этого поля значение FALSE. Во всех остальных случаях (драйверы для физических компьютеров без поддержки GPU-P или гостевые драйверы виртуальных GPU, которые были предоставлены через GPU-P) следует задать для этого поля значение TRUE.
IoMmuSecureModeSupported Задайте соответствующий параметр. Если для этого ограничения задано значение TRUE, драйвер поддерживает изоляцию IoMmu (устройство имеет выделенную таблицу страниц для единицы IoMmu). Если это ограничение имеет значение FALSE, устройство нельзя использовать в "безопасных" виртуальных машинах (Песочница Windows или MDAG).
DisableSelfRefreshVRAMInS3 Задайте соответствующий параметр.

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

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

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

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