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.
I punti di divisione vengono usati dalla gestione della 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 per l'esecuzione. Ad esempio, un buffer DMA di grandi dimensioni potrebbe fare riferimento a un set di allocazioni che potrebbero non rientrare nella memoria video locale o nella 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 la 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 non è possibile eseguire la preempzione del buffer DMA. In un sistema con una GPU in cui il salvataggio e il ripristino del contesto non sono possibili, il pianificatore della GPU pianifica parti suddivise di un buffer DMA in modo che le parti suddivise non siano intercalate con un altro buffer DMA da un contesto GPU diverso. Tuttavia, è necessario inviare un buffer di paging tra parti di un buffer DMA diviso perché sono necessarie operazioni di paging tra parti suddivise di un buffer DMA. Ogni punto di divisione usato dal driver per compilare un flusso DMA dell'applicazione viene usato dalla gestione della memoria video. Un buffer DMA inviato deve riprogrammare adeguatamente lo stato della GPU dopo ogni punto di divisione per tenere conto di un potenziale buffer di paging che potrebbe essere inserito in quella posizione.
Per specificare i punti di divisione, il driver miniport di visualizzazione indica i valori nei membri SplitOffset e SlotId della struttura D3DDDI_PATCHLOCATIONLIST per ogni allocazione a cui si fa riferimento nel membro AllocationIndex di D3DDDI_PATCHLOCATIONLIST. Per tenere traccia dell'utilizzo dell'allocazione all'interno di un particolare buffer DMA, il gestore della memoria video crea le dimensioni necessarie di una matrice usando il MaxAllocationListSlotId membro della struttura DXGK_DRIVERCAPS fornita dal driver tramite una chiamata al relativo funzione DxgkDdiQueryAdapterInfo. Questa matrice viene inizializzata a zero e viene riempita man mano che vengono elaborate le voci delle parti suddivise dell'elenco delle posizioni patch. Il membro SlotId di D3DDDI_PATCHLOCATIONLIST per la posizione 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 suddivisione 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 spaginata).
Quando si esegue il paging delle risorse richieste da un buffer DMA, il gestore della memoria video elabora l'elenco delle posizioni per le patch iniziando con il primo elemento e proseguendo sino all'ultimo elemento. Gli elementi D3DDDI_PATCHLOCATIONLIST compilati dal driver devono contenere valori nei relativi membri SplitOffset; gli elementi aumentano rigorosamente (ovvero, le allocazioni devono essere visualizzate nell'ordine in cui vengono usate nel flusso). Il gestore della memoria video organizza le allocazioni menzionate nell'elenco delle posizioni della patch nell'ordine in cui sono fornite. Quando si raggiunge un punto in cui il gestore della memoria video non può più mappare un'allocazione nella memoria a causa di una condizione di memoria insufficiente, il gestore della memoria video invia la parte corrente del buffer DMA preparata allo schedulatore 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 caricare. Dopo l'invio, il gestore della memoria video determina l'elenco delle allocazioni necessarie in corrispondenza dell'offset di divisione corrente nel flusso DMA utilizzando la tabella delle risorse. Tutte le allocazioni nella tabella vengono mantenute nella posizione fisica corrente, mentre altre allocazioni non più in uso potrebbero essere rimosse. La gestione della memoria video continua quindi a elaborare la lista di posizioni di patch, suddividendo potenzialmente più volte nuovamente.
Il driver deve specificare i punti di divisione ogni volta che un'allocazione è legata o slegata. Per specificare che un'allocazione è non vincolata, il driver può specificare un handle di allocazione NULL nel membro hDeviceSpecificAllocation della struttura DXGK_ALLOCATIONLIST con un valore appropriato nel membro SlotId del D3DDDI_PATCHLOCATIONLISTassociato. Il driver deve scollegare risorse di grandi dimensioni per aumentare le probabilità che il gestore di memoria video possa risolvere problemi complessi di posizionamento della memoria.
Analogamente, il driver deve riprogrammare risorse di grandi dimensioni in ogni punto di divisione. Quando si prende un punto di divisione, il gestore di memoria video viene costretto a lasciare un'allocazione associata in precedenza all'allocazione precedente. Ciò causa la frammentazione della memoria che può portare a un fallimento nel risolvere problemi complessi di posizionamento della memoria, che avrebbero potuto essere risolti se non fosse stato per la restrizione di allocazione vincolata in precedenza. Quando si calcola lo stato in un punto di divisione, il gestore della memoria video determina quale identificatore dello slot (SlotId) viene riprogrammato in quel punto di divisione( ovvero ogni elemento dell'elenco di posizioni 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, la riprogrammazione di tale trama in ogni punto di divisione offre alla gestione della memoria video la flessibilità di spostare tale trama in memoria tra i punti di divisione, se necessario.