Рекомендации по реализации драйвера MCDM KM
В этой статье содержатся рекомендации по написанию части драйвера в режиме ядра драйвера Microsoft Compute Only Driver (MCDM), который также называется драйвером только для вычислений.
См. также следующие статьи:
INF-файл драйвера
Устройства MCDM относятся к классу ComputeAccelerator , который необходимо указать в INF-файле:
[Version]
...
Class=ComputeAccelerator
ClassGuid={F01A9D53-3FF6-48D2-9F97-C8A7004BE10C}
...
Инициализация драйвера
Драйвер, доступный только для вычислений, должен предоставлять функцию DriverEntry , которая выполняет следующие действия:
- Выделение и инициализация структуры DRIVER_INITIALIZATION_DATA . Дополнительные сведения см. в разделе Требования к поддержке функций драйвера .
- Вызовите DxgkInitialize с инициализированной структурой.
Требования к поддержке функций драйвера
Драйвер, доступный только для вычислений, предоставляет функции, которые он реализует в структуре DRIVER_INITIALIZATION_DATA .
Минимальная требуемая поддержка
Как минимум драйвер, доступный только для вычислений, должен предоставлять следующие функции интерфейса драйвера устройства (DDI):
- DxgkDdiAddDevice
- DxgkDdiBuildPagingBuffer
- DxgkDdiCalibrateGpuClock
- DxgkDdiCloseAllocation
- DxgkDdiCollectDbgInfo
- DxgkDdiCreateAllocation
- DxgkDdiCreateContext
- DxgkDdiCreateDevice
- DxgkDdiDescribeAllocation
- DxgkDdiDelocationAllocation
- DxgkDdiDetextContext
- DxgkDdiDeкистройDevice
- DxgkDdiDpcRoutine
- DxgkDdiFormatHistoryBuffer
- DxgkDdiGetNodeMetadata
- DxgkDdiGetStandardAllocationDriverData
- DxgkDdiInterruptRoutine
- DxgkDdiOpenAllocation
- DxgkDdiPreemptCommand
- DxgkDdiQueryAdapterInfo (дополнительные сведения см. в разделе Требования DxgkDdiQueryAdapterInfo)
- DxgkDdiQueryDependentEngineGroup
- DxgkDdiQueryDeviceDescriptor
- DxgkDdiQueryEngineStatus
- DxgkDdiRemoveDevice
- DxgkDdiResetDevice
- DxgkDdiResetEngine
- DxgkDdiResetFromTimeout
- DxgkDdiRestartFromTimeout
- DxgkDdiSetPowerState
- DxgkDdiSetStablePowerState
- DxgkDdiSetVirtualMachineData
- DxgkDdiStartDevice
- DxgkDdiStopDevice
- DxgkDdiUnload
- DxgkDdiQueryChildStatus
- DxgkDdiQueryChildRelations
- DxgkDdiQueryConnectionChange
- DxgkDdiQueryDeviceDescriptor
Поддержка диафрагмы узла ЦП
Если поддерживается диафрагма узла ЦП, необходимо также указать указатели на следующие функции:
Дополнительные сведения см. в разделе Диафрагма узла ЦП.
Поддержка физической адресации
Если используется физическая адресация, необходимо также указать указатели на следующие функции:
Поддержка виртуальной адресации GPU
Если используется виртуальная адресация GPU, необходимо также указать указатели на следующие функции:
- DxgkDdiCreateProcess
- DxgkDdiDeprocess
- DxgkDdiGetRootPageTableSize
- DxgkDdiSetRootPageTable
- DxgkDdiSubmitCommandVirtual
Поддержка изоляции IoMmu
Если изоляция IoMmu поддерживается, необходимо также указать указатели на следующие функции:
Поддержка адаптера связи
Для поддержки необязательных адаптеров ссылок также должен быть указан указатель на следующую функцию:
Поддержка управления питанием
Для необязательной поддержки управления питанием также должны быть предоставлены указатели на следующие функции:
- DxgkDdiSetPowerComponentFState; требуется, если сообщаемые компоненты поддерживают F-состояния.
- DxgkDdiPowerRuntimeControlRequest
- DxgkDdiPowerRuntimeSetDeviceHandle
ПРИМЕЧАНИЕ. В современных резервных или подключенных резервных системах требуется поддержка управления питанием.
Дополнительные сведения см. в разделе Управление питанием GPU для состояний простоя и активного питания.
Поддержка неожиданного удаления
Для необязательной поддержки неожиданного удаления также должны быть предоставлены указатели на следующие функции:
Отмена поддержки
Для необязательной поддержки отмены также необходимо указать указатели на следующие функции:
Поддержка интерфейса
Для необязательной поддержки интерфейса также должны быть предоставлены указатели на следующие функции:
Поддержка планирования оборудования
Для необязательной поддержки аппаратного планирования также необходимо указать указатели на следующие функции:
- DxgkDdiCreateHwContext
- DxgkDdiCreateHwQueue
- DxgkDdiDetextHwContext
- DxgkDdiDe примеровHwQueue
- DxgkDdiPresentToHwQueue
- [DxgkDdiResetHwEngine
- DxgkDdiResumeContext
- DxgkDdiResumeHwEngine
- DxgkDdiSetContextSchedulingProperties
- DxgkDdiSetSchedulingLogBuffer
- DxgkDdiSetupPriorityBands
- DxgkDdiSignalMonitoredFence
- DxgkDdiSubmitCommandToHwQueue
- DxgkDdiSuspendContext
- DxgkDdiSwitchToHwContextList
- DxgkDdiUpdateHwContextState
Поддержка UpdateAllocationProperty
Для необязательной поддержки UpdateAllocationProperty также должны быть предоставлены указатели на следующие функции:
- DxgkDdiValidateUpdateAllocationProperty
Поддержка escape-экранирования
Для необязательной поддержки escape-экранирования также должны быть предоставлены указатели на следующие функции:
Поддержка трассировки событий Windows
Для дополнительной поддержки трассировки событий Windows также необходимо указать указатели на следующие функции:
Поддержка дочерних устройств
Для необязательной поддержки дочерних устройств также должны быть предоставлены указатели на следующие функции:
Поддержка отчетов о потреблении энергии
Для дополнительной поддержки отчетов о энергопотреблении необходимо также указать указатели на следующие функции:
Проверка отправки команд
Для необязательной проверки отправки команд также необходимо указать указатели на следующие функции:
Поддержка IOCTL
Для необязательной поддержки IOCTL можно указать указатель на следующую функцию:
Запрещенные функции
Следующие 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 :
- DXGKQAITYPE_DRIVERCAPS
- DXGKQAITYPE_NUMPOWERCOMPONENTS
- DXGKQAITYPE_HISTORYBUFFERPRECISION
- DXGKQAITYPE_QUERYSEGMENT4 (дополнительные сведения см. в разделе Использование сегментов памяти для описания адресного пространства GPU)
Поддержка следующих типов 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 | Задайте соответствующий параметр. |
Управление памятью
Требуется виртуальная адресация. Поддержка физической адресации может быть включена в будущем.
Устройства не требуются для поддержки диафрагмы памяти.
Поддерживаются только линейные сегменты пространства памяти и сегменты линейного пространства с диафрагмой .