Livelli API (Direct3D 10)
Il runtime Direct3D 10 viene costruito con i livelli, a partire dalle funzionalità di base e dalla creazione di funzionalità facoltative e assist per sviluppatori in livelli esterni.
Livello principale
Il livello principale esiste per impostazione predefinita; fornendo un mapping molto sottile tra l'API e il driver di dispositivo, riducendo al minimo l'overhead per le chiamate ad alta frequenza. Poiché il livello principale è essenziale per le prestazioni, esegue solo la convalida critica.
I livelli rimanenti sono facoltativi. Come regola generale, i livelli aggiungono funzionalità, ma non modificano il comportamento esistente. Ad esempio, le funzioni di base avranno gli stessi valori restituiti indipendentemente dal livello di debug di cui viene creata un'istanza, anche se è possibile fornire un output di debug aggiuntivo se viene creata un'istanza del livello di debug.
Creare livelli quando un dispositivo viene creato chiamando D3D10CreateDevice e specificando uno o più valori D3D10_CREATE_DEVICE_FLAG.
Livello di debug
Il livello di debug offre un'ampia convalida aggiuntiva di parametri e coerenza, ad esempio la convalida del collegamento dello shader e l'associazione di risorse, la convalida della coerenza dei parametri e la segnalazione delle descrizioni degli errori. L'output generato dal livello di debug è costituito da una coda di stringhe accessibili tramite l'interfaccia ID3D10InfoQueue (vedere Personalizzare l'output di debug con ID3D10InfoQueue (Direct3D 10)). Gli errori generati dal livello principale vengono evidenziati con avvisi dal livello di debug.
Per creare un dispositivo che supporti il livello di debug, è necessario installare DirectX SDK (per ottenere D3D10SDKLayers.DLL) e quindi specificare il flag D3D10_CREATE_DEVICE_DEBUG quando si chiama D3D10CreateDevice. Naturalmente, l'esecuzione di un'applicazione con il livello di debug sarà notevolmente più lenta. Per abilitare/disabilitare i messaggi di debug per le API D3DX10, chiamare D3DX10DebugMute.
Quando il livello di debug elenca le perdite di memoria, restituisce un elenco di puntatori all'interfaccia oggetto insieme ai relativi nomi descrittivi. Il nome descrittivo predefinito è "<senza nome>". È possibile impostare il nome descrittivo usando il metodo ID3D10DeviceChild::SetPrivateData e il GUID WKPDID_D3DDebugObjectName in D3Dcommon.h. Ad esempio, per denominare pTexture con un nome SDKLayer di mytexture.jpg, usare il codice seguente:
const char c_szName[] = "mytexture.jpg";
pTexture->SetPrivateData( WKPDID_D3DDebugObjectName, sizeof( c_szName ) - 1, c_szName );
In genere, è consigliabile compilare queste chiamate dalla versione di produzione.
Livello switch-to-reference
Questo livello consente a un'applicazione di eseguire la transizione tra un dispositivo hardware (HAL) e un riferimento o un dispositivo software (REF). Per cambiare un dispositivo, è prima necessario creare un dispositivo che supporti il livello switch-to-reference (vedere D3D10CreateDevice) e quindi chiamare ID3D10SwitchToRef::SetUseRef.
Tutti gli stati del dispositivo, le risorse e gli oggetti vengono mantenuti tramite questa transizione del dispositivo. Tuttavia, a volte non è possibile associare esattamente i dati delle risorse. Ciò è dovuto al fatto che alcune informazioni sono disponibili per un dispositivo hardware che non è disponibile per un dispositivo di riferimento.
Praticamente tutte le applicazioni in tempo reale usano l'implementazione HAL della pipeline. Quando la pipeline passa da un dispositivo hardware a un dispositivo di riferimento, le operazioni di rendering vengono eseguite contemporaneamente sia nell'hardware che nel software. Poiché il rendering del dispositivo software richiederà che le risorse vengano scaricate nella memoria di sistema. Ciò potrebbe richiedere la rimozione di altre risorse memorizzate nella cache nella memoria di sistema per liberare spazio.
Nota
Questa funzionalità switch-to-reference-layer è supportata solo in Direct3D 10 e Direct3D 10.1 e non è più supportata in Direct3D 11 e versioni successive.
livello Thread-Safe
Questo livello è progettato per consentire alle applicazioni multithread di accedere al dispositivo da più thread.
Un'applicazione Direct3D 10 può controllare una sincronizzazione dei dispositivi usando le funzioni del dispositivo. Ciò consente a un'applicazione di abilitare/disabilitare sezioni critiche (abilitazione/disabilitazione temporanea della protezione multithreading) e di accettare/rilasciare un blocco di sezione critica su più punti di ingresso api Direct3D 10. Il livello thread-safe è abilitato per impostazione predefinita. Per le applicazioni a thread singolo, il livello thread-safe non ha alcun impatto sulle prestazioni.
Differenze tra Direct3D 9 e Direct3D 10:
- A differenza di Direct3D 9, per impostazione predefinita l'API Direct3D 10 è completamente thread-safe.
Argomenti correlati