Nota
L'accesso a questa pagina richiede l'autorizzazione. Puoi provare ad accedere o a cambiare directory.
L'accesso a questa pagina richiede l'autorizzazione. Puoi provare a cambiare directory.
Questo articolo fornisce indicazioni su come scrivere la parte del driver in modalità kernel (KMD) di un driver Microsoft Compute Only Driver (MCDM), detto anche driver di solo calcolo.
Vedere anche gli articoli seguenti:
File INF del driver
I dispositivi MCDM appartengono alla classe ComputeAccelerator , che deve essere specificata nel file INF del driver:
[Version]
...
Class=ComputeAccelerator
ClassGuid={F01A9D53-3FF6-48D2-9F97-C8A7004BE10C}
...
Inizializzazione del driver
Un driver MCDM deve fornire una funzione DriverEntry che esegue i passaggi seguenti:
- Allocare e inizializzare una struttura DRIVER_INITIALIZATION_DATA . Per informazioni dettagliate, vedere Requisiti di supporto delle funzioni del driver .
- Chiama DxgkInitialize con la struttura inizializzata.
Requisiti di supporto per le funzioni del driver
Un driver MCDM espone le funzioni implementate nella struttura DRIVER_INITIALIZATION_DATA .
Supporto minimo richiesto
Come minimo, un driver MCDM deve fornire le funzioni DDI (Device Driver Interface) seguenti:
- DxgkDdiAddDevice
- DxgkDdiBuildPagingBuffer
- DxgkDdiCalibrateGpuClock
- DxgkDdiCloseAllocation
- DxgkDdiCollectDbgInfo
- DxgkDdiCreateAllocation
- DxgkDdiCreateContext
- DxgkDdiCreateDevice
- DxgkDdiDescribeAllocation
- DxgkDdiDestroyAllocation
- DxgkDdiDestroyContext
- DxgkDdiDestroyDevice
- DxgkDdiDpcRoutine
- DxgkDdiFormatHistoryBuffer
- DxgkDdiGetNodeMetadata
- DxgkDdiGetStandardAllocationDriverData
- DxgkDdiInterruptRoutine
- DxgkDdiOpenAllocation
- DxgkDdiPreemptCommand
- DxgkDdiQueryAdapterInfo (per altre informazioni, vedere Requisiti dxgkDdiQueryAdapterInfo)
- DxgkDdiQueryDependentEngineGroup
- DxgkDdiQueryDeviceDescriptor
- DxgkDdiQueryEngineStatus
- DxgkDdiRemoveDevice
- DxgkDdiResetDevice
- DxgkDdiResetEngine
- DxgkDdiResetFromTimeout
- DxgkDdiRestartFromTimeout
- DxgkDdiSetPowerState
- DxgkDdiSetStablePowerState
- DxgkDdiSetVirtualMachineData
- DxgkDdiStartDevice
- DxgkDdiStopDevice
- DxgkDdiUnload
- DxgkDdiQueryChildStatus
- DxgkDdiQueryChildRelations
- DxgkDdiQueryConnectionChange
- DxgkDdiQueryDeviceDescriptor
Supporto dell'apertura dell'host CPU
Se l'apertura dell'host CPU è supportata, è necessario fornire anche puntatori alle seguenti funzioni.
Per altre informazioni, vedere Apertura host CPU.
Supporto di indirizzamento fisico
Se si usa l'indirizzamento fisico, è necessario specificare anche puntatori alle funzioni seguenti:
Supporto di indirizzamento virtuale GPU
Se si usa l'indirizzamento virtuale GPU, è necessario specificare anche puntatori alle funzioni seguenti:
- DxgkDdiCreateProcess
- DxgkDdiDestroyProcess
- DxgkDdiGetRootPageTableSize
- DxgkDdiSetRootPageTable
- DxgkDdiSubmitCommandVirtual
Supporto dell'isolamento IoMmu
Se è supportato l'isolamento IoMmu, è necessario specificare anche i puntatori alle funzioni seguenti:
Supporto dell'adattatore di collegamento
Per il supporto facoltativo dell'adattatore di collegamento, è necessario specificare anche un puntatore alla funzione seguente:
Supporto per il risparmio energia
Per il supporto facoltativo per il risparmio energia, è necessario fornire anche puntatori alle funzioni seguenti:
- DxgkDdiSetPowerComponentFState; obbligatorio se i componenti segnalati supportano gli stati F.
- DxgkDdiPowerRuntimeControlRequest
- DxgkDdiPowerRuntimeSetDeviceHandle
Il supporto per il risparmio energia è necessario nei sistemi Standby moderno o Standby connesso.
Per altre informazioni, vedere Gestione alimentazione GPU di stati di inattività e alimentazione attiva.
Supporto per la rimozione di sorprese
Per il supporto facoltativo per la rimozione delle sorprese, è necessario fornire anche puntatori alle funzioni seguenti:
Annullare il supporto
Per il supporto facoltativo per l'annullamento, è necessario fornire anche puntatori alle funzioni seguenti:
Supporto dell'interfaccia
Per il supporto facoltativo dell'interfaccia, è necessario fornire anche puntatori alle funzioni seguenti:
Supporto per la pianificazione hardware
Per il supporto facoltativo della pianificazione hardware, è necessario fornire anche puntatori alle funzioni seguenti:
- DxgkDdiCreateHwContext
- DxgkDdiCreateHwQueue
- DxgkDdiDestroyHwContext
- DxgkDdiDestroyHwQueue
- DxgkDdiPresentToHwQueue
- [DxgkDdiResetHwEngine
- DxgkDdiResumeContext
- DxgkDdiResumeHwEngine
- DxgkDdiSetContextSchedulingProperties
- DxgkDdiSetSchedulingLogBuffer
- DxgkDdiSetupPriorityBands
- DxgkDdiSignalMonitoredFence
- DxgkDdiSubmitCommandToHwQueue
- DxgkDdiSuspendContext
- DxgkDdiSwitchToHwContextList
- DxgkDdiUpdateHwContextState
Supporto di UpdateAllocationProperty
Per il supporto facoltativo di UpdateAllocationProperty, è necessario fornire anche puntatori alle funzioni seguenti:
Supporto per le sequenze di escape
Per il supporto di escape facoltativo, è necessario fornire anche puntatori alle funzioni seguenti:
Supporto di Event Tracing for Windows
Per il supporto ETW facoltativo, è necessario fornire anche puntatori alle funzioni seguenti:
Supporto dei dispositivi figlio
Per il supporto facoltativo dei dispositivi figlio, è necessario fornire anche puntatori alle funzioni seguenti:
Supporto per la creazione di report sul consumo energetico
Per il supporto facoltativo per la creazione di report sul consumo energetico, è necessario fornire anche puntatori alle funzioni seguenti:
Convalida dell'invio di comandi
Per la convalida facoltativa dell'invio di comandi, è necessario specificare anche puntatori alle funzioni seguenti:
Supporto IOCTL
Per il supporto IOCTL facoltativo, è possibile fornire un puntatore alla funzione seguente:
Funzioni non consentite
Le DDI seguenti non devono essere fornite in un 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
Funzioni WDDM 1.x
Per i driver WDDM 1.x vengono usate solo le funzioni seguenti:
- DxgkDdiQueryDiagnosticTypesSupport
- DxgkDdiQueryVidPnHWCapability
- DxgkDdiRecommendFunctionalVidPn
- DxgkDdiRecommendMonitorModes
- DxgkDdiRecommendVidPnTopology
- DxgkDdiReleaseSwizzlingRange
- DxgkDdiRenderGdi
- DxgkDdiRenderKm
- DxgkDdiSetDisplayPrivateDriverFormat
- DxgkDdiSetPalette
- DxgkDdiSetPointerPosition
- DxgkDdiSetPointerShape
- DxgkDdiSetPowerPState (il driver non deve segnalare alcun componente di alimentazione P-state)
- DxgkDdiSetTargetAdjustedColorimetry
- DxgkDdiSetTargetAdjustedColorimetry2
- DxgkDdiSetTargetAnalogCopyProtection
- DxgkDdiSetTargetContentType
- DxgkDdiSetTargetGamma
- DxgkDdiSetTimingsFromVidPn
- DxgkDdiSetVideoProtectedRegion
- DxgkDdiSetVidPnSourceAddress
- DxgkDdiSetVidPnSourceAddressWithMultiPlaneOverlay
- DxgkDdiSetVidPnSourceAddressWithMultiPlaneOverlay2
- DxgkDdiSetVidPnSourceAddressWithMultiPlaneOverlay3
- DxgkDdiSetVidPnSourceVisibility
- DxgkDdiStopCapture
- DxgkDdiStopDeviceAndReleasePostDisplayOwnership
- DxgkDdiSubmitRender
- DxgkDdiSystemDisplayEnable
- DxgkDdiSystemDisplayWrite
- DxgkDdiUpdateActiveVidPnPresentPath
- DxgkDdiUpdateMonitorLinkInfo
- DxgkDdiUpdateOverlay
Requisiti delle informazioni dell'adattatore della query
Come indicato in precedenza, un driver dedicato al calcolo deve supportare DxgkDdiQueryAdapterInfo.
I tipi di DXGK_QUERYADAPTERINFOTYPE seguenti devono essere supportati:
- DXGKQAITYPE_DRIVERCAPS
- DXGKQAITYPE_NUMPOWERCOMPONENTS
- DXGKQAITYPE_HISTORYBUFFERPRECISION
- DXGKQAITYPE_QUERYSEGMENT4 (per altre informazioni, vedere Uso dei segmenti di memoria per descrivere lo spazio degli indirizzi GPU)
Il supporto per i tipi di DXGK_QUERYADAPTERINFOTYPE seguenti è facoltativo:
- DXGK_ADAPTER_PERFDATA
- DXGK_ADAPTER_PERFDATACAPS
- DXGKQAITYPE_UMDRIVERPRIVATE
- DXGKQAITYPE_PHYSICALADAPTERCAPS
- DXGK_NODE_PERFDATA
- DXGK_GPUVERSION
Se sono stati segnalati uno o più blocchi di memoria non validi, è necessario supportare i DXGK_QUERYADAPTERINFOTYPE seguenti:
- DXGKQAITYPE_SEGMENTMEMORYSTATE
Se la GPUVA è supportata, è necessario supportare i DXGK_QUERYADAPTERINFOTYPE seguenti:
- DXGKQAITYPE_GPUMMUCAPS
- DXGKQAITYPE_PAGETABLELEVELDESC
Se il numero di componenti di alimentazione segnalati è maggiore di zero, è necessario supportare i DXGK_QUERYADAPTERINFOTYPE seguenti:
- DXGKQAITYPE_POWERCOMPONENTINFO
Se è impostato il limite IoMmuSecureModeSupported , è necessario supportare i DXGK_QUERYADAPTERINFOTYPE seguenti:
- DXGKQAITYPE_FRAMEBUFFERSAVESIZE
- DXGKQAITYPE_HARDWARERESERVEDRANGES
I DXGK_QUERYADAPTERINFOTYPE seguenti non devono essere supportati:
- DXGKQAITYPE_DEVICE_TYPE_CAPS
- DXGKQAITYPE_DISPLAY_DRIVERCAPS_EXTENSION
- DXGKQAITYPE_DISPLAYID_DESCRIPTOR
- DXGKQAITYPE_INTEGRATED_DISPLAY_DESCRIPTOR (Descrittore del display integrato)
- DXGKQAITYPE_INTEGRATED_DISPLAY_DESCRIPTOR2
- DXGKQAITYPE_POWERCOMPONENTPSTATEINFO
- DXGKQAITYPE_PREFERREDGPUNODE
- DXGKQAITYPE_QUERYCOLORIMETRYOVERRIDES
- DXGKQAITYPE_QUERYSEGMENT
- DXGKQAITYPE_QUERYSEGMENT2
- DXGKQAITYPE_QUERYSEGMENT3
- DXGKQAITYPE_UEFIFRAMEBUFFERRANGES
Requisiti di funzionalità del driver
I membri della struttura DXGK_DRIVERCAPS seguenti devono essere impostati sui valori appropriati:
| Membro | Note |
|---|---|
| IndirizzoMassimoAccettabile | Se questo indirizzo è minore dell'indirizzo fisico più alto della memoria di sistema presente durante il caricamento del driver, il carico non riesce. |
| NumeroMessaggioDiInterruzione | Impostare in base alle esigenze. |
| SchedulingCaps | Vedere Requisiti di SchedulingCaps. |
| MemoryManagementCaps | Vedere Requisiti di MemoryManagementCaps. |
| GpuEngineTopology | Impostare NbAsymetricProcessingNodes sul numero di motori GPU supportati. |
| WDDMVersion | Deve essere impostato su DXGKDDI_WDDMv2_6 o versione successiva. |
| PreemptionCaps | Imposta GraphicsPreemptionGranularity al livello supportato dall'hardware in modo appropriato. Come minimo, è consigliabile tentare di supportare la precedenza a livello di pacchetto per i pacchetti di rimozione dalla coda pianificati ma non ancora avviati. Impostare ComputePreemptionGranularity su qualsiasi elemento diverso da D3DKMDT_COMPUTE_PREEMPTION_NONE. |
| SupportPerEngineTDR | Deve essere impostato su TRUE. Vedi Modifiche TDR in Windows 8 e versioni successive. |
| Supporto alla Gestione Energetica in Tempo Reale | Impostare in base alle esigenze. Vedere gestione dell'energia della GPU degli stati di inattività e della potenza attiva. |
| SupportoRimozioneImprovvisaInIbernazione | Impostare su TRUE se il driver supporta la rimozione a sorpresa durante l'ibernazione; in caso contrario, impostare come appropriato. Vedere DXGKDDI_NOTIFY_SURPRISE_REMOVAL. |
| HybridDiscrete | Deve essere impostato su FALSE. |
| HybridIntegrated | Deve essere impostato su FALSE. |
| InizioIntervalloIndirizziVirtualiGpuInterna (InternalGpuVirtualAddressRangeStart) | Impostare in base alle esigenze. Se GpuVA non è supportata, impostare su zero. Se GpuVA è supportato, questo valore specifica l'inizio dell'intervallo di disponibilità che verrà usato dal sistema operativo durante l'allocazione di risorse interne per l'uso interno del sistema operativo. |
| InternalGpuVirtualAddressRangeEnd | Impostare in base alle esigenze. Se GpuVA non è supportata, impostare su zero. Se GpuVA è supportato, questo valore specifica la fine dell'intervallo di disponibilità che verrà usato dal sistema operativo durante l'allocazione di risorse interne per l'uso interno del sistema operativo. Se entrambi i valori iniziale e finale sono zero, il sistema operativo userà l'intero intervallo di valutazione disponibile. |
| Supporto Rimozione Improvvisa | Impostare in base alle esigenze. Impostare su TRUE se il driver supporta la rimozione a sorpresa anche al di fuori dell'ibernazione. Vedere DXGKDDI_NOTIFY_SURPRISE_REMOVAL. |
| ComputeOnly | Deve essere impostato su TRUE. Questo flag deve essere implementato. |
I membri della struttura DXGK_DRIVERCAPS seguenti devono essere impostati su zero o FALSE, di conseguenza:
- MaxAllocationListSlotId
- ApertureSegmentCommitLimit
- MaxPointerWidth
- MaxPointerHeight
- PointerCaps
- NumeroDiIntervalliDiSwizzling
- MaxOverlays
- GammaRampCaps
- ColorTransformCaps
- PresentationCaps
- MaxQueuedFlipOnVSync
- FlipCaps
- SupportoNonVGA
- SupportSmoothRotation
- SupportDirectFlip
- SupportMultiPlaneOverlay
- MaxOverlayPlanes
- SupportMultiPlaneOverlayImmediateFlip
- CursoreScalatoConSovrapposizioneMultiplanarePiano0
- HybridAcpiChainingRequired
- MaxQueuedMultiPlaneOverlayFlipVSync
- SupportoPresentazioneSenzaContesto
- Removibile
Requisiti di SchedulingCaps
Il DXGK_DRIVERCAPS seguente. I membri della struttura SchedulingCaps devono essere impostati sui valori appropriati:
| Membro | Note |
|---|---|
| MultiEngineAware | Deve essere impostato su TRUE. Vedere Preempzione GPU. |
| VSyncPowerSaveAware | Deve essere impostato su FALSE. |
| PreemptionAware | Deve essere impostato su TRUE. Vedere Precedenza GPU. |
| NoDmaPatching | Deve essere impostato su FALSE. |
| CancelCommandAware | Impostare in base alle esigenze. Vedere DXGKDDI_CANCELCOMMAND. |
| No64BitAtomics | Impostare in base alle esigenze. Vedere Monitoraggio del contesto. |
| LowIrqlPreemptCommand | Impostare su VERO. Il sistema operativo chiamerà dxgkDdiPreemptCommand del driver a basso IRQL. |
| HwQueuePacketCap | Riservato; impostato su zero. |
Requisiti di MemoryManagementCaps
Il DXGK_DRIVERCAPS seguente. I membri della struttura MemoryManagementCaps devono essere impostati sui valori appropriati:
| Membro | Note |
|---|---|
| OutOfOrderLock | Deve essere impostato su FALSE. |
| DedicatedPagingEngine | Deve essere impostato su FALSE. |
| PagingEngineCanSwizzle | Deve essere impostato su FALSE. |
| PrimarioSupportatoDaSezione | Deve essere impostato su FALSE. |
| CrossAdapterResource | Impostare in base alle esigenze. Vedere Uso di risorse tra adattatori in un sistema ibrido. |
| SupportoIndirizzamentoVirtuale | Impostare in base alle esigenze. Vedere Memoria virtuale GPU in WDDM 2.0. Se questo membro è impostato, il driver deve anche impostare GpuMmuSupported e/o IoMmuSupported. |
| GpuMmuSupported | Impostare in base alle esigenze. Vedere Modello GpuMmu. |
| IoMmuSupported | Impostare in base alle esigenze. Questo limite viene impostato quando il dispositivo condivide le tabelle di pagine con la CPU (memoria virtuale condivisa)). Vedere Modello IoMmu. |
| ReplicateGdiContent | Deve essere impostato su FALSE. |
| NonCpuVisiblePrimary | Deve essere impostato su FALSE. |
| ParavirtualizzazioneSupportata | I driver host MCDM che supportano la virtualizzazione del dispositivo tramite l'interfaccia di partizionamento GPU (GPU-P con SR-IOV) devono impostare questo campo su FALSE. Tutti gli altri casi (driver per computer fisici senza supporto GPU-P o driver guest di vGPU esposti tramite GPU-P) devono impostare questo campo su TRUE. |
| IoMmuSecureModeSupported | Impostare in base alle esigenze. Se questo limite è impostato su TRUE, il driver supporta l'isolamento IoMmu (il dispositivo ha una tabella di pagine dedicata per l'unità IoMmu). Se questo limite è impostato su FALSE, il dispositivo non può essere usato nelle macchine virtuali "sicure" (Windows Sandbox o MDAG). |
| Disabilitare Aggiornamento Automatico Memoria Video in S3 | Impostare in base alle esigenze. |
Gestione della memoria
L'indirizzamento virtuale è obbligatorio. Il supporto dell'indirizzamento fisico potrebbe essere abilitato in futuro.
Non è richiesto che i dispositivi supportino un'apertura di memoria.
Sono supportati solo i segmenti di spazio di memoria lineare e i segmenti dello spazio di apertura lineare .