Diretrizes de implementação do driver KM do MCDM
Este artigo fornece diretrizes sobre como escrever a parte do driver do modo kernel de um driver MCDM (Microsoft Compute Only Driver), também conhecido como driver somente computação.
Consulte também os seguintes artigos:
Arquivo INF do driver
Os dispositivos MCDM pertencem à classe ComputeAccelerator , que precisa ser especificada no arquivo INF:
[Version]
...
Class=ComputeAccelerator
ClassGuid={F01A9D53-3FF6-48D2-9F97-C8A7004BE10C}
...
Inicialização do driver
Um driver somente de computação deve fornecer uma função DriverEntry que execute as seguintes etapas:
- Aloque e inicialize uma estrutura de DRIVER_INITIALIZATION_DATA . Confira Requisitos de suporte à função de driver para obter detalhes.
- Chame DxgkInitialize com a estrutura inicializada.
Requisitos de suporte à função de driver
Um driver somente computação expõe as funções que ele implementa na estrutura DRIVER_INITIALIZATION_DATA .
Suporte mínimo necessário
No mínimo, um driver somente de computação 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 (confira mais informações em Requisitos de DxgkDdiQueryAdapterInfo)
- DxgkDdiQueryDependentEngineGroup
- DxgkDdiQueryDeviceDescriptor
- DxgkDdiQueryEngineStatus
- DxgkDdiRemoveDevice
- DxgkDdiResetDevice
- DxgkDdiResetEngine
- DxgkDdiResetFromTimeout
- DxgkDdiRestartFromTimeout
- DxgkDdiSetPowerState
- DxgkDdiSetStablePowerState
- DxgkDdiSetVirtualMachineData
- DxgkDdiStartDevice
- DxgkDdiStopDevice
- DxgkDdiUnload
- DxgkDdiQueryChildStatus
- DxgkDdiQueryChildRelations
- DxgkDdiQueryConnectionChange
- DxgkDdiQueryDeviceDescriptor
Suporte à abertura do 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, confira Abertura do host da CPU.
Suporte a endereçamento físico
Se o endereçamento físico for usado, 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 o suporte opcional ao adaptador de link, um ponteiro para a função a seguir também deve ser fornecido:
Suporte ao gerenciamento de energia
Para suporte ao gerenciamento de energia opcional, ponteiros para as seguintes funções também devem ser fornecidos:
- DxgkDdiSetPowerComponentFState; necessário se os componentes relatados deem suporte a estados F.
- DxgkDdiPowerRuntimeControlRequest
- DxgkDdiPowerRuntimeSetDeviceHandle
OBSERVAÇÃO: o suporte ao gerenciamento de energia é necessário em sistemas em espera moderno ou em espera conectado.
Para obter mais informações, consulte Gerenciamento de energia de GPU de estados ociosos e energia ativa.
Suporte à remoção surpresa
Para suporte à remoção surpresa opcional, os ponteiros para as seguintes funções também devem ser fornecidos:
Cancelar suporte
Para o suporte opcional de cancelamento, ponteiros para as seguintes funções também devem ser fornecidos:
Suporte à interface
Para suporte à interface opcional, ponteiros para as seguintes funções também devem ser fornecidos:
Suporte ao agendamento de hardware
Para suporte ao agendamento de hardware opcional, 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 o suporte opcional updateAllocationProperty, ponteiros para as seguintes funções também devem ser fornecidos:
- DxgkDdiValidateUpdateAllocationProperty
Suporte de escape
Para suporte de escape opcional, ponteiros para as seguintes funções também devem ser fornecidos:
Suporte ao Rastreamento de Eventos para Windows
Para suporte ao ETW opcional, ponteiros para as seguintes funções também devem ser fornecidos:
Suporte a dispositivo filho
Para suporte ao dispositivo filho opcional, ponteiros para as seguintes funções também devem ser fornecidos:
Suporte a relatórios de consumo de energia
Para suporte opcional ao relatório de consumo de energia, os ponteiros para as seguintes funções também devem ser fornecidos:
Validação de envio de comando
Para validação de envio de comando opcional, ponteiros para as seguintes funções também devem ser fornecidos:
Suporte a IOCTL
Para suporte ao IOCTL opcional, um ponteiro para a função a seguir 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
Requisitos de informações do adaptador de consulta
Conforme mencionado anteriormente, um driver somente de computação 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 da 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, os seguintes DXGK_QUERYADAPTERINFOTYPE deverão ter suporte:
- DXGKQAITYPE_SEGMENTMEMORYSTATE
Se houver suporte para GPUVA, os seguintes DXGK_QUERYADAPTERINFOTYPE deverão ter suporte:
- DXGKQAITYPE_GPUMMUCAPS
- DXGKQAITYPE_PAGETABLELEVELDESC
Se o número de componentes de energia relatados for maior que zero, os seguintes DXGK_QUERYADAPTERINFOTYPE deverão ter suporte:
- DXGKQAITYPE_POWERCOMPONENTINFO
Se o limite IoMmuSecureModeSupported estiver definido, os seguintes DXGK_QUERYADAPTERINFOTYPE deverão ter suporte:
- DXGKQAITYPE_FRAMEBUFFERSAVESIZE
- DXGKQAITYPE_HARDWARERESERVEDRANGES
Não há suporte para as seguintes 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 funcionalidade do driver
Os seguintes membros da estrutura DXGK_DRIVERCAPS devem ser definidos para os valores apropriados:
Membro | Observações |
---|---|
HighestAcceptableAddress | 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 | Defina conforme apropriado. |
SchedulingCaps | Confira Requisitos de SchedulingCaps. |
MemoryManagementCaps | Confira Requisitos de MemoryManagementCaps. |
GpuEngineTopology | Defina NbAsymetricProcessingNodes como o número de mecanismos de GPU com suporte. |
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 dar suporte à preempção no nível do pacote; ou seja, um pacote de remoção de fila que foi agendado, mas ainda não começou a ser executado. Defina ComputePreemptionGranularity como qualquer outra coisa que não seja D3DKMDT_COMPUTE_PREEMPTION_NONE. |
SupportPerEngineTDR | Deve ser definido como TRUE. Consulte Alterações de TDR no Windows 8 e posterior. |
SupportRuntimePowerManagement | Defina conforme apropriado. Confira Gerenciamento de energia de GPU de estados ociosos e energia ativa. |
SupportSurpriseRemovalInHibernation | Defina como TRUE se o driver der suporte à remoção surpresa quando estiver em hibernação; caso contrário, defina conforme apropriado. Consulte DXGKDDI_NOTIFY_SURPRISE_REMOVAL. |
HybridDiscrete | Deve ser definido como FALSE. |
Híbrido Integrado | Deve ser definido como FALSE. |
InternalGpuVirtualAddressRangeStart | Defina 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 | Defina 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 | Defina conforme apropriado. Defina como TRUE se o driver der suporte à remoção surpresa mesmo fora da 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
- MaxPointerWidth
- MaxPointerHeight
- PointerCaps
- NumberOfSwizzlingRanges
- MaxOverlays
- GammaRampCaps
- ColorTransformCaps
- PresentationCaps
- MaxQueuedFlipOnVSync
- FlipCaps
- SupportNonVGA
- SupportSmoothRotation
- SupportDirectFlip
- SupportMultiPlaneOverlay
- MaxOverlayPlanes
- SupportMultiPlaneOverlayImmediateFlip
- CursorScaledWithMultiPlaneOverlayPlane0
- HybridAcpiChainingRequired
- MaxQueuedMultiPlaneOverlayFlipVSync
- SupportContextlessPresent
- Detachable
Requisitos de SchedulingCaps
O DXGK_DRIVERCAPS a seguir. Os membros da estrutura SchedulingCaps devem ser definidos com os valores apropriados:
Membro | Observações |
---|---|
MultiEngineAware | Deve ser definido como TRUE. Confira Preempção de GPU. |
VSyncPowerSaveAware | Deve ser definido como FALSE. |
PreemptionAware | Deve ser definido como TRUE. Confira Preempção de GPU. |
NoDmaPatching | Deve ser definido como FALSE. |
CancelCommandAware | Defina conforme apropriado. Consulte DXGKDDI_CANCELCOMMAND. |
No64BitAtomics | Defina conforme apropriado. Confira Monitoramento de Contexto. |
LowIrqlPreemptCommand | Defina como TRUE. O sistema operacional chamará o DxgkDdiPreemptCommand do driver em IRQL baixo. |
HwQueuePacketCap | Reservados; definido como zero. |
Requisitos de MemoryManagementCaps
O DXGK_DRIVERCAPS a seguir. Os membros da estrutura MemoryManagementCaps devem ser definidos para os valores apropriados:
Membro | Observaçõ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 | Defina conforme apropriado. Consulte Usando recursos de adaptador cruzado em um sistema híbrido. |
VirtualAddressingSupported | Defina conforme apropriado. Confira 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 | Defina conforme apropriado. Confira Modelo gpummu. |
IoMmuSupported | Defina conforme apropriado. Esse limite é definido quando o dispositivo compartilha tabelas de página com a CPU (memória virtual compartilhada (SVM)). Confira Modelo IoMmu. |
ReplicateGdiContent | Deve ser definido como FALSE. |
NonCpuVisiblePrimary | Deve ser definido como FALSE. |
ParavirtualizationSupported | Os drivers de host 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 | Defina conforme apropriado. 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 | Defina conforme apropriado. |
Gerenciamento de memória
O endereçamento virtual é necessário. O suporte a endereçamento físico pode ser habilitado no futuro.
Os dispositivos não são necessários para dar suporte a uma abertura de memória.
Há suporte apenas para segmentos lineares de espaço de memória e segmentos lineares de espaço de abertura .