Pedoman implementasi driver MCDM KM
Artikel ini menyediakan panduan tentang cara menulis bagian driver mode kernel dari driver Microsoft Compute Only Driver (MCDM), juga disebut sebagai driver khusus komputasi.
Lihat juga artikel berikut ini:
File INF driver
Perangkat MCDM milik kelas ComputeAccelerator , yang perlu ditentukan dalam file INF:
[Version]
...
Class=ComputeAccelerator
ClassGuid={F01A9D53-3FF6-48D2-9F97-C8A7004BE10C}
...
Inisialisasi driver
Driver khusus komputasi harus menyediakan fungsi DriverEntry yang melakukan langkah-langkah berikut:
- Mengalokasikan dan menginisialisasi struktur DRIVER_INITIALIZATION_DATA . Lihat Persyaratan dukungan fungsi driver untuk detailnya.
- Panggil DxgkInitialize dengan struktur yang diinisialisasi.
Persyaratan dukungan fungsi driver
Driver khusus komputasi mengekspos fungsi yang diterapkannya dalam struktur DRIVER_INITIALIZATION_DATA .
Dukungan minimum yang diperlukan
Minimal, driver khusus komputasi harus menyediakan fungsi antarmuka driver perangkat (DDI) berikut:
- DxgkDdiAddDevice
- DxgkDdiBuildPagingBuffer
- DxgkDdiCalibrateGpuClock
- DxgkDdiCloseAllocation
- DxgkDdiCollectDbgInfo
- DxgkDdiCreateAllocation
- DxgkDdiCreateContext
- DxgkDdiCreateDevice
- DxgkDdiDescribeAllocation
- DxgkDdiDestroyAllocation
- DxgkDdiDestroyContext
- DxgkDdiDestroyDevice
- DxgkDdiDpcRoutine
- DxgkDdiFormatHistoryBuffer
- DxgkDdiGetNodeMetadata
- DxgkDdiGetStandardAllocationDriverData
- DxgkDdiInterruptRoutine
- DxgkDdiOpenAllocation
- DxgkDdiPreemptCommand
- DxgkDdiQueryAdapterInfo (informasi selengkapnya, lihat persyaratan DxgkDdiQueryAdapterInfo)
- DxgkDdiQueryDependentEngineGroup
- DxgkDdiQueryDeviceDescriptor
- DxgkDdiQueryEngineStatus
- DxgkDdiRemoveDevice
- DxgkDdiResetDevice
- DxgkDdiResetEngine
- DxgkDdiResetFromTimeout
- DxgkDdiRestartFromTimeout
- DxgkDdiSetPowerState
- DxgkDdiSetStablePowerState
- DxgkDdiSetVirtualMachineData
- DxgkDdiStartDevice
- DxgkDdiStopDevice
- DxgkDdiUnload
- DxgkDdiQueryChildStatus
- DxgkDdiQueryChildRelations
- DxgkDdiQueryConnectionChange
- DxgkDdiQueryDeviceDescriptor
Dukungan aperture host CPU
Jika bukaan host CPU didukung, pointer ke fungsi berikut juga harus disediakan:
Untuk informasi selengkapnya, lihat Bukaan host CPU.
Dukungan alamat fisik
Jika alamat fisik digunakan, penunjuk ke fungsi berikut juga harus disediakan:
Dukungan alamat virtual GPU
Jika alamat virtual GPU digunakan, penunjuk ke fungsi berikut juga harus disediakan:
- DxgkDdiCreateProcess
- DxgkDdiDestroyProcess
- DxgkDdiGetRootPageTableSize
- DxgkDdiSetRootPageTable
- DxgkDdiSubmitCommandVirtual
Dukungan isolasi IoMmu
Jika isolasi IoMmu didukung, pointer ke fungsi berikut juga harus disediakan:
Dukungan adaptor tautan
Untuk dukungan adaptor tautan opsional, penunjuk ke fungsi berikut juga harus disediakan:
Dukungan manajemen daya
Untuk dukungan manajemen daya opsional, pointer ke fungsi berikut juga harus disediakan:
- DxgkDdiSetPowerComponentFState; diperlukan jika komponen yang dilaporkan mendukung F-states.
- DxgkDdiPowerRuntimeControlRequest
- DxgkDdiPowerRuntimeSetDeviceHandle
CATATAN: dukungan manajemen daya diperlukan pada sistem Siaga Modern atau Siaga Terhubung.
Untuk informasi selengkapnya, lihat Manajemen daya GPU status diam dan daya aktif.
Dukungan penghapusan kejutan
Untuk dukungan penghapusan kejutan opsional, pointer ke fungsi berikut juga harus disediakan:
Batalkan dukungan
Untuk dukungan pembatalan opsional, pointer ke fungsi berikut juga harus disediakan:
Dukungan antarmuka
Untuk dukungan antarmuka opsional, pointer ke fungsi berikut juga harus disediakan:
Dukungan penjadwalan perangkat keras
Untuk dukungan penjadwalan perangkat keras opsional, pointer ke fungsi berikut juga harus disediakan:
- DxgkDdiCreateHwContext
- DxgkDdiCreateHwQueue
- DxgkDdiDestroyHwContext
- DxgkDdiDestroyHwQueue
- DxgkDdiPresentToHwQueue
- [DxgkDdiResetHwEngine
- DxgkDdiResumeContext
- DxgkDdiResumeHwEngine
- DxgkDdiSetContextSchedulingProperties
- DxgkDdiSetSchedulingLogBuffer
- DxgkDdiSetupPriorityBands
- DxgkDdiSignalMonitoredFence
- DxgkDdiSubmitCommandToHwQueue
- DxgkDdiSuspendContext
- DxgkDdiSwitchToHwContextList
- DxgkDdiUpdateHwContextState
Dukungan UpdateAllocationProperty
Untuk dukungan UpdateAllocationProperty opsional, pointer ke fungsi berikut juga harus disediakan:
- DxgkDdiValidateUpdateAllocationProperty
Dukungan escape
Untuk dukungan escape opsional, pointer ke fungsi berikut juga harus disediakan:
Penelusuran Peristiwa untuk dukungan Windows
Untuk dukungan ETW opsional, pointer ke fungsi berikut juga harus disediakan:
Dukungan perangkat anak
Untuk dukungan perangkat anak opsional, pointer ke fungsi berikut juga harus disediakan:
Dukungan pelaporan konsumsi daya
Untuk dukungan pelaporan konsumsi daya opsional, pointer ke fungsi berikut juga harus disediakan:
Validasi pengiriman perintah
Untuk validasi pengiriman perintah opsional, penunjuk ke fungsi berikut juga harus disediakan:
Dukungan IOCTL
Untuk dukungan IOCTL opsional, pointer ke fungsi berikut dapat disediakan:
Fungsi yang dilarang
DDI berikut tidak boleh disediakan dalam 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
Fungsi WDDM 1.x
Fungsi berikut hanya digunakan untuk driver WDDM 1.x:
- DxgkDdiQueryDiagnosticTypesSupport
- DxgkDdiQueryVidPnHWCapability
- DxgkDdiRecommendFunctionalVidPn
- DxgkDdiRecommendMonitorModes
- DxgkDdiRecommendVidPnTopology
- DxgkDdiReleaseSwizzlingRange
- DxgkDdiRenderGdi
- DxgkDdiRenderKm
- DxgkDdiSetDisplayPrivateDriverFormat
- DxgkDdiSetPalette
- DxgkDdiSetPointerPosition
- DxgkDdiSetPointerShape
- DxgkDdiSetPowerPState (driver tidak boleh melaporkan komponen daya P-state)
- DxgkDdiSetTargetAdjustedColorimetry
- DxgkDdiSetTargetAdjustedColorimetry2
- DxgkDdiSetTargetAnalogCopyProtection
- DxgkDdiSetTargetContentType
- DxgkDdiSetTargetGamma
- DxgkDdiSetTimingsFromVidPn
- DxgkDdiSetVideoProtectedRegion
- DxgkDdiSetVidPnSourceAddress
- DxgkDdiSetVidPnSourceAddressWithMultiPlaneOverlay
- DxgkDdiSetVidPnSourceAddressWithMultiPlaneOverlay2
- DxgkDdiSetVidPnSourceAddressWithMultiPlaneOverlay3
- DxgkDdiSetVidPnSourceVisibility
- DxgkDdiStopCapture
- DxgkDdiStopDeviceAndReleasePostDisplayOwnership
- DxgkDdiSubmitRender
- DxgkDdiSystemDisplayEnable
- DxgkDdiSystemDisplayWrite
- DxgkDdiUpdateActiveVidPnPresentPath
- DxgkDdiUpdateMonitorLinkInfo
- DxgkDdiUpdateOverlay
Persyaratan info adaptor kueri
Seperti yang dinyatakan sebelumnya, driver khusus komputasi harus mendukung DxgkDdiQueryAdapterInfo.
Jenis DXGK_QUERYADAPTERINFOTYPE berikut harus didukung:
- DXGKQAITYPE_DRIVERCAPS
- DXGKQAITYPE_NUMPOWERCOMPONENTS
- DXGKQAITYPE_HISTORYBUFFERPRECISION
- DXGKQAITYPE_QUERYSEGMENT4 (untuk informasi selengkapnya, lihat Menggunakan segmen memori untuk menjelaskan ruang alamat GPU)
Dukungan untuk jenis DXGK_QUERYADAPTERINFOTYPE berikut bersifat opsional:
- DXGK_ADAPTER_PERFDATA
- DXGK_ADAPTER_PERFDATACAPS
- DXGKQAITYPE_UMDRIVERPRIVATE
- DXGKQAITYPE_PHYSICALADAPTERCAPS
- DXGK_NODE_PERFDATA
- DXGK_GPUVERSION
Jika satu atau beberapa blok memori yang tidak valid dilaporkan, DXGK_QUERYADAPTERINFOTYPE berikut harus didukung:
- DXGKQAITYPE_SEGMENTMEMORYSTATE
Jika GPUVA didukung, DXGK_QUERYADAPTERINFOTYPE berikut harus didukung:
- DXGKQAITYPE_GPUMMUCAPS
- DXGKQAITYPE_PAGETABLELEVELDESC
Jika jumlah komponen daya yang dilaporkan lebih besar dari nol, DXGK_QUERYADAPTERINFOTYPE berikut harus didukung:
- DXGKQAITYPE_POWERCOMPONENTINFO
Jika batas IoMmuSecureModeSupported diatur, DXGK_QUERYADAPTERINFOTYPE berikut harus didukung:
- DXGKQAITYPE_FRAMEBUFFERSAVESIZE
- DXGKQAITYPE_HARDWARERESERVEDRANGES
DXGK_QUERYADAPTERINFOTYPE berikut ini tidak boleh didukung:
- 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
Persyaratan kemampuan driver
Anggota struktur DXGK_DRIVERCAPS berikut harus diatur ke nilai yang sesuai:
Anggota | Catatan |
---|---|
HighestAcceptableAddress | Jika alamat ini kurang dari alamat fisik tertinggi memori sistem yang ada selama beban driver, beban akan gagal. |
InterruptMessageNumber | Atur sebagaimana mewajarinya. |
SchedulingCaps | Lihat Persyaratan SchedulingCaps. |
MemoryManagementCaps | Lihat Persyaratan MemoryManagementCaps. |
GpuEngineTopology | Atur NbAsymetricProcessingNodes ke jumlah mesin GPU yang didukung. |
WDDMVersion | Harus diatur ke DXGKDDI_WDDMv2_6 atau yang lebih baru. |
PreemptionCaps | Atur GraphicsPreemptionGranularity dengan tepat ke tingkat yang didukung oleh perangkat keras. Minimal Anda harus mencoba mendukung preemption tingkat paket; artinya, paket dequeue yang telah dijadwalkan tetapi belum mulai dieksekusi. Atur ComputePreemptionGranularity ke apa pun selain D3DKMDT_COMPUTE_PREEMPTION_NONE. |
SupportPerEngineTDR | Harus diatur ke TRUE. Lihat Perubahan TDR di Windows 8 dan yang lebih baru. |
SupportRuntimePowerManagement | Atur sebagaimana mewajarinya. Lihat Manajemen daya GPU status diam dan daya aktif. |
SupportSurpriseRemovalInHibernation | Atur ke TRUE jika driver mendukung penghapusan mendadak saat dalam hibernasi; jika tidak, tetapkan sebagaimana mewajarinya. Lihat DXGKDDI_NOTIFY_SURPRISE_REMOVAL. |
HybridDiscrete | Harus diatur ke FALSE. |
HybridIntegrated | Harus diatur ke FALSE. |
InternalGpuVirtualAddressRangeStart | Atur sebagaimana mewajarinya. Jika GpuVA tidak didukung, atur ke nol. Jika GpuVA didukung, nilai ini menentukan awal rentang VA yang akan digunakan OS saat mengalokasikan sumber daya internal untuk penggunaan internal OS. |
InternalGpuVirtualAddressRangeEnd | Atur sebagaimana mewajarinya. Jika GpuVA tidak didukung, atur ke nol. Jika GpuVA didukung, nilai ini menentukan akhir rentang VA yang akan digunakan OS saat mengalokasikan sumber daya internal untuk penggunaan internal OS. Jika nilai awal dan akhir adalah nol, OS akan menggunakan seluruh rentang VA yang tersedia. |
SupportSurpriseRemoval | Atur sebagaimana mewajarinya. Atur ke TRUE jika driver mendukung penghapusan kejutan bahkan di luar hibernasi. Lihat DXGKDDI_NOTIFY_SURPRISE_REMOVAL. |
ComputeOnly | Harus diatur ke TRUE. Bendera ini harus diimplementasikan. |
Anggota struktur DXGK_DRIVERCAPS berikut harus diatur ke nol atau FALSE, yang sesuai:
- MaxAllocationListSlotId
- ApertureSegmentCommitLimit
- MaxPointerWidth
- MaxPointerHeight
- PointerCaps
- NumberOfSwizzlingRanges
- MaxOverlays
- GammaRampCaps
- ColorTransformCaps
- PresentationCaps
- MaxQueuedFlipOnVSync
- FlipCaps
- SupportNonVGA
- SupportSmoothRotation
- SupportDirectFlip
- SupportMultiPlaneOverlay
- MaxOverlayPlanes
- SupportMultiPlaneOverlayImmediateFlip
- CursorScaledWithMultiPlaneOverlayPlane0
- HybridAcpiChainingRequired
- MaxQueuedMultiPlaneOverlayFlipVSync
- SupportContextlessPresent
- Dilepas
Persyaratan SchedulingCaps
Berikut ini DXGK_DRIVERCAPS. Anggota struktur SchedulingCaps harus diatur ke nilai yang sesuai:
Anggota | Catatan |
---|---|
MultiEngineAware | Harus diatur ke TRUE. Lihat Preemption GPU. |
VSyncPowerSaveAware | Harus diatur ke FALSE. |
PreemptionAware | Harus diatur ke TRUE. Lihat Preemption GPU. |
NoDmaPatching | Harus diatur ke FALSE. |
CancelCommandAware | Atur sebagaimana mewajarkan. Lihat DXGKDDI_CANCELCOMMAND. |
No64BitAtomics | Atur sebagaimana mewajarkan. Lihat Pemantauan Konteks. |
LowIrqlPreemptCommand | Atur ke TRUE. OS akan memanggil DxgkDdiPreemptCommand driver di IRQL rendah. |
HwQueuePacketCap | Dipesan; atur ke nol. |
Persyaratan MemoryManagementCaps
Berikut ini DXGK_DRIVERCAPS. Anggota struktur MemoryManagementCaps harus diatur ke nilai yang sesuai:
Anggota | Catatan |
---|---|
OutOfOrderLock | Harus diatur ke FALSE. |
DedicatedPagingEngine | Harus diatur ke FALSE. |
PagingEngineCanSwizzle | Harus diatur ke FALSE. |
SectionBackedPrimary | Harus diatur ke FALSE. |
CrossAdapterResource | Atur sebagaimana mewajarkan. Lihat Menggunakan Sumber Daya Adaptor Silang dalam Sistem Hibrid. |
VirtualAddressingSupported | Atur sebagaimana mewajarkan. Lihat memori virtual GPU di WDDM 2.0. Jika anggota ini diatur, driver juga harus mengatur GpuMmuSupported dan/atau IoMmuSupported. |
GpuMmuSupported | Atur sebagaimana mewajarkan. Lihat Model GpuMmu. |
IoMmuSupported | Atur sebagaimana mewajarkan. Batas ini diatur ketika perangkat berbagi tabel halaman dengan CPU (memori virtual bersama (SVM)). Lihat Model IoMmu. |
ReplicateGdiContent | Harus diatur ke FALSE. |
NonCpuVisiblePrimary | Harus diatur ke FALSE. |
ParavirtualizationSupported | Driver host MCDM yang mendukung virtualisasi perangkat melalui antarmuka partisi GPU (GPU-P dengan SR-IOV) harus mengatur bidang ini ke FALSE. Semua kasus lain (driver untuk komputer fisik tanpa dukungan GPU-P atau driver tamu vGPU yang telah diekspos melalui GPU-P) harus mengatur bidang ini ke TRUE. |
IoMmuSecureModeSupported | Atur sebagaimana mewajarkan. Jika batas ini diatur TRUE, driver mendukung isolasi IoMmu (perangkat memiliki tabel halaman khusus untuk unit IoMmu). Jika batas ini diatur FALSE, perangkat tidak dapat digunakan di komputer virtual "aman" (Kotak Pasir Windows atau MDAG). |
DisableSelfRefreshVRAMInS3 | Atur sebagaimana mewajarkan. |
Manajemen Memori
Alamat virtual diperlukan. Dukungan alamat fisik mungkin diaktifkan di masa mendatang.
Perangkat tidak diperlukan untuk mendukung bukaan memori.
Hanya segmen ruang memori linier dan segmen ruang bukaan linier yang didukung.