Directrices de implementación del controlador DE KM de MCDM
En este artículo se proporcionan instrucciones sobre cómo escribir la parte del controlador en modo kernel de un controlador de solo proceso de Microsoft (MCDM), también denominado controlador de solo proceso.
Consulte también los siguientes artículos:
Archivo INF del controlador
Los dispositivos MCDM pertenecen a la clase ComputeAccelerator , que debe especificarse en el archivo INF:
[Version]
...
Class=ComputeAccelerator
ClassGuid={F01A9D53-3FF6-48D2-9F97-C8A7004BE10C}
...
Inicialización del controlador
Un controlador de solo proceso debe proporcionar una función DriverEntry que realice los pasos siguientes:
- Asigne e inicialice una estructura de DRIVER_INITIALIZATION_DATA . Consulte Requisitos de compatibilidad de funciones de controlador para obtener más información.
- Llame a DxgkInitialize con la estructura inicializada.
Requisitos de compatibilidad de funciones de controlador
Un controlador de solo proceso expone las funciones que implementa en la estructura DRIVER_INITIALIZATION_DATA .
Compatibilidad mínima necesaria
Como mínimo, un controlador de solo proceso debe proporcionar las siguientes funciones de interfaz de controlador de dispositivo (DDI):
- DxgkDdiAddDevice
- DxgkDdiBuildPagingBuffer
- DxgkDdiCalibrateGpuClock
- DxgkDdiCloseAllocation
- DxgkDdiCollectDbgInfo
- DxgkDdiCreateAllocation
- DxgkDdiCreateContext
- DxgkDdiCreateDevice
- DxgkDdiDescribeAllocation
- DxgkDdiDestroyAllocation
- DxgkDdiDestroyContext
- DxgkDdiDestroyDevice
- DxgkDdiDpcRoutine
- DxgkDdiFormatHistoryBuffer
- DxgkDdiGetNodeMetadata
- DxgkDdiGetStandardAllocationDriverData
- DxgkDdiInterruptRoutine
- DxgkDdiOpenAllocation
- DxgkDdiPreemptCommand
- DxgkDdiQueryAdapterInfo (para obtener más información, vea Requisitos de DxgkDdiQueryAdapterInfo).
- DxgkDdiQueryDependentEngineGroup
- DxgkDdiQueryDeviceDescriptor
- DxgkDdiQueryEngineStatus
- DxgkDdiRemoveDevice
- DxgkDdiResetDevice
- DxgkDdiResetEngine
- DxgkDdiResetFromTimeout
- DxgkDdiRestartFromTimeout
- DxgkDdiSetPowerState
- DxgkDdiSetStablePowerState
- DxgkDdiSetVirtualMachineData
- DxgkDdiStartDevice
- DxgkDdiStopDevice
- DxgkDdiUnload
- DxgkDdiQueryChildStatus
- DxgkDdiQueryChildRelations
- DxgkDdiQueryConnectionChange
- DxgkDdiQueryDeviceDescriptor
Compatibilidad con la apertura del host de CPU
Si se admite la apertura del host de CPU, también se deben proporcionar punteros a las siguientes funciones:
Para obtener más información, consulte Apertura del host de CPU.
Compatibilidad con direccionamiento físico
Si se usa direccionamiento físico, también se deben proporcionar punteros a las siguientes funciones:
Compatibilidad con direccionamiento virtual de GPU
Si se usa el direccionamiento virtual de GPU, también se deben proporcionar punteros a las siguientes funciones:
- DxgkDdiCreateProcess
- DxgkDdiDestroyProcess
- DxgkDdiGetRootPageTableSize
- DxgkDdiSetRootPageTable
- DxgkDdiSubmitCommandVirtual
Compatibilidad con el aislamiento de IoMmu
Si se admite el aislamiento de IoMmu, también se deben proporcionar punteros a las siguientes funciones:
Compatibilidad con el adaptador de vínculo
Para admitir el adaptador de vínculo opcional, también se debe proporcionar un puntero a la siguiente función:
Compatibilidad con la administración de energía
Para admitir la administración de energía opcional, también se deben proporcionar punteros a las siguientes funciones:
- DxgkDdiSetPowerComponentFState; obligatorio si los componentes notificados admiten estados F.
- DxgkDdiPowerRuntimeControlRequest
- DxgkDdiPowerRuntimeSetDeviceHandle
NOTA: La compatibilidad con la administración de energía es necesaria en los sistemas modern standby o Connected Standby.
Para más información, consulte Administración de energía de GPU de estados inactivos y energía activa.
Soporte de eliminación sorpresa
Para la compatibilidad opcional con la eliminación de sorpresas, también se deben proporcionar punteros a las siguientes funciones:
Cancelación del soporte técnico
Para admitir la cancelación opcional, también se deben proporcionar punteros a las siguientes funciones:
Compatibilidad con la interfaz
Para admitir la interfaz opcional, también se deben proporcionar punteros a las siguientes funciones:
Compatibilidad con la programación de hardware
Para admitir la programación de hardware opcional, también se deben proporcionar punteros a las siguientes funciones:
- DxgkDdiCreateHwContext
- DxgkDdiCreateHwQueue
- DxgkDdiDestroyHwContext
- DxgkDdiDestroyHwQueue
- DxgkDdiPresentToHwQueue
- [DxgkDdiResetHwEngine
- DxgkDdiResumeContext
- DxgkDdiResumeHwEngine
- DxgkDdiSetContextSchedulingProperties
- DxgkDdiSetSchedulingLogBuffer
- DxgkDdiSetupPriorityBands
- DxgkDdiSignalMonitoredFence
- DxgkDdiSubmitCommandToHwQueue
- DxgkDdiSuspendContext
- DxgkDdiSwitchToHwContextList
- DxgkDdiUpdateHwContextState
Compatibilidad con UpdateAllocationProperty
Para la compatibilidad opcional con UpdateAllocationProperty, también se deben proporcionar punteros a las siguientes funciones:
- DxgkDdiValidateUpdateAllocationProperty
Compatibilidad con escape
Para la compatibilidad con escape opcional, también se deben proporcionar punteros a las siguientes funciones:
Compatibilidad con seguimiento de eventos para Windows
Para la compatibilidad opcional con ETW, también se deben proporcionar punteros a las siguientes funciones:
Compatibilidad con dispositivos secundarios
Para la compatibilidad opcional con dispositivos secundarios, también se deben proporcionar punteros a las funciones siguientes:
Compatibilidad con informes de consumo de energía
Para la compatibilidad opcional con informes de consumo de energía, también se deben proporcionar punteros a las siguientes funciones:
Validación del envío de comandos
Para la validación opcional del envío de comandos, también se deben proporcionar punteros a las siguientes funciones:
Compatibilidad con IOCTL
Para la compatibilidad opcional con IOCTL, se puede proporcionar un puntero a la siguiente función:
Funciones prohibidas
No se deben proporcionar los siguientes DDIs en un controlador MCDM:
- DxgkDdiAcquireSwizzlingRange
- DxgkDdiCheckMultiPlaneOverlaySupport
- DxgkDdiCheckMultiPlaneOverlaySupport2
- DxgkDdiCheckMultiPlaneOverlaySupport3
- DxgkDdiCommitVidPn
- DxgkDdiControlDiagnosticReporting
- DxgkDdiControlInterrupt
- DxgkDdiControlInterrupt2
- DxgkDdiControlModeBehavior
- DxgkDdiCreateOverlay
- DxgkDdiCreatePeriodicFrameNotification
- DxgkDdiCreateProtectedSession
- DxgkDdiDestroyOverlay
- DxgkDdiDestroyPeriodicFrameNotification
- DxgkDdiDestroyProtectedSession
- DxgkDdiDisplayDetectControl
- DxgkDdiEnumVidPnCofuncModality
- DxgkDdiExchangePreStartInfo
- DxgkDdiFlipOverlay
- DxgkDdiGetMultiPlaneOverlayCaps
- DxgkDdiGetPostCompositionCaps
- DxgkDdiGetScanLine
- DxgkDdiIsSupportedVidPn
- DxgkDdiNotifyAcpiEvent
- DxgkDdiNotifyFocusPresent
- DxgkDdiPostMultiPlaneOverlayPresent
- DxgkDdiPresent
- DxgkDdiQueryConnectionChange
- DxgkDdiQueryCurrentFence
Funciones WDDM 1.x
Las siguientes funciones se usan solo para los controladores WDDM 1.x:
- DxgkDdiQueryDiagnosticTypesSupport
- DxgkDdiQueryVidPnHWCapability
- DxgkDdiRecommendFunctionalVidPn
- DxgkDdiRecommendMonitorModes
- DxgkDdiRecommendVidPnTopology
- DxgkDdiReleaseSwizzlingRange
- DxgkDdiRenderGdi
- DxgkDdiRenderKm
- DxgkDdiSetDisplayPrivateDriverFormat
- DxgkDdiSetPalette
- DxgkDdiSetPointerPosition
- DxgkDdiSetPointerShape
- DxgkDdiSetPowerPState (el controlador no debe notificar ningún componente de alimentación de estado P)
- DxgkDdiSetTargetAdjustedColorimetry
- DxgkDdiSetTargetAdjustedColorimetry2
- DxgkDdiSetTargetAnalogCopyProtection
- DxgkDdiSetTargetContentType
- DxgkDdiSetTargetGamma
- DxgkDdiSetTimingsFromVidPn
- DxgkDdiSetVideoProtectedRegion
- DxgkDdiSetVidPnSourceAddress
- DxgkDdiSetVidPnSourceAddressWithMultiPlaneOverlay
- DxgkDdiSetVidPnSourceAddressWithMultiPlaneOverlay2
- DxgkDdiSetVidPnSourceAddressWithMultiPlaneOverlay3
- DxgkDdiSetVidPnSourceVisibility
- DxgkDdiStopCapture
- DxgkDdiStopDeviceAndReleasePostDisplayOwnership
- DxgkDdiSubmitRender
- DxgkDdiSystemDisplayEnable
- DxgkDdiSystemDisplayWrite
- DxgkDdiUpdateActiveVidPnPresentPath
- DxgkDdiUpdateMonitorLinkInfo
- DxgkDdiUpdateOverlay
Requisitos de información del adaptador de consulta
Como se indicó anteriormente, un controlador de solo proceso debe admitir DxgkDdiQueryAdapterInfo.
Se deben admitir los siguientes tipos de DXGK_QUERYADAPTERINFOTYPE :
- DXGKQAITYPE_DRIVERCAPS
- DXGKQAITYPE_NUMPOWERCOMPONENTS
- DXGKQAITYPE_HISTORYBUFFERPRECISION
- DXGKQAITYPE_QUERYSEGMENT4 (para obtener más información, consulte Uso de segmentos de memoria para describir el espacio de direcciones de GPU).
La compatibilidad con los siguientes tipos de DXGK_QUERYADAPTERINFOTYPE es opcional:
- DXGK_ADAPTER_PERFDATA
- DXGK_ADAPTER_PERFDATACAPS
- DXGKQAITYPE_UMDRIVERPRIVATE
- DXGKQAITYPE_PHYSICALADAPTERCAPS
- DXGK_NODE_PERFDATA
- DXGK_GPUVERSION
Si se notificaron uno o varios bloques de memoria no válidos, se deben admitir los siguientes DXGK_QUERYADAPTERINFOTYPE:
- DXGKQAITYPE_SEGMENTMEMORYSTATE
Si se admite GPUVA, se deben admitir los siguientes DXGK_QUERYADAPTERINFOTYPE:
- DXGKQAITYPE_GPUMMUCAPS
- DXGKQAITYPE_PAGETABLELEVELDESC
Si el número de componentes de energía notificados es mayor que cero, se debe admitir el siguiente DXGK_QUERYADAPTERINFOTYPE:
- DXGKQAITYPE_POWERCOMPONENTINFO
Si se establece el límite IoMmuSecureModeSupported , se debe admitir el siguiente DXGK_QUERYADAPTERINFOTYPE:
- DXGKQAITYPE_FRAMEBUFFERSAVESIZE
- DXGKQAITYPE_HARDWARERESERVEDRANGES
No se debe admitir el siguiente 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
Requisitos de funcionalidad del controlador
Los siguientes miembros de estructura DXGK_DRIVERCAPS deben establecerse en los valores adecuados:
Miembro | Notas |
---|---|
HighestAcceptableAddress | Si esta dirección es menor que la dirección física más alta de la memoria del sistema que está presente durante la carga del controlador, se producirá un error en la carga. |
InterruptMessageNumber | Establezca según corresponda. |
SchedulingCaps | Consulte SchedulingCaps requirements (Requisitos de SchedulingCaps). |
MemoryManagementCaps | Consulte MemoryManagementCaps requirements (Requisitos de MemoryManagementCaps). |
GpuEngineTopology | Establezca NbAsymetricProcessingNodes en el número de motores de GPU admitidos. |
WDDMVersion | Debe establecerse en DXGKDDI_WDDMv2_6 o posterior. |
PreemptionCaps | Establezca GraphicsPreemptionGranularity correctamente en el nivel admitido por el hardware. Como mínimo, debe intentar admitir el adelantamiento de nivel de paquete; es decir, un paquete de puesta en cola que se ha programado pero que aún no ha empezado a ejecutarse. Establezca ComputePreemptionGranularity en cualquier otro valor que no sea D3DKMDT_COMPUTE_PREEMPTION_NONE. |
SupportPerEngineTDR | Debe establecerse en TRUE. Consulte Cambios de TDR en Windows 8 y versiones posteriores. |
SupportRuntimePowerManagement | Establezca según corresponda. Consulte Administración de energía de GPU de estados inactivos y energía activa. |
SupportSurpriseRemovalInHibernation | Se establece en TRUE si el controlador admite la eliminación sorpresa cuando está en hibernación; de lo contrario, establezca según corresponda. Consulte DXGKDDI_NOTIFY_SURPRISE_REMOVAL. |
HybridDiscrete | Debe establecerse en FALSE. |
HybridIntegrated | Debe establecerse en FALSE. |
InternalGpuVirtualAddressRangeStart | Establezca según corresponda. Si no se admite GpuVA, establezca en cero. Si se admite GpuVA, este valor especifica el inicio del intervalo de VA que usará el sistema operativo al asignar recursos internos para el uso interno del sistema operativo. |
InternalGpuVirtualAddressRangeEnd | Establezca según corresponda. Si no se admite GpuVA, establezca en cero. Si se admite GpuVA, este valor especifica el final del intervalo de va que usará el sistema operativo al asignar recursos internos para el uso interno del sistema operativo. Si los valores inicial y final son cero, el sistema operativo usará todo el intervalo de VA disponible. |
SupportSurpriseRemoval | Establezca según corresponda. Se establece en TRUE si el controlador admite la eliminación sorpresa incluso fuera de la hibernación. Consulte DXGKDDI_NOTIFY_SURPRISE_REMOVAL. |
ComputeOnly | Debe establecerse en TRUE. Esta marca debe implementarse. |
Los siguientes miembros de estructura DXGK_DRIVERCAPS deben establecerse en cero o FALSE, según corresponda:
- MaxAllocationListSlotId
- ApertureSegmentCommitLimit
- MaxPointerWidth
- MaxPointerHeight
- PointerCaps
- NumberOfSwizzlingRanges
- MaxOverlays
- GammaRampCaps
- ColorTransformCaps
- PresentationCaps
- MaxQueuedFlipOnVSync
- FlipCaps
- SupportNonVGA
- SupportSmoothRotation
- SupportDirectFlip
- SupportMultiPlaneOverlay
- MaxOverlayPlanes
- SupportMultiPlaneOverlayImmediateFlip
- CursorScaledWithMultiPlaneOverlayPlane0
- HybridAcpiChainingRequired
- MaxQueuedMultiPlaneOverlayFlipVSync
- SupportContextlessPresent
- Desmontable
Requisitos de SchedulingCaps
El siguiente DXGK_DRIVERCAPS. Los miembros de la estructura SchedulingCaps deben establecerse en los valores adecuados:
Miembro | Notas |
---|---|
MultiEngineAware | Debe establecerse en TRUE. Consulte Adelantamiento de GPU. |
VSyncPowerSaveAware | Debe establecerse en FALSE. |
PreemptionAware | Debe establecerse en TRUE. Consulte Adelantamiento de GPU. |
NoDmaPatching | Debe establecerse en FALSE. |
CancelCommandAware | Establezca según corresponda. Consulte DXGKDDI_CANCELCOMMAND. |
No64BitAtomics | Establezca según corresponda. Consulte Supervisión de contexto. |
LowIrqlPreemptCommand | Establézcalo en TRUE. El sistema operativo llamará a DxgkDdiPreemptCommand del controlador en irQL bajo. |
HwQueuePacketCap | Reservados; se establece en cero. |
Requisitos de MemoryManagementCaps
El siguiente DXGK_DRIVERCAPS. Los miembros de la estructura MemoryManagementCaps deben establecerse en los valores adecuados:
Miembro | Notas |
---|---|
OutOfOrderLock | Debe establecerse en FALSE. |
DedicatedPagingEngine | Debe establecerse en FALSE. |
PagingEngineCanSwizzle | Debe establecerse en FALSE. |
SectionBackedPrimary | Debe establecerse en FALSE. |
CrossAdapterResource | Establezca según corresponda. Consulte Uso de recursos de adaptador cruzado en un sistema híbrido. |
VirtualAddressingSupported | Establezca según corresponda. Consulte Memoria virtual de GPU en WDDM 2.0. Si se establece este miembro, el controlador también debe establecer GpuMmuSupported o IoMmuSupported. |
GpuMmuSupported | Establezca según corresponda. Consulte Modelo de GpuMmu. |
IoMmuSupported | Establezca según corresponda. Este límite se establece cuando el dispositivo comparte tablas de páginas con la CPU (memoria virtual compartida [SVM]). Consulte Modelo de IoMmu. |
ReplicateGdiContent | Debe establecerse en FALSE. |
NonCpuVisiblePrimary | Debe establecerse en FALSE. |
ParavirtualizationSupported | Los controladores de host MCDM que admiten la virtualización del dispositivo a través de la interfaz de partición de GPU (GPU-P con SR-IOV) deben establecer este campo en FALSE. Todos los demás casos (controladores para máquinas físicas sin compatibilidad con GPU-P o controladores invitados de vGPUs que se han expuesto a través de GPU-P) deben establecer este campo en TRUE. |
IoMmuSecureModeSupported | Establezca según corresponda. Si este límite se establece en TRUE, el controlador admite el aislamiento de IoMmu (el dispositivo tiene una tabla de páginas dedicada para la unidad de IoMmu). Si este límite se establece en FALSE, el dispositivo no se puede usar en las máquinas virtuales "seguras" (Espacio aislado de Windows o MDAG). |
DisableSelfRefreshVRAMInS3 | Establezca según corresponda. |
Administración de memoria
Se requiere direccionamiento virtual. La compatibilidad con direccionamiento físico podría habilitarse en el futuro.
Los dispositivos no son necesarios para admitir una apertura de memoria.
Solo se admiten segmentos de espacio de memoria lineales y segmentos de espacio de apertura lineal .