Diretrizes de implementação do driver no modo kernel do MCDM
Este artigo fornece diretrizes sobre como escrever a parte do driver no modo kernel (KMD) de um driver Microsoft Compute Only Driver (MCDM), também conhecido como um driver somente computação.
Veja também os seguintes artigos:
- Visão Geral do Modelo de Driver de Computação da Microsoft
- arquitetura do MCDM
Arquivo INF de driver
Os dispositivos MCDM pertencem à classe ComputeAccelerator, que precisa ser especificada no arquivo INF do driver:
[Version]
...
Class=ComputeAccelerator
ClassGuid={F01A9D53-3FF6-48D2-9F97-C8A7004BE10C}
...
Inicialização do driver
Um driver MCDM deve fornecer uma função DriverEntry que executa as seguintes etapas:
- Aloque e inicialize uma estrutura de DRIVER_INITIALIZATION_DATA. Consulte os Requisitos de suporte à função do driver para obter detalhes.
- Chame DxgkInitialize com a estrutura inicializada.
Requisitos de suporte à função do driver
Um driver MCDM expõe as funções que ele implementa na estrutura de DRIVER_INITIALIZATION_DATA.
Suporte mínimo necessário
No mínimo, um driver MCDM deve fornecer as seguintes funções de DDI (interface de driver de dispositivo):
- DxgkDdiAddDevice
- DxgkDdiBuildPagingBuffer
- DxgkDdiCalibrateGpuClock
- DxgkDdiCloseAllocation
- DxgkDdiCollectDbgInfo
- DxgkDdiCreateAllocation
- DxgkDdiCreateContext
- DxgkDdiCreateDevice
- DxgkDdiDescribeAllocation
- DxgkDdiDestroyAllocation
- DxgkDdiDestroyContext
- DxgkDdiDestroyDevice
- DxgkDdiDpcRoutine
- DxgkDdiFormatHistoryBuffer
- DxgkDdiGetNodeMetadata
- DxgkDdiGetStandardAllocationDriverData
- DxgkDdiInterruptRoutine
- DxgkDdiOpenAllocation
- DxgkDdiPreemptCommand
- DxgkDdiQueryAdapterInfo (Para obter mais informações, consulte requisitos de DxgkDdiQueryAdapterInfo)
- DxgkDdiQueryDependentEngineGroup
- DxgkDdiQueryDeviceDescriptor
- DxgkDdiQueryEngineStatus
- DxgkDdiRemoveDevice
- DxgkDdiResetDevice
- DxgkDdiResetEngine
- DxgkDdiResetFromTimeout
- DxgkDdiRestartFromTimeout
- DxgkDdiSetPowerState
- DxgkDdiSetStablePowerState
- DxgkDdiSetVirtualMachineData
- DxgkDdiStartDevice
- DxgkDdiStopDevice
- DxgkDdiUnload
- DxgkDdiQueryChildStatus
- DxgkDdiQueryChildRelations
- DxgkDdiQueryConnectionChange
- DxgkDdiQueryDeviceDescriptor
Suporte à abertura de host da CPU
Se houver suporte para a abertura do host da CPU, ponteiros para as seguintes funções também deverão ser fornecidos:
Para obter mais informações, consulte abertura de host da CPU.
Suporte a endereçamento físico
Se o endereçamento físico for usado, os ponteiros para as seguintes funções também deverão ser fornecidos:
Suporte a endereçamento virtual de GPU
Se o endereçamento virtual de GPU for usado, ponteiros para as seguintes funções também deverão ser fornecidos:
- DxgkDdiCreateProcess
- DxgkDdiDestroyProcess
- DxgkDdiGetRootPageTableSize
- DxgkDdiSetRootPageTable
- DxgkDdiSubmitCommandVirtual
Suporte ao isolamento do IoMmu
Se houver suporte para o isolamento do IoMmu, ponteiros para as seguintes funções também deverão ser fornecidos:
Suporte ao adaptador de link
Para suporte ao adaptador de link opcional, também deve ser fornecido um ponteiro para a função a seguir:
Suporte ao gerenciamento de energia
Para o suporte opcional de gerenciamento de energia, ponteiros para as seguintes funções também devem ser fornecidos:
- DxgkDdiSetPowerComponentFState; necessário se os componentes relatados dão suporte a estados F.
- DxgkDdiPowerRuntimeControlRequest
- DxgkDdiPowerRuntimeSetDeviceHandle
O suporte ao gerenciamento de energia é necessário em sistemas de Espera Moderna ou Espera Conectada.
Para obter mais informações, consulte Gerenciamento de energia da GPU de estados ociosos e energia ativa.
Suporte à remoção surpresa
Para suporte opcional de remoção surpresa, também devem ser fornecidos ponteiros para as seguintes funções:
Cancelar suporte
Para o suporte opcional de cancelamento, ponteiros para as seguintes funções também devem ser fornecidos:
Suporte à interface
Para o suporte à interface opcional, ponteiros para as seguintes funções também devem ser fornecidos:
Suporte ao agendamento de hardware
Para o suporte opcional de agendamento de hardware, ponteiros para as seguintes funções também devem ser fornecidos:
- DxgkDdiCreateHwContext
- DxgkDdiCreateHwQueue
- DxgkDdiDestroyHwContext
- DxgkDdiDestroyHwQueue
- DxgkDdiPresentToHwQueue
- [DxgkDdiResetHwEngine
- DxgkDdiResumeContext
- DxgkDdiResumeHwEngine
- DxgkDdiSetContextSchedulingProperties
- DxgkDdiSetSchedulingLogBuffer
- DxgkDdiSetupPriorityBands
- DxgkDdiSignalMonitoredFence
- DxgkDdiSubmitCommandToHwQueue
- DxgkDdiSuspendContext
- DxgkDdiSwitchToHwContextList
- DxgkDdiUpdateHwContextState
Suporte a UpdateAllocationProperty
Para suporte opcional para UpdateAllocationProperty, também devem ser fornecidos ponteiros para as seguintes funções:
Suporte de escape
Para o suporte de escape opcional, ponteiros para as seguintes funções também devem ser fornecidos:
Suporte ao Rastreamento de Eventos para Windows
Para o suporte opcional ao ETW, ponteiros para as seguintes funções também devem ser fornecidos:
Suporte a dispositivo infantil
Para suporte opcional para dispositivo filho, também devem ser fornecidos ponteiros para as seguintes funções:
Suporte ao relatório de consumo de energia
Para o suporte opcional ao relatório de consumo de energia, ponteiros para as seguintes funções também devem ser fornecidos:
Validação de envio de comando
Para validação opcional de envio de comando, os ponteiros para as seguintes funções também devem ser fornecidos:
Suporte ao IOCTL
Para o suporte opcional do IOCTL, um ponteiro para a seguinte função pode ser fornecido:
Funções proibidas
Os seguintes DDIs não devem ser fornecidos em um driver 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
Funções do WDDM 1.x
As seguintes funções são usadas somente para drivers WDDM 1.x:
- DxgkDdiQueryDiagnosticTypesSupport
- DxgkDdiQueryVidPnHWCapability
- DxgkDdiRecommendFunctionalVidPn
- DxgkDdiRecommendMonitorModes
- DxgkDdiRecommendVidPnTopology
- DxgkDdiReleaseSwizzlingRange
- DxgkDdiRenderGdi
- DxgkDdiRenderKm
- DxgkDdiSetDisplayPrivateDriverFormat
- DxgkDdiSetPalette
- DxgkDdiSetPointerPosition
- DxgkDdiSetPointerShape
- DxgkDdiSetPowerPState (o driver não deve relatar nenhum componente de energia de estado P)
- DxgkDdiSetTargetAdjustedColorimetry
- DxgkDdiSetTargetAdjustedColorimetry2
- DxgkDdiSetTargetAnalogCopyProtection
- DxgkDdiSetTargetContentType
- DxgkDdiSetTargetGamma
- DxgkDdiSetTimingsFromVidPn
- DxgkDdiSetVideoProtectedRegion
- DxgkDdiSetVidPnSourceAddress
- DxgkDdiSetVidPnSourceAddressWithMultiPlaneOverlay
- DxgkDdiSetVidPnSourceAddressWithMultiPlaneOverlay2
- DxgkDdiSetVidPnSourceAddressWithMultiPlaneOverlay3
- DxgkDdiSetVidPnSourceVisibility
- DxgkDdiStopCapture
- DxgkDdiStopDeviceAndReleasePostDisplayOwnership
- DxgkDdiSubmitRender
- DxgkDdiSystemDisplayEnable
- DxgkDdiSystemDisplayWrite
- DxgkDdiUpdateActiveVidPnPresentPath
- DxgkDdiUpdateMonitorLinkInfo
- DxgkDdiUpdateOverlay
Consulta de requisitos de informações do adaptador
Como afirmado anteriormente, um driver de computação somente deve dar suporte a DxgkDdiQueryAdapterInfo.
Os seguintes tipos de DXGK_QUERYADAPTERINFOTYPE devem ter suporte:
- DXGKQAITYPE_DRIVERCAPS
- DXGKQAITYPE_NUMPOWERCOMPONENTS
- DXGKQAITYPE_HISTORYBUFFERPRECISION
- DXGKQAITYPE_QUERYSEGMENT4 (para obter mais informações, consulte Usando segmentos de memória para descrever o espaço de endereço de GPU)
O suporte para os seguintes tipos de DXGK_QUERYADAPTERINFOTYPE é opcional:
- DXGK_ADAPTER_PERFDATA
- DXGK_ADAPTER_PERFDATACAPS
- DXGKQAITYPE_UMDRIVERPRIVATE
- DXGKQAITYPE_PHYSICALADAPTERCAPS
- DXGK_NODE_PERFDATA
- DXGK_GPUVERSION
Se um ou mais blocos de memória inválidos tiverem sido relatados, o seguinte DXGK_QUERYADAPTERINFOTYPE deverá ter suporte:
- DXGKQAITYPE_SEGMENTMEMORYSTATE
Se houver suporte para GPUVA, o seguinte DXGK_QUERYADAPTERINFOTYPE deverá ter suporte:
- DXGKQAITYPE_GPUMMUCAPS
- DXGKQAITYPE_PAGETABLELEVELDESC
Se o número de componentes de energia relatados for maior que zero, o seguinte DXGK_QUERYADAPTERINFOTYPE deverá ter suporte:
- DXGKQAITYPE_POWERCOMPONENTINFO
Se o limite de IoMmuSecureModeSupported for definido, o seguinte DXGK_QUERYADAPTERINFOTYPE deverá ter suporte:
- DXGKQAITYPE_FRAMEBUFFERSAVESIZE
- DXGKQAITYPE_HARDWARERESERVEDRANGES
O seguinte DXGK_QUERYADAPTERINFOTYPE não deve ter suporte:
- 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 funcionalidade do driver
Os seguintes membros da estrutura DXGK_DRIVERCAPS devem ser definidos com valores apropriados.
Membro | Anotações |
---|---|
EndereçoMáximoAceitável | Se esse endereço for menor que o endereço físico mais alto da memória do sistema presente durante a carga do driver, a carga falhará. |
InterruptMessageNumber | Configure conforme apropriado. |
SchedulingCaps | Consulte requisitos do SchedulingCaps. |
MemoryManagementCaps | Consulte Requisitos de MemoryManagementCaps. |
GpuEngineTopology | Defina NbAsymetricProcessingNodes para o número de mecanismos de GPU suportados. |
WDDMVersion | Deve ser definido como DXGKDDI_WDDMv2_6 ou posterior. |
PreemptionCaps | Defina GraphicsPreemptionGranularity adequadamente para o nível compatível com o hardware. No mínimo, você deve tentar oferecer suporte à preempção em nível de pacote para pacotes de desenfileiramento que estão agendados, mas ainda não começaram a ser executados. Defina ComputePreemptionGranularity para algo diferente de D3DKMDT_COMPUTE_PREEMPTION_NONE. |
SupportPerEngineTDR | Deve ser definido como TRUE. Consulte Alterações de TDR no Windows 8 e posteriores. |
SupportRuntimePowerManagement | Configure conforme apropriado. Consulte Gerenciamento de energia da GPU de estados ociosos e energia ativa. |
SupportSurpriseRemovalInHibernation | Defina como TRUE se o driver oferecer suporte à remoção surpresa quando estiver em hibernação; caso contrário, defina conforme necessário. Consulte DXGKDDI_NOTIFY_SURPRISE_REMOVAL. |
HybridDiscrete | Deve ser definido como FALSE. |
HybridIntegrated | Deve ser definido como FALSE. |
InternalGpuVirtualAddressRangeStart | Configure conforme apropriado. Se não houver suporte para GpuVA, defina como zero. Se houver suporte para GpuVA, esse valor especificará o início do intervalo de VA que o sistema operacional usará ao alocar recursos internos para uso interno do sistema operacional. |
InternalGpuVirtualAddressRangeEnd | Configure conforme apropriado. Se não houver suporte para GpuVA, defina como zero. Se houver suporte para GpuVA, esse valor especificará o final do intervalo de VA que o sistema operacional usará ao alocar recursos internos para uso interno do sistema operacional. Se os valores inicial e final forem zero, o sistema operacional usará todo o intervalo de VA disponível. |
SupportSurpriseRemoval | Configure conforme apropriado. Defina como TRUE se o driver oferecer suporte à remoção surpresa, mesmo quando não estiver em hibernação. Consulte DXGKDDI_NOTIFY_SURPRISE_REMOVAL. |
ComputeOnly | Deve ser definido como TRUE. Esse sinalizador deve ser implementado. |
Os seguintes membros da estrutura DXGK_DRIVERCAPS devem ser definidos como zero ou FALSE, de acordo:
- MaxAllocationListSlotId
- ApertureSegmentCommitLimit
- LarguraMáximaDoPonteiro (MaxPointerWidth)
- MaxPointerHeight
- PointerCaps
- NumberOfSwizzlingRanges
- MaxOverlays
- GammaRampCaps
- ColorTransformCaps
- PresentationCaps
- MaxQueuedFlipOnVSync
- FlipCaps
- SupportNonVGA
- SupportSmoothRotation
- SupportDirectFlip
- SupportMultiPlaneOverlay
- MaxOverlayPlanes
- SupportMultiPlaneOverlayImmediateFlip
- CursorScaledWithMultiPlaneOverlayPlane0
- HybridAcpiChainingRequired
- MaxQueuedMultiPlaneOverlayFlipVSync
- SupportContextlessPresent
- Removível
Requisitos do SchedulingCaps
Os seguintes membros da estrutura de DXGK_DRIVERCAPS.SchedulingCaps devem ser definidos como valores apropriados:
Membro | Anotações |
---|---|
MultiEngineAware | Deve ser definido como TRUE. Consulte Preempção de GPU. |
VSyncPowerSaveAware | Deve ser definido como FALSE. |
PreemptionAware | Deve ser definido como TRUE. Consulte Preempção de GPU. |
NoDmaPatching | Deve ser definido como FALSE. |
CancelCommandAware | Configure conforme apropriado. Consulte DXGKDDI_CANCELCOMMAND. |
No64BitAtomics | Configure conforme necessário. Consulte Monitoramento de Contexto. |
LowIrqlPreemptCommand | Definido como TRUE. O sistema operacional chamará o DxgkDdiPreemptCommand do driver em IRQL baixo. |
HwQueuePacketCap | Reservado; definido como zero. |
Requisitos de MemoryManagementCaps
Os seguintes membros da estrutura de DXGK_DRIVERCAPS.MemoryManagementCaps devem ser definidos como valores apropriados:
Membro | Anotações |
---|---|
OutOfOrderLock | Deve ser definido como FALSE. |
DedicatedPagingEngine | Deve ser definido como FALSE. |
PagingEngineCanSwizzle | Deve ser definido como FALSE. |
SectionBackedPrimary | Deve ser definido como FALSE. |
CrossAdapterResource | Configure conforme apropriado. Consulte Usando recursos de adaptador cruzado em um sistema híbrido. |
VirtualAddressingSupported | Configure conforme apropriado. Consulte memória virtual de GPU no WDDM 2.0. Se esse membro estiver definido, o driver também deverá definir GpuMmuSupported e/ou IoMmuSupported. |
GpuMmuSupported | Configure conforme apropriado. Consulte o modelo GpuMmu. |
IoMmuSupported | Configure conforme apropriado. Esse limite é definido quando o dispositivo compartilha tabelas de página com a CPU (SVM (memória virtual compartilhada)). Consulte o Modelo IoMmu . |
ReplicateGdiContent | Deve ser definido como FALSE. |
NonCpuVisiblePrimary | Deve ser definido como FALSE. |
ParavirtualizationSupported | Os drivers de host do MCDM que dão suporte à virtualização do dispositivo por meio da interface de particionamento de GPU (GPU-P com SR-IOV) devem definir esse campo como FALSE. Todos os outros casos (drivers para computadores físicos sem suporte a GPU-P ou drivers convidados de vGPUs que foram expostos por meio de GPU-P) devem definir esse campo como TRUE. |
IoMmuSecureModeSupported | Configurar conforme necessário. Se esse limite for definido como TRUE, o driver oferecerá suporte ao isolamento IoMmu (o dispositivo tem uma tabela de página dedicada para a unidade IoMmu). Se esse limite for definido como FALSE, o dispositivo não poderá ser usado nas máquinas virtuais "seguras" (Área Restrita do Windows ou MDAG). |
DisableSelfRefreshVRAMInS3 | Configure conforme apropriado. |
Gerenciamento de Memória
O endereçamento virtual é necessário. O suporte de endereçamento físico pode ser habilitado no futuro.
Os dispositivos não precisam dar suporte a uma abertura de memória.
Apenas os segmentos lineares de espaço de memória e os segmentos lineares de espaço de abertura são suportados.