Compartilhar via


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:

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:

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

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:

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:

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:

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:

DxgkDdiDispatchIoRequest

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:

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.