Condividi tramite


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 e 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 esamina le associazioni degli obiettivi 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. Tuttavia, un descrittore può codificare riferimenti ad altre allocazioni di cui l'applicazione gestisce la 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 se viene dichiarata come non residente.

Il modo principale per usare i descrittori consiste nell'inserirli negli heap di descrittori, che costituiscono la memoria di supporto per i descrittori.

Maniglie del descrittore

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

Gli handle CPU sono destinati all'uso immediato, come la copia in cui devono essere identificati sia la sorgente che la destinazione. Subito dopo l'uso(ad esempio, una chiamata a ID3D12GraphicsCommandList::OMSetRenderTargets), possono essere riutilizzati 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 i comandi che li referenziano.

Per creare un handle descrittore per l'inizio di un heap, dopo aver creato il descrittore dell'heap 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:

È sicuro eseguire l'offset di una posizione iniziale con un numero di incrementi, copiare gli handle e passare gli 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 di supporto, con membri per l'inizializzazione, per semplificare la gestione degli handle.

Descrittori Nulli

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 ad una risorsa quando si accede da uno shader.

Il resto del descrittore deve essere popolato il più possibile. Ad esempio, nel caso degli Shader Resource Views (SRV), il descrittore può essere usato per distinguere il tipo di visualizzazione delle risorse, come 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 associata, 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 view description pDesc, impostare una configurazione che funzionerebbe se la risorsa non fosse Null (in caso contrario potrebbe verificarsi un arresto anomalo in alcuni 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 vista 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 includesse 14 mips, allora la vista includerebbe 14 mips. Il caso predefinito riguarda la corrispondenza più ovvia 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 struttura di accelerazione del ray tracing, perché il parametro pResource specificato deve essere NULL, e la posizione deve essere passata tramite un D3D12_RAYTRACING_ACCELERATION_STRUCTURE_SRV.

descrittori