Dispositivi perduti
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.
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 energetico o quando un'altra applicazione presuppone un'operazione a schermo intero. Inoltre, eventuali errori durante la reimpostazione di un dispositivo comportano la perdita del dispositivo.
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 errore "dispositivo perso": significa che l'applicazione deve riconoscere che il dispositivo è andato perso, in modo che l'applicazione identifichi che qualcosa non accade come previsto.
- Esito negativo invisibile all'utente, restituendo S_OK o qualsiasi altro codice restituito: 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".
- Restituisce un codice restituito.
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. La reimpostazione è l'unica procedura che ha effetto quando un dispositivo viene perso ed è l'unico modo in cui 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, incluse le destinazioni di rendering e le superfici depth-stencil.
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 richiamare i metodi di rendering, senza ricevere notifica di un dispositivo perso. Internamente, queste operazioni vengono rimosse fino a quando il dispositivo non viene reimpostato sullo stato operativo.
Operazioni di bloccaggio
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, ma in realtà allocano 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 alle operazioni di blocco e copia di funzionare normalmente fino a quando l'applicazione non rileva 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. 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 texture e di rendering rispetto al rendering a passaggio singolo dall'hardware.
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.
Le operazioni di copia possono non riuscire perché non esiste una superficie primaria quando il dispositivo viene perso. La creazione di catene di scambio può anche non riuscire perché non è possibile creare un buffer nascosto quando il dispositivo viene perso.
Argomenti correlati