Condividi tramite


Dispositivi persi (Direct3D 9)

Un dispositivo Direct3D può essere in uno stato operativo o uno stato perso. Lo stato operativo è lo stato normale del dispositivo in cui il dispositivo viene eseguito 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, causa l'impossibilità del rendering. 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 questa situazione, il codice di errore D3DERR_DEVICELOST viene restituito da IDirect3DDevice9::P resent.

Per progettazione, il set completo di scenari che possono causare la perdita di un dispositivo non è specificato. Alcuni esempi tipici includono la perdita dello 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 ha in genere le tre opzioni seguenti:

  • Errore con D3DERR_DEVICELOST: ciò significa che l'applicazione deve riconoscere che il dispositivo è stato perso, in modo che l'applicazione identifica che qualcosa non avviene come previsto.
  • Errore invisibile all'utente, restituzione di S_OK o di altri codici restituiti: se una funzione ha esito negativo, 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. Una volta restituito da IDirect3DDevice9::P resent, il comportamento di emulazione non funziona più e tutte le chiamate future non 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 la reimpostazione. Se un dispositivo viene perso, l'applicazione esegue una query sul dispositivo per verificare se può essere ripristinata allo 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 distruggendo 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 operativo perso a uno stato operativo. La reimpostazione avrà esito negativo a meno che l'applicazione non rilascia tutte le risorse allocate in D3DPOOL_DEFAULT, incluse quelle create dai metodi IDirect3DDevice9::CreateRenderTarget e IDirect3DDevice9::CreateDepthStencilSurface .

Per la maggior parte, le chiamate ad alta frequenza di Direct3D non restituiscono informazioni sul fatto che il dispositivo sia stato perso. 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 allo stato operativo.

L'applicazione può determinare cosa fare per individuare 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 avrà 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 verrà restituito alcun codice di errore. Ciò consente alle applicazioni di essere scritte senza preoccupazione per la perdita del dispositivo durante un'operazione di blocco.

Risorse

Le risorse possono usare 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 allocare in realtà solo memoria di sistema fittizia. Poiché qualsiasi risorsa di memoria video deve essere eliminata prima che il dispositivo venga ridimensionato, non esiste alcun problema di sovra-allocazione della memoria video. Queste superfici fittizie consentono alle operazioni di blocco e copia di funzionare normalmente finché l'applicazione chiama IDirect3DDevice9::P resent e rileva che il dispositivo è stato perso.

Tutte le memoria video devono essere rilasciate prima che un dispositivo possa essere reimpostato da uno stato perso a uno stato operativo. Ciò significa che l'applicazione deve rilasciare qualsiasi catena di scambio creata 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. Questo percorso di codice è probabilmente 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 di rendering rispetto al rendering singolo passando dall'hardware usando IDirect3DDevice9::ValidateDevice. Questo metodo, che viene 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 nonvolatile. Poiché le immagini di origine di tali trasferimenti potrebbero essere perse in qualsiasi momento, Direct3D consente a tali operazioni di copia di non riuscire 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ò non riuscire con D3DERR_DEVICELOST poiché non è presente alcuna superficie primaria quando il dispositivo viene perso. IDirect3DDevice9::CreateAdditionalSwapChain può anche non riuscire con D3DERR_DEVICELOST perché non è possibile creare un buffer back quando il dispositivo viene perso. Si noti che questi casi sono l'unica istanza di D3DERR_DEVICELOST al di fuori dei metodi IDirect3DDevice9::P resent, IDirect3DDevice9::TestCooperativeLevel e IDirect3DDevice9::Reset.

Shader programmabili

In Direct3D 9, i vertex shader e gli shader pixel non devono essere ricreati dopo la reimpostazione. Verranno ricordati. Nelle versioni precedenti di DirectX, un dispositivo perso deve essere ricreato.

Dispositivi Direct3D