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.
Il modello di preemption della GPU è stato aggiornato in Windows 8 (WDDM 1.2). Nel modello aggiornato il sistema operativo:
- Non consente al driver di visualizzazione in modalità kernel (KMD) di disabilitare la precedenza dei pacchetti DMA GPU.
- Garantisce che le richieste di precedenza vengano inviate alla GPU prima di avviare un processo di rilevamento e ripristino del timeout.
| Requisito | Descrizione |
|---|---|
| Implementazione del driver: grafica completa e solo rendering | Obbligatorio |
| Requisiti e test WHLK | Device.Graphics... Test di preemption, Device.Graphics... FlipOnVSyncMmIo |
Se il sistema operativo non riesce a preempte correttamente i pacchetti con esecuzione prolungata, allora:
- È possibile ritardare il lavoro della GPU ad alta priorità, ad esempio il lavoro richiesto da Desktop Window Manager (DWM). Questo ritardo causa errori durante le transizioni di finestra e le animazioni.
- Il processo TDR potrebbe reimpostare ripetutamente la GPU e infine causare un controllo dei bug di sistema.
Tutti i KMD WDDM 1.2 devono supportare il modello di preemption di Windows 8. Tuttavia, durante il funzionamento, i driver WDDM 1.2 possono anche respingere il modello di preemption di Windows 8 e mantenere il comportamento di Windows 7 dal gestore del kernel grafico di DirectX (Dxgkrnl).
Interfaccia di preemption GPU
KMD può usare le DDI seguenti per implementare il modello di GPU preemption di Windows 8.
- DxgkCbCreateContextAllocation
- DxgkCbDestroyContextAllocation
- pfnSetPriorityCb
- Interfaccia Dxgkrnl
- DXGKRNL_INTERFACE
- D3DKMDT_COMPUTE_PREEMPTION_GRANULARITY
- D3DKMDT_GRAPHICS_PREEMPTION_GRANULARITY
- D3DKMDT_PREEMPTION_CAPS
- D3DKMT_QUERYADAPTERINFO
- DXGK_DRIVERCAPS
- DXGK_SUBMITCOMMANDFLAGS
- DXGK_VIDSCHCAPS
- DXGKARGCB_CREATECONTEXTALLOCATION
Passaggi di implementazione del driver
Seguire questi passaggi generali per implementare il modello di precedenza GPU di Windows 8 nel kmD:
- Compilare il driver in base alle intestazioni con DXGKDDI_INTERFACE_VERSION>= DXGKDDI_INTERFACE_VERSION_WIN8.
- Dichiarare il supporto per il modello di precedenza GPU di Windows 8 impostando i membri PreemptionAware e MultiEngineAware della struttura DXGK_VIDSCHCAPS su 1. Per supportare il modello di preemption di Windows 7, impostare PreemptionAware su zero.
- Specificare il livello di granularità di precedenza supportato nella struttura D3DKMDT_PREEMPTION_CAPS , che accetta valori costanti dalle enumerazioni D3DKMDT_GRAPHICS_PREEMPTION_GRANULARITY e D3DKMDT_COMPUTE_PREEMPTION_GRANULARITY .
- Se l'hardware supporta il cambio di contesto pigro, inviare un buffer di lunghezza zero alla funzione DxgkDdiSubmitCommand e impostare il membro pSubmitCommand->Flags->ContextSwitch su 1. Annotare l'argomentazione relativa al membro ContextSwitch della struttura DXGK_SUBMITCOMMANDFLAGS.
- Impostare le allocazioni del contesto GPU e le allocazioni del contesto di dispositivo chiamando la funzione DxgkCbCreateContextAllocation . Si notino le istruzioni e le restrizioni specifiche specificate in Osservazioni per la funzione.
- Chiamare la funzione DxgkCbDestroyContextAllocation per eliminare le allocazioni del contesto GPU e le allocazioni del contesto di dispositivo create con DxgkCbCreateContextAllocation.
- Quando si prepara il buffer DMA in risposta a una chiamata alla funzione DxgkDdiBuildPagingBuffer , inizializzare la risorsa di contesto compilando la struttura interna InitContextResource all'interno della struttura DXGKARG_BUILDPAGINGBUFFER . Se le risorse di contesto vengono rimosse o spostate, la gestione della memoria video manterrà il contenuto delle risorse di contesto.
- Il driver deve supportare l'inversione di I/O mappata alla memoria nella sincronizzazione verticale successiva. In Windows 8, l'utilità di pianificazione GPU tenta di prevenire l'hardware anche se i capovolgimenti sono in sospeso. Pertanto, per evitare la lacerazione e il rendering degli artefatti, il driver deve supportare il modello di flip I/O mappato alla memoria e deve impostare il membro FlipOnVSyncMmIo della struttura DXGK_FLIPCAPS su 1 e supportare le operazioni descritte in FlipOnVSyncMmIo.
Considerazioni sulla mappatura della memoria nell'implementazione
Seguire queste indicazioni per creare un driver affidabile che supporti il modello di precedenza GPU di Windows 8 e fornisca un'esperienza utente di qualità:
- Richiedere la preemption del buffer DMA intermedio dalla GPU quando il pianificatore Dxgkrnl invia un comando di preemption. I dispositivi hardware con una granularità più fine nella preemption del buffer DMA intermedio dovrebbero migliorare l'esperienza dei clienti.
- Consenti il riutilizzo degli ID di recinzione dei comandi di paging: se una richiesta di preemption ha causato il preempting dei comandi di paging nella coda hardware, il scheduler Dxgkrnl reinvierà i comandi di paging preempted con gli stessi ID di recinzione originariamente usati per loro e i comandi di paging verranno pianificati prima di qualsiasi altro comando su tale processore. I comandi non-paginati verranno inviati di nuovo con gli ID di isolamento appena assegnati.
- Fornire un elenco dei percorsi delle patch per i buffer DMA divisi. Per altre informazioni, vedere Suddivisione di un buffer DMA.
- È disponibile una modalità di verifica, denominata rilevamento delle perdite di associazione. Questa modalità di verifica illustra l'elenco dei percorsi delle patch e rifiuta i pacchetti che non vengono scollegati o che non riprogrammano le allocazioni per ogni pacchetto diviso. Alcuni hardware supportano gli indirizzi virtuali, consentendo un livello aggiuntivo di riferimento indiretto che può rendere questa verifica non necessaria. In tal caso, per indicare che il driver rifiuta esplicitamente la modalità di verifica, impostare il membro NoDmaPatching della struttura DXGK_VIDSCHCAPS su 1.
- In Windows 7, l'utilità di pianificazione Dxgkrnl garantisce che tutti i pacchetti DMA divisi che corrispondono allo stesso comando di rendering vengano eseguiti in sequenza senza passare a un altro contesto di rendering. Nel modello di preemption di Windows 8, il scheduler può eseguire pacchetti di rendering da un contesto diverso tra due pacchetti divisi che corrispondono allo stesso comando di rendering. Di conseguenza, i driver che conoscono il preemption devono gestire un invio di pacchetti DMA diviso/parziale allo stesso modo di un normale invio di pacchetti completo. In particolare, lo stato della GPU deve essere salvato o ripristinato al limite per tali invii.
- Un driver consapevole della preemption non deve modificare il contenuto di un buffer DMA diviso quando viene trasmesso a più adattatori in modalità Linked Display Adapter (LDA), in cui più GPU fisiche sono collegate per formare un'unica GPU virtuale più veloce. Nel modello di preemption di Windows 8, l'utilità di pianificazione Dxgkrnl non garantisce più l'esecuzione sincrona di una sequenza di pacchetti divisa senza passare a un altro contesto. Un driver che ha modificato il contenuto di un pacchetto DMA diviso comprometterebbe l'integrità dei dati del pacchetto. In particolare, se il pacchetto è stato eseguito su un altro motore, funzionerebbe sulla stessa copia dei dati del buffer DMA.
- Nel modello di pre-emption GPU di Windows 8, il scheduler Dxgkrnl abilita la pre-emption per i pacchetti che hanno associate primitive di sincronizzazione di tipo "signal on submit". Se un dispositivo usa primitive di sincronizzazione "signal on submit" con stati di attesa basati su hardware, deve supportare la possibilità di anteporre un'istruzione di attesa prima che la condizione di attesa venga soddisfatta.
Requisiti di certificazione hardware
Per informazioni sui requisiti che i dispositivi hardware devono soddisfare quando implementano questa funzionalità, consultare la documentazione di WHLK pertinente su Device.Graphics… Test di preemptione e Device.Graphics… FlipOnVSyncMmIo.