Share via


Panoramica dei descrittori

I descrittori vengono creati dalle chiamate API e identificano le risorse.

Dati del descrittore

Un descrittore è un blocco di dati relativamente piccolo che descrive completamente un oggetto per la GPU, in un formato opaco specifico della GPU. Esistono diversi tipi di descrittori, ovvero le visualizzazioni di destinazione di rendering (RTV), le visualizzazioni degli stencil di profondità (DSV), le viste delle risorse shader (SRV), le visualizzazioni di accesso non ordinate (UAV), le visualizzazioni buffer costanti (CBV) e i campionatori.

I descrittori variano in base alle dimensioni, a seconda dell'hardware GPU. È possibile eseguire query sulle dimensioni di un SRV, UAV o CBV chiamando ID3D12Device::GetDescriptorHandleIncrementSize. I descrittori sono visualizzati in questa documentazione come unità indivisibili; ecco un esempio.

srv, cbv, uav, and sampler

I descrittori vengono creati dalle chiamate API e includono informazioni come la risorsa e le mappe mip che si vuole che il descrittore contenga.

Il driver non tiene traccia o contiene riferimenti ai descrittori, spetta all'app assicurarsi che il tipo di descrittore corretto sia in uso e che le informazioni siano aggiornate. C'è una piccola eccezione a questo; il driver controlla i binding di destinazione di rendering per garantire che le catene di scambio funzionino correttamente.

I descrittori di oggetti non devono essere liberati o rilasciati. I driver non allegano allocazioni alla creazione di un descrittore. Un descrittore può tuttavia codificare riferimenti ad altre allocazioni per le quali l'applicazione è proprietaria della durata. Ad esempio, un descrittore per un SRV deve contenere l'indirizzo virtuale della risorsa D3D (ad esempio una trama) a cui fa riferimento il SRV. È responsabilità dell'applicazione assicurarsi che non usi un descrittore SRV quando la risorsa D3D sottostante da cui dipende è stata eliminata o viene modificata , ad esempio essere dichiarata come non rientrata.

Il modo principale per usare i descrittori consiste nell'inserirli negli heap del descrittore, che eseguono il backup della memoria per i descrittori.

Handle del descrittore

Un handle descrittore è l'indirizzo univoco del descrittore. È simile a un puntatore, ma è opaco perché l'implementazione è specifica dell'hardware. L'handle è univoco tra gli heap del descrittore, quindi, ad esempio, una matrice di handle può fare riferimento ai descrittori in più heap.

Gli handle cpu sono destinati all'uso immediato, ad esempio la copia in cui devono essere identificati sia l'origine che la destinazione. Subito dopo l'uso(ad esempio, una chiamata a ID3D12GraphicsCommandList::OMSetRenderTargets), possono essere riutilizzate o il relativo heap sottostante può essere eliminato.

Gli handle GPU non sono destinati all'uso immediato, ovvero identificano le posizioni da un elenco di comandi, per l'uso in fase di esecuzione della GPU. Devono essere mantenuti fino a quando non sono stati eseguiti completamente elenchi di comandi che fanno riferimento a tali elenchi.

Per creare un handle descrittore per l'inizio di un heap, dopo aver creato l'heap del descrittore stesso, chiamare uno dei metodi seguenti:

Questi metodi restituiscono le strutture seguenti:

Poiché le dimensioni dei descrittori variano in base all'hardware, per ottenere l'incremento tra ogni descrittore in un heap usare:

È possibile eseguire l'offset di una posizione iniziale con un numero di incrementi, copiare handle e passare handle nelle chiamate API. Non è sicuro dereferenziare un handle come se fosse un puntatore della CPU valido, né analizzare i bit all'interno di un handle.

Sono state aggiunte alcune strutture helper, con membri di inizializzazione, per semplificare la gestione degli handle.

Descrittori Null

Quando si creano descrittori tramite chiamate API, le applicazioni passano NULL per il puntatore di risorse nella definizione del descrittore per ottenere l'effetto di nulla associato quando si accede da uno shader.

Il resto del descrittore deve essere popolato il più possibile. Ad esempio, nel caso di visualizzazioni risorse shader (SRV), il descrittore può essere usato per distinguere il tipo di visualizzazione (Texture1D, Texture2D e così via). I parametri numerici nel descrittore di visualizzazione, ad esempio il numero di mipmap, devono essere impostati su valori validi per una risorsa.

In molti casi, esiste un comportamento definito per l'accesso a una risorsa non associato, ad esempio srv che restituiscono valori predefiniti. Tali valori verranno rispettati quando si accede a un descrittore NULL, purché il tipo di accesso allo shader sia compatibile con il tipo di descrittore. Ad esempio, se uno shader prevede uno SRV Texture2D e accede a un SRV NULL definito come Texture1D, il comportamento non è definito e potrebbe comportare la reimpostazione del dispositivo.

In sintesi, per creare un descrittore Null, passare null per il parametro pResource durante la creazione della vista con metodi come CreateShaderResourceView. Per il parametro della descrizione della visualizzazione pDesc, impostare una configurazione che funzionerebbe se la risorsa non era Null (in caso contrario potrebbe verificarsi un arresto anomalo in un hardware).

I descrittori radice, tuttavia, non devono essere impostati su Null.

Nell'hardware di livello 1 (vedere Livelli hardware, tutti i descrittori associati (tramite tabelle descrittori) devono essere inizializzati, come descrittori reali o descrittori Null, anche se non accessibili dall'hardware, altrimenti il comportamento non è definito.

Nell'hardware di Livello 2, questo vale per i descrittori CBV e UAV associati, ma non ai descrittori SRV.

Nell'hardware di livello 3 non è prevista alcuna restrizione, a condizione che i descrittori non inizializzati non siano mai accessibili.

Descrittori predefiniti

Per creare un descrittore predefinito per una visualizzazione specifica, passare un parametro pResource valido al metodo di creazione della vista ,ad esempio CreateShaderResourceView, ma passare NULL per il parametro pDesc. Ad esempio, se la risorsa contiene 14 mips, la vista conterrà 14 mips. Il caso predefinito riguarda il mapping più ovvio di una risorsa a una visualizzazione. Ciò richiede che la risorsa venga allocata con un nome di formato completo, ad esempio DXGI_FORMAT_R8G8B8A8_UNORM_SRGB anziché DXGI_FORMAT_R8G8B8A8_TYPELESS.

I descrittori predefiniti non possono essere usati con una visualizzazione struttura di accelerazione raytracing, perché il parametro pResource specificato deve essere NULL e la posizione deve essere passata tramite un D3D12_RAYTRACING_ACCELERATION_STRUCTURE_SRV.

Descrittori