Livelli API (Direct3D 10)

Il runtime Direct3D 10 viene costruito con livelli, a partire dalla funzionalità di base e dalla creazione di funzionalità facoltative e di assistenza per sviluppatori nei 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 il sovraccarico 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 dall'istanza del livello di debug, anche se l'output di debug aggiuntivo può essere fornito se il livello di debug viene creata un'istanza.

Creare livelli quando un dispositivo viene creato chiamando D3D10CreateDevice e fornendo uno o più valori D3D10_CREATE_DEVICE_FLAG .

Livello di debug

Il livello di debug offre una convalida completa di parametri e coerenza aggiuntivi, ad esempio convalidando il collegamento shader e l'associazione di risorse, convalidando la coerenza dei parametri e segnalando le descrizioni degli errori. L'output generato dal livello di debug è costituito da una coda di stringhe accessibili usando 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 supporta il livello di debug, è necessario installare DirectX SDK (per ottenere D3D10SDKLayers.DLL) e quindi specificare il flag di 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 perdite di memoria, restituisce un elenco di puntatori dell'interfaccia a oggetti 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 assegnare un nome 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, è necessario compilare queste chiamate fuori dalla versione di produzione.

Livello di riferimento da commutatore a riferimento

Questo livello consente a un'applicazione di passare da un dispositivo hardware (HAL) a un dispositivo software o di riferimento (REF). Per cambiare un dispositivo, è prima necessario creare un dispositivo che supporta il livello di riferimento da commutatore (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 corrispondere esattamente ai 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 viene passata da un dispositivo hardware a un dispositivo di riferimento, le operazioni di rendering vengono eseguite simultaneamente in hardware e software. Poiché il rendering del dispositivo software richiederà che le risorse vengano scaricate nella memoria di sistema. Ciò può richiedere che altre risorse memorizzate nella cache nella memoria di sistema vengano rimosse per rendere disponibile la stanza.

Nota

Questa funzionalità a livello di riferimento è supportata solo in Direct3D 10 e Direct3D 10.1 e non è più supportata nelle versioni Direct3D 11 e successive.

 

livello Thread-Safe

Questo livello è progettato per consentire alle applicazioni multi thread 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 le sezioni critiche (abilitando/disabilitando temporaneamente la protezione multithreading) e accettando/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, l'API Direct3D 10 è predefinita completamente thread-safe.

 

Funzionalità API (Direct3D 10)