Condividi tramite


Divisione di un buffer DMA

I punti di divisione vengono usati dalla gestione memoria video per dividere un elemento di lavoro di grandi dimensioni inviato dal driver miniport di visualizzazione in elementi di lavoro più piccoli che richiedono meno risorse GPU da eseguire. Ad esempio, un buffer DMA di grandi dimensioni potrebbe fare riferimento a un set di allocazioni che potrebbero non adattarsi alla memoria video locale o alla memoria non locale. L'unico modo per elaborare un elemento di lavoro di questo tipo consiste nel suddividerlo in più elementi di lavoro più piccoli che richiedono meno risorse GPU.

Nota La suddivisione del buffer DMA e il preemption del buffer DMA sono concetti indipendenti diversi. Un driver miniport di visualizzazione deve sempre supportare la suddivisione del buffer DMA anche in un sistema con una GPU in cui la preemption del buffer DMA non è possibile. In un sistema con una GPU in cui il salvataggio e il ripristino del contesto non è possibile, l'utilità di pianificazione GPU pianifica parti di un buffer DMA indietro per garantire che le parti di divisione non siano interleaved con un altro buffer DMA da un contesto GPU diverso. Tuttavia, un buffer di paging deve essere inviato tra parti di un buffer DMA diviso perché le operazioni di paging sono necessarie tra parti suddivise di un buffer DMA. Ogni punto di divisione usato dal driver per creare un flusso DMA dell'applicazione viene usato dalla gestione memoria video. Un buffer DMA inviato deve riprogrammare lo stato della GPU sufficiente dopo ogni punto di divisione per tenere conto di un potenziale buffer di paging che potrebbe essere inserito in tale posizione.

Per specificare i punti di divisione, il driver miniport visualizzato specifica i valori nei membri SplitOffset e SlotId della struttura D3DDDI_PATCHLOCATIONLIST per ogni allocazione a cui fa riferimento il membro AllocationIndex di D3DDDI_PATCHLOCATIONLIST. Per tenere traccia dell'utilizzo dell'allocazione all'interno di un determinato buffer DMA, la gestione memoria video crea le dimensioni necessarie di una matrice usando il membro MaxAllocationListSlotId della struttura DXGK_DRIVERCAPS fornita dal driver tramite una chiamata alla relativa funzione DxgkDdiQueryAdapterInfo . Questa matrice viene inizializzata a zero e viene compilata come voci di parti suddivise dell'elenco di patch-location vengono elaborate. Il membro SlotId di D3DDDI_PATCHLOCATIONLIST per il percorso della patch indica quale riga della tabella delle risorse deve essere aggiornata mentre il membro SplitOffset indica l'offset all'interno del buffer DMA in cui è necessaria l'allocazione. Il buffer DMA può essere eseguito fino al punto specificato da SplitOffset senza che la risorsa sia accessibile alla GPU. Analogamente, se una nuova voce di divisione della posizione patch fa riferimento allo stesso SlotId, l'allocazione precedente viene sostituita dalla nuova allocazione e l'allocazione precedente non è più necessaria, ovvero l'allocazione precedente può essere impaginata.

Quando si esegue il paging nelle risorse richieste da un buffer DMA, la gestione memoria video elabora l'elenco di patch-location iniziando con il primo elemento e spostandosi verso il basso verso l'ultimo elemento. Gli elementi D3DDDI_PATCHLOCATIONLIST riempiti dal driver devono contenere valori nei membri SplitOffset ; gli elementi aumentano rigorosamente , ovvero le allocazioni devono essere visualizzate nell'ordine in cui vengono usate nel flusso. Le pagine di gestione memoria video nelle allocazioni a cui si fa riferimento nell'elenco patch-location nell'ordine specificato. Quando viene raggiunto un punto in cui la gestione memoria video non riesce più a paginare un'allocazione a causa di una condizione di memoria ridotta, la gestione memoria video invia la parte corrente del buffer DMA in fase di preparazione all'utilità di pianificazione della GPU per l'esecuzione. Il buffer DMA viene eseguito dall'inizio del punto di divisione precedente fino al valore SplitOffset specificato per un'allocazione che non è stato possibile inserire. Una volta inviato, la gestione memoria video determina l'elenco delle allocazioni necessarie in corrispondenza dell'offset di divisione corrente nel flusso DMA usando la tabella delle risorse. Tutte le allocazioni nella tabella vengono mantenute nella posizione fisica corrente, mentre altre allocazioni che non sono più in uso potrebbero essere rimosse. La gestione memoria video continua quindi a elaborare l'elenco di patch-location, suddividendo potenzialmente più volte di nuovo.

Il driver deve specificare i punti di divisione ogni volta che un'allocazione è associata o non associata. Per specificare che un'allocazione non è in uscita, il driver può specificare un handle di allocazione NULL nel membro hDeviceSpecificAllocation della struttura DXGK_ALLOCATIONLIST con il valore appropriato nel membro SlotId del D3DDDI_PATCHLOCATIONLIST associato. Il driver deve annullare l'associazione di risorse di grandi dimensioni per aumentare le probabilità che la gestione memoria video possa risolvere problemi complessi di posizionamento della memoria.

Analogamente, il driver deve riprogrammare grandi risorse in ogni punto di divisione. Quando si prende un punto di divisione, la gestione memoria video è costretta a lasciare un'allocazione associata in precedenza all'allocazione precedente. Ciò causa la frammentazione della memoria che può causare un errore per risolvere problemi di posizionamento di memoria complessi che potrebbero essere stati risolti se non per la restrizione di allocazione associata in precedenza. Quando si calcola lo stato in un punto di divisione, la gestione memoria video determina quale identificatore slot (SlotId) viene riprogrammato in quel punto di divisione ,ovvero ogni elemento dell'elenco di patch che condivide lo stesso valore SplitOffset con altri elementi) e ignora la restrizione di posizionamento in questo punto di divisione. Ad esempio, se il driver usa una trama da 64 MB, riprogrammare la trama in ogni punto di divisione offre la flessibilità di spostare tale trama in memoria tra punti di divisione, se necessario.