Condividi tramite


Dispositivi persi (Direct3D 9)

Un dispositivo Direct3D può trovarsi in uno stato operativo o in uno stato perso. Lo stato operativo è lo stato normale del dispositivo in cui viene eseguito il dispositivo e presenta tutto il rendering come previsto. Il dispositivo esegue una transizione allo stato perso quando un evento, ad esempio la perdita dello stato attivo della tastiera in un'applicazione a schermo intero, fa sì che il rendering diventi impossibile. Lo stato perso è caratterizzato dall'errore invisibile all'utente di tutte le operazioni di rendering, il che significa che i metodi di rendering possono restituire codici di esito positivo anche se le operazioni di rendering hanno esito negativo. In questo caso, il codice di errore D3DERR_DEVICELOST viene restituito da IDirect3DDevice9::P resent.

Per impostazione predefinita, non viene specificato il set completo di scenari che possono causare la perdita di un dispositivo. Alcuni esempi tipici includono la perdita di stato attivo, ad esempio quando l'utente preme ALT+TAB o quando viene inizializzata una finestra di dialogo di sistema. I dispositivi possono anche essere persi a causa di un evento di risparmio energia o quando un'altra applicazione presuppone un'operazione a schermo intero. Inoltre, qualsiasi errore da IDirect3DDevice9::Reset inserisce il dispositivo in uno stato perso.

Tutti i metodi che derivano da IUnknown sono garantiti per funzionare dopo la perdita di un dispositivo. Dopo la perdita del dispositivo, ogni funzione include in genere le tre opzioni seguenti:

  • Esito negativo con D3DERR_DEVICELOST: significa che l'applicazione deve riconoscere che il dispositivo è andato perso, in modo che l'applicazione identifichi che qualcosa non accade come previsto.
  • Errore invisibile all'utente, restituzione di S_OK o di altri codici restituiti: se una funzione ha esito negativo in modo invisibile all'utente, l'applicazione in genere non può distinguere tra il risultato di "esito positivo" e un "errore invisibile all'utente".
  • La funzione restituisce un codice restituito.
Differenze tra Direct3D 9 e Direct3D 9Ex:
Un dispositivo Direct3D 9 restituisce D3DERR_DEVICELOST. Dopo che è stato restituito da IDirect3DDevice9::P resent, il comportamento di emulazione non funziona più e tutte le chiamate future avranno esito negativo finché il dispositivo non viene reimpostato correttamente.
Un dispositivo Direct3D 9Ex non restituisce mai D3DERR_DEVICELOST, ma può restituire nuovi messaggi di stato (vedere modifiche al comportamento del dispositivo).

 

Risposta a un dispositivo perso

Un dispositivo perso deve ricreare le risorse (incluse le risorse di memoria video) dopo che è stato reimpostato. Se un dispositivo viene perso, l'applicazione esegue una query sul dispositivo per verificare se può essere ripristinata nello stato operativo. In caso contrario, l'applicazione attende fino a quando il dispositivo non può essere ripristinato.

Se il dispositivo può essere ripristinato, l'applicazione prepara il dispositivo eliminando tutte le risorse di memoria video e tutte le catene di scambio. L'applicazione chiama quindi il metodo IDirect3DDevice9::Reset. Reset è l'unico metodo che ha un effetto quando un dispositivo viene perso ed è l'unico metodo in base al quale un'applicazione può modificare il dispositivo da uno stato perso a uno stato operativo. La reimpostazione avrà esito negativo a meno che l'applicazione non rilasci tutte le risorse allocate in D3DPOOL_DEFAULT, incluse quelle create dai metodi IDirect3DDevice9::CreateRenderTarget e IDirect3DDevice9::CreateDepthStencilSur face.

Nella maggior parte dei casi, le chiamate ad alta frequenza di Direct3D non restituiscono informazioni sull'eventuale perdita del dispositivo. L'applicazione può continuare a chiamare metodi di rendering, ad esempio IDirect3DDevice9::D rawPrimitive, senza ricevere notifica di un dispositivo perso. Internamente, queste operazioni vengono rimosse fino a quando il dispositivo non viene reimpostato sullo stato operativo.

L'applicazione può determinare cosa fare in caso di un dispositivo perso eseguendo una query sul valore restituito del metodo IDirect3DDevice9::TestCooperativeLevel.

Operazioni di blocco

Internamente, Direct3D funziona abbastanza per garantire che un'operazione di blocco abbia esito positivo dopo la perdita di un dispositivo. Tuttavia, non è garantito che i dati della risorsa di memoria video saranno accurati durante l'operazione di blocco. È garantito che non venga restituito alcun codice di errore. In questo modo le applicazioni possono essere scritte senza preoccuparsi della perdita del dispositivo durante un'operazione di blocco.

Risorse

Le risorse possono usare la memoria video. Poiché un dispositivo perso viene disconnesso dalla memoria video di proprietà della scheda, non è possibile garantire l'allocazione della memoria video quando il dispositivo viene perso. Di conseguenza, tutti i metodi di creazione delle risorse vengono implementati per avere esito positivo restituendo D3D_OK, ma allocano in realtà solo la memoria fittizia del sistema. Poiché qualsiasi risorsa di memoria video deve essere eliminata definitivamente prima che il dispositivo venga ridimensionato, non è presente alcun problema relativo all'allocazione eccessiva della memoria video. Queste superfici fittizie consentono il funzionamento normale delle operazioni di blocco e copia finché l'applicazione non chiama IDirect3DDevice9::P resent e scopre che il dispositivo è andato perso.

È necessario rilasciare tutta la memoria video prima che un dispositivo possa essere reimpostato da uno stato perso a uno stato operativo. Ciò significa che l'applicazione deve rilasciare tutte le catene di scambio create con IDirect3DDevice9::CreateAdditionalSwapChain e tutte le risorse inserite nella classe di memoria D3DPOOL_DEFAULT. L'applicazione non deve rilasciare risorse nelle classi di memoria D3DPOOL_MANAGED o D3DPOOL_SYSTEMMEM. Altri dati sullo stato vengono eliminati automaticamente dalla transizione a uno stato operativo.

Si consiglia di sviluppare applicazioni con un singolo percorso di codice per rispondere alla perdita del dispositivo. È probabile che questo percorso di codice sia simile, se non identico, al percorso del codice eseguito per inizializzare il dispositivo all'avvio.

Dati recuperati

Direct3D consente alle applicazioni di convalidare gli stati di trama e rendering in base al rendering a passaggio singolo dall'hardware usando IDirect3DDevice9::ValidateDevice. Questo metodo, in genere richiamato durante l'inizializzazione dell'applicazione, restituirà D3DERR_DEVICELOST se il dispositivo è stato perso.

Direct3D consente anche alle applicazioni di copiare immagini generate o scritte in precedenza da risorse di memoria video a risorse di memoria di sistema non volatile. Poiché le immagini di origine di tali trasferimenti potrebbero andare perse in qualsiasi momento, Direct3D consente l'esito negativo di tali operazioni di copia quando il dispositivo viene perso.

Per quanto riguarda le query asincrone, IDirect3DQuery9::GetData restituisce D3DERR_DEVICELOST se viene specificato il flag FLUSH, per indicare all'applicazione che IDirect3DQuery9::GetData non restituirà mai S_OK.

L'operazione di copia, IDirect3DDevice9::GetFrontBufferData, può avere esito negativo con D3DERR_DEVICELOST poiché non è presente alcuna superficie primaria quando il dispositivo viene perso. IDirect3DDevice9::CreateAdditionalSwapChain può avere esito negativo anche con D3DERR_DEVICELOST perché non è possibile creare un buffer nascosto quando il dispositivo viene perso. Si noti che questi casi sono l'unica istanza di D3DERR_DEVICELOST all'esterno del IDirect3DDevice9::P resent, IDirect3DDevice9::TestCooperativeLevele IDirect3DDevice9::Reset metodi.

Shader programmabili

In Direct3D 9, i vertex shader e i pixel shader non devono essere ricreati dopo la reimpostazione. Saranno ricordati. Nelle versioni precedenti di DirectX, un dispositivo perso richiede la ricreazione degli shader.

dispositivi Direct3D