Condividi tramite


Percorso di presentazione DXGI

DXGI fornisce applicazioni con una metodologia di presentazione che "funziona solo". Ad esempio, le applicazioni non sono necessarie per eseguire operazioni speciali per la transizione tra la modalità finestra e la modalità schermo intero. Questa metodologia di presentazione è possibile perché DXGI e il driver di visualizzazione in modalità utente interagiscono per mantenere la presentazione tra combinazioni di più alias anti-aliasing di esempio (MSAA), monitorare le differenze di rotazione, back e buffer anteriore in dimensioni e formato e schermo intero rispetto alle modalità finestrate. Un altro vantaggio di DXGI è che consente a una scheda di visualizzazione di avere una capacità limitata di analizzare MSAA e superfici ruotate perché DXGI fornisce un DDI "senza stato". In un DDI senza stato, il driver dell'adattatore non è necessario per registrare i dati tra chiamate DDI.

L'attività di base della presentazione consiste nel spostare i dati da un buffer restituito alla superficie primaria per la visualizzazione. Questa attività viene eseguita nelle diverse situazioni descritte nelle sezioni seguenti.

Modalità finestrata con DWM in

Nella modalità finestra con Desktop Windows Manager (DWM)-on case, DXGI comunica con DWM e apre una visualizzazione di una risorsa condivisa che è una destinazione di rendering per il produttore DXGI e una trama per DWM. Questa risorsa condivisa esiste oltre a tutti i buffer back creati dall'applicazione. DXGI chiama la funzione BltDXGI del driver per spostare i dati da uno dei buffer indietro alla superficie condivisa. Questa operazione potrebbe richiedere la risoluzione stretch, color conversion e MSAA. Tuttavia, questa operazione non richiede mai rettangoli secondari di origine e destinazione. In effetti, questi sotto rettangoli non possono essere espressi nella chiamata a BltDXGI. Questo trasferimento a blocchi di bit (bitblt) ha sempre il flag Present impostato nel membro Flag della struttura DXGI_DDI_ARG_BLT a cui punta il parametro pBltData . L'impostazione del flag Present indica che il driver deve eseguire l'operazione atomicamente. Il driver esegue l'operazione bitblt in modo atomico per ridurre al minimo la possibilità di strappare mentre DWM legge la risorsa condivisa per la composizione.

Modalità finestrata con DWM disattivata

Nella modalità finestra con DWM-off case, DXGI chiama la funzione PresentDXGI del driver con il flag Blt impostato nel membro Flags della struttura DXGI_DDI_ARG_PRESENT a cui punta il parametro pPresentData . In questa chiamata PresentDXGI DXGI può specificare uno dei buffer back creati dall'applicazione nei membri hSurfaceToPresent e SrcSubResourceIndex di DXGI_DDI_ARG_PRESENT. Non esiste una superficie condivisa aggiuntiva.

Modalità schermo intero

Il case a schermo intero è più complicato della modalità finestrata con DWM o disattivato.

Quando DXGI esegue la transizione alla modalità schermo intero, tenta di sfruttare un'operazione di capovolgimento per ridurre la larghezza di banda e ottenere la sincronizzazione verticale. Le condizioni seguenti possono impedire l'uso di un'operazione di capovolgimento:

  • L'applicazione non ha riassegnare i buffer indietro in modo che corrispondano alla superficie primaria.

  • Il driver ha specificato che non eseguirà l'analisi del buffer indietro, ad esempio perché il buffer indietro è ruotato o è MSAA.

  • L'applicazione ha specificato che non può accettare l'eliminazione del runtime Direct3D del contenuto del buffer back e ha richiesto un solo buffer (totale) nella catena. In questo caso, DXGI alloca una superficie posteriore e una superficie primaria. Tuttavia, DXGI usa la funzione PresentDXGI del driver con il set di flag Blt .

Quando si è verificata una delle condizioni precedenti, impedendo così un'operazione di capovolgimento e una chiamata alla funzione PresentDXGI del driver con il set di flag Blt non è appropriato (perché il buffer indietro non corrisponde esattamente al buffer anteriore), DXGI alloca la superficie proxy. Questa superficie proxy corrisponde al buffer anteriore. Di conseguenza, un capovolgimento tra l'area proxy e il buffer anteriore diventa possibile. Se l'area proxy esiste, DXGI usa la funzione BltDXGI del driver con il flag Presente deselezionato (0) per copiare i buffer indietro dell'applicazione nell'area proxy. In questa chiamata BltDXGI, DXGI potrebbe richiedere la conversione, l'estensione e la risoluzione. DXGI chiama quindi la funzione PresentDXGI del driver con il flag Flip impostato nel membro Flag della struttura DXGI_DDI_ARG_PRESENT per spostare i bit di superficie proxy da analizzare.

Per notificare al driver di visualizzazione in modalità utente che il driver può rifiutare l'analisi, il driver riceverà chiamate di creazione di risorse per classi facoltative e non facoltative di superfici di analisi. Le superfici di analisi facoltative sono definite dal flag di DXGI_DDI_PRIMARY_OPTIONAL. Le superfici di analisi non facoltative non hanno il flag DXGI_DDI_PRIMARY_OPTIONAL impostato. Per altre informazioni su questi tipi di chiamate alla creazione di risorse, vedere Passaggio di informazioni DXGI in fase di creazione delle risorse.

DXGI imposta il flag di DXGI_DDI_PRIMARY_OPTIONAL per creare tutte le superfici del buffer indietro, ovvero superfici facoltative, e non imposta il flag per qualsiasi superficie del buffer o proxy front-end, ovvero una superficie non facoltativa.

Se DXGI_DDI_PRIMARY_OPTIONAL è impostato per un buffer indietro, il driver può impostare il flag di DXGI_DDI_PRIMARY_DRIVER_FLAG_NO_SCANOUT. Per altre informazioni sull'impostazione di questo flag, vedere Passaggio di informazioni DXGI all'ora di creazione delle risorse. Se il driver imposta DXGI_DDI_PRIMARY_DRIVER_FLAG_NO_SCANOUT per un buffer facoltativo, non ha effetto diverso da quello di causare la chiamata della funzione DXGI alla funzione PresentDXGI del driver con il flag Blt impostato anziché con il set di flag Flip .

Se DXGI_DDI_PRIMARY_OPTIONAL non è impostato per un buffer anteriore o per l'area proxy, il driver può comunque rifiutare l'interruzione dell'analisi eseguendo la chiamata di creazione delle risorse con codice di errore DXGI_DDI_ERR_UNSUPPORTED e impostando DXGI_DDI_PRIMARY_DRIVER_FLAG_NO_SCANOUT.

Nota L'errore della chiamata di creazione senza impostare DXGI_DDI_PRIMARY_DRIVER_FLAG_NO_SCANOUT è riservato ai casi di errore reali, ad esempio la memoria insufficiente.

DXGI sfrutta questa metodologia di consenso esplicito quando tenta di creare una catena di presentazioni a schermo intero per un buffer MSAA o ruotato indietro. Se il driver non eseguirà l'analisi di nessuno o entrambi questi tipi, il driver opterà per il rifiuto esplicito. DXGI tenterà quindi di creare una superficie non ruotata, una superficie non MSAA o entrambi fino a quando il driver accetta la creazione della risorsa. Di conseguenza, DXGI fallback progressivamente fino a quando la superficie non facoltativa corrisponde esattamente al formato del buffer anteriore, al conteggio dei campioni, alla rotazione e alle dimensioni.

Se il driver opta per qualsiasi superficie non facoltativa, DXGI deve comunque avere un modo per spostare i bit dal buffer indietro alla superficie primaria. Di conseguenza, se il driver opta per l'analisi per MSAA e rotazione, il driver opta per risolvere, ruotare o entrambi quando DXGI chiama la funzione BltDXGI del driver. Quando il driver annulla il consenso esplicito, DXGI creerà una superficie proxy e chiamerà BltDXGI per spostare i dati dai buffer indietro a tale superficie proxy. Il driver non deve avere alcun motivo per rifiutare esplicitamente questa superficie proxy perché il proxy corrisponde esattamente al buffer anteriore.

Le situazioni insolite seguenti si verificano quando l'applicazione non crea nuovamente le sue superfici dopo una transizione in o fuori dalla modalità a schermo intero:

  • Se l'applicazione non crea nuovamente le sue superfici quando entra in modalità schermo intero, DXGI determina che i buffer indietro non corrispondono al buffer anteriore, anche se corrispondono in formato, dimensioni, rotazione e conteggio di campioni. La causa di questa determinazione è che il sistema operativo richiede il tag back buffer per l'analisi a un determinato monitoraggio quando vengono creati i buffer. I buffer back finestrati non possono ancora essere assegnati definitivamente a un determinato monitoraggio perché il monitoraggio viene scelto in modo dinamico quando viene immesso lo schermo intero. Di conseguenza, DXGI non deve inviare questi buffer indietro al driver per l'analisi (tramite un'operazione di scorrimento). Le applicazioni di questo tipo forzano in genere DXGI a creare la superficie proxy.

  • Se l'applicazione non crea nuovamente i buffer indietro quando torna alla modalità finestra, DXGI potrebbe chiamare bltDXGI del driver o PresentDXGI (con set Blt ) per eseguire un bitblt su una superficie creata in precedenza per un'operazione di capovolgimento. Questa situazione non deve essere un problema, ma è menzionata qui per la completezza. Si noti che DXGI elimina sempre la superficie proxy quando l'applicazione passa alla modalità finestra.

Si noti inoltre che le applicazioni possono ridimensionare dinamicamente i buffer indietro mentre le applicazioni sono in modalità schermo intero. Questa azione causa la logica descritta nelle situazioni precedenti. Pertanto, l'area proxy potrebbe essere creata e eliminata e rifiutare di rifiutare o meno di essere necessaria nel tempo anche se l'applicazione rimane in modalità schermo intero. L'applicazione può anche trasferire l'output in un altro monitoraggio in modo dinamico senza lasciare la modalità schermo intero. Pertanto, l'applicazione comporta un passaggio alla modalità bitblt perché i buffer back dell'applicazione sono stati contrassegnati per un monitoraggio diverso.

Infine, è necessario tenere presente la situazione che si verifica rispetto ai buffer back MSAA se il driver non esclude l'analisi MSAA. In questa situazione, il driver opta per l'analisi di MSAA. Di conseguenza, DXGI interscambia il buffer back MSAA e il buffer front-end MSAA tramite operazioni di capovolgimento ed esegue un'operazione di risoluzione in base a quello equivalente al convertitore digitale-analogico (DAC). In questa situazione, l'applicazione può ridimensionare dinamicamente i buffer indietro mentre in modalità schermo intero, che impone a DXGI di passare alla chiamata alla funzione BltDXGI del driver. Poiché le caratteristiche MSAA del buffer indietro e del buffer anteriore corrispondono ancora, DXGI specifica che il driver esegue una risoluzione non risolta, possibilmente convertendo i colori, estendendo bitblt. Il driver deve quindi replicare, senza risolvere, piùampli nel buffer anteriore, che è necessario se un driver sceglie di analizzare MSAA.