Compartir a través de


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:

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):

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:

Compatibilidad con el aislamiento de IoMmu

Si se admite el aislamiento de IoMmu, también se deben proporcionar punteros a las siguientes funciones:

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:

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:

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:

DxgkDdiDispatchIoRequest

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 :

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 .