Precedenza GPU

È stato disponibile un modello di precedenza GPU più recente a partire da Windows 8. In questo modello il sistema operativo non consente più di disabilitare i pacchetti DMA (Direct Memory Access) della GPU e garantisce che le richieste di precedenza vengano inviate alla GPU prima dell'avvio di un processo TDR (Timeout Detection and Recovery).

Requisito Descrizione
Versione minima di Windows Display Driver Model (WDDM) 1,2
Versione minima di Windows 8
Implementazione del driver: grafica completa e solo rendering Obbligatorio
Requisiti e test WHLK Device.Graphics... Test di preemption, Device.Graphics... FlipOnVSyncMmIo

Se i pacchetti a esecuzione prolungata non possono essere superati correttamente, il lavoro gpu ad alta priorità, ad esempio il lavoro richiesto da Gestione finestre desktop (DWM), può essere ritardato, causando problemi durante le transizioni e le animazioni della finestra. Inoltre, i pacchetti GPU a esecuzione prolungata che non possono essere annullati possono causare la reimpostazione ripetuta della GPU da parte di un processo TDR e alla fine può verificarsi un controllo di bug di sistema.

Nota Tutti i driver miniport di visualizzazione WDDM 1.2 devono supportare il modello di preemption Windows 8. Tuttavia, quando sono operativi, i driver WDDM 1.2 possono anche rifiutare il modello di Windows 8 di precedenza e mantenere il comportamento di Windows 7 dall'utilità di pianificazione del sottosistema del kernel grafico Microsoft DirectX.

Interfacce del driver di dispositivo con precedenza GPU

Le interfacce DDI (Device Driver Interface) seguenti sono disponibili per il driver miniport di visualizzazione per implementare il modello di preemption della GPU Windows 8.

Visualizzare l'implementazione del driver miniport

Seguire questi passaggi generali per implementare il modello di precedenza della GPU Windows 8 nel driver miniport dello schermo:

  1. Compilare il driver in base alle intestazioni con DXGKDDI_INTERFACE_VERSION= DXGKDDI_INTERFACE_VERSION_WIN8>.
  2. Dichiarare il supporto per il modello di preemption Windows 8 GPU impostando i membri PreemptionAware e MultiEngineAware della struttura DXGK_VIDSCHCAPS su 1. Per supportare il modello di precedenza di Windows 7, impostare PreemptionAware su zero.
  3. Specificare il livello supportato di granularità di precedenza nella struttura D3DKMDT_PREEMPTION_CAPS , che accetta valori costanti dalle enumerazioni D3DKMDT_GRAPHICS_PREEMPTION_GRANULARITY e D3DKMDT_COMPUTE_PREEMPTION_GRANULARITY .
  4. Se l'hardware supporta il cambio di contesto lazy, inviare un buffer di lunghezza zero alla funzione DxgkDdiSubmitCommand e impostare il membro pSubmitCommand-Flags-ContextSwitch>> su 1. Prendere nota della discussione nel membro ContextSwitch della struttura DXGK_SUBMITCOMMANDFLAGS .
  5. Impostare allocazioni del contesto GPU e allocazioni del contesto di dispositivo chiamando la funzione DxgkCbCreateContextAllocation . Si notino le istruzioni e le restrizioni specifiche indicate in Osservazioni per la funzione.
  6. Chiamare la funzione DxgkCbDestroyContextAllocation per eliminare le allocazioni del contesto GPU e le allocazioni del contesto di dispositivo create con DxgkCbCreateContextAllocation.
  7. 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, gestione memoria video manterrà il contenuto delle risorse di contesto.
  8. Il driver deve supportare il capovolgimento di I/O mappato alla memoria nella sincronizzazione verticale successiva. In Windows 8, l'utilità di pianificazione GPU tenta di interrompere l'hardware anche se i capovolgimenti sono in sospeso. Pertanto, per evitare la disinstallazione e il rendering degli artefatti, il driver deve supportare il modello 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 sul mapping della memoria nell'implementazione

Creare un driver affidabile che supporti il modello di precedenza della GPU Windows 8 e fornisca un'esperienza utente di qualità seguendo queste indicazioni:

  • Richiedere la precedenza del buffer mid-DMA dalla GPU quando l'utilità di pianificazione del kernel grafico DirectX (Dxgkrnl) invia un comando di precedenza. I dispositivi hardware con una granularità più fine della precedenza del buffer mid-DMA dovrebbero produrre un'esperienza migliore per i clienti.
  • Consenti il riutilizzo degli ID di isolamento dei comandi di paging: se una richiesta di preemption ha comportato la precedenza dei comandi di paging nella coda hardware, l'utilità di pianificazione Dxgkrnl invia di nuovo comandi di paging con gli stessi ID di isolamento usati in origine e i comandi di paging verranno pianificati prima di qualsiasi altro comando del motore. I comandi non di paging verranno reinserisciti con gli ID di isolamento appena assegnati.
  • Specificare un elenco di percorsi patch per i buffer DMA suddivisi. Vedere Suddivisione di un buffer DMA.
  • È disponibile una modalità di verifica, denominata rilevamento delle perdite di binding, che 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 indirizzi virtuali supportano hardware, 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 Windows 8 di precedenza, l'utilità di pianificazione può eseguire il rendering di pacchetti da un contesto diverso tra due pacchetti divisi che corrispondono allo stesso comando di rendering. Di conseguenza, i driver che conoscono la precedenza devono gestire un invio di pacchetti DMA diviso/parziale allo stesso modo di un normale invio di pacchetti completi. In particolare, lo stato della GPU deve essere salvato o ripristinato al limite per tali invii.
  • Un driver compatibile con precedenza non deve modificare il contenuto di un buffer DMA diviso quando viene trasmesso a più schede in modalità LDA (Linked Display Adapter), in cui più GPU fisiche sono collegate per formare una GPU singola, più veloce e virtuale. Questo perché, nell'Windows 8 modello di precedenza, 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 perché, se il pacchetto fosse stato eseguito in un altro motore, funzionerebbe sulla stessa copia dei dati del buffer DMA.
  • Nel modello di preemption Windows 8 GPU, l'utilità di pianificazione Dxgkrnl abilita la precedenza per i pacchetti che hanno associato primitive di sincronizzazione "signal on submit". Se un dispositivo usa primitive di sincronizzazione "signal on submit" in combinazione con gli 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à, fare riferimento alla documentazione WHCK pertinente in Device.Graphics... Test di preemption e Device.Graphics... FlipOnVSyncMmIo.

Per una revisione delle funzionalità aggiunte con Windows 8, vedere funzionalità di WDDM 1.2.