Condividi tramite


Uso dei descrittori direttamente nella firma radice

Per evitare la necessità di passare attraverso un heap del descrittore, è possibile inserire un descrittore direttamente nella firma radice. Questi descrittori occupano molto spazio nella firma radice (vedere limiti di firma radice ), quindi è consigliabile usarli con moderazione.

Un esempio di utilizzo consiste nell'inserire nel layout radice una visualizzazione buffer costante (CBV) che cambia per disegno. In questo modo, lo spazio dell'heap del descrittore non deve essere allocato dall'applicazione per ogni disegno ed evita la necessità di puntare una tabella descrittore verso la nuova posizione nell'heap del descrittore. Inserendo qualcosa nella firma radice, l'applicazione si limita a consegnare la responsabilità del controllo delle versioni al driver; ma questa è l'infrastruttura che i driver hanno già.

Per il rendering che usa poche risorse, l'uso della tabella o dell'heap del descrittore potrebbe non essere necessario se tutti i descrittori necessari possono essere inseriti direttamente nella firma radice.

Questi sono gli unici tipi di descrittori supportati nella firma radice.

  • Visualizzazione buffer costante (CBV).
  • Viste delle risorse shader (SRV) / viste di accesso non ordinate (UAV) di risorse del buffer in cui la conversione del formato non è necessaria (buffer non tipizzati). Alcuni esempi di buffer non tipizzato che possono essere associati ai descrittori radice includono StructuredBuffer<type>, RWStructuredBuffer<type>, ByteAddressBuffer e RWByteAddressBuffer. I buffer tipizzati, ad esempio Buffer<uint> e Buffer<float2>, non possono.
  • SRV delle strutture di accelerazione del raytracing, nelle firme radice locali o globali.

Un UAV nella radice non può avere contatori associati. I descrittori nella firma radice vengono visualizzati come singoli descrittori separati, ma non possono essere indicizzati in modo dinamico.

struct SceneData
{
   uint foo;
   float bar[2];
   int moo;
};
ConstantBuffer<SceneData> mySceneData : register(b6);

Nell'esempio precedente, mySceneData non può essere dichiarato come array, se dovrà essere associato a un descrittore nella root signature come in cbuffer mySceneData[2]. Ciò è dovuto al fatto che l'indicizzazione tra descrittori non è supportata nella firma radice. Se lo si desidera, è possibile definire singoli buffer costanti separati e definirli ognuno come voce separata nella firma radice. Si noti che all'interno di mySceneData precedente è presente una matrice bar[2]. L'indicizzazione dinamica all'interno del buffer costante è valida: un descrittore nella firma radice si comporta esattamente come farebbe lo stesso descrittore se fosse stato accesso tramite un heap di descrittori. Ciò è in contrasto con l'inserimento diretto delle costanti nella firma radice, che appare anche come un buffer costante, tranne con il vincolo che l'indicizzazione dinamica all'interno delle costanti inserite non è consentita, quindi bar[2] non sarebbe permesso lì.

Queste API (dall'interfaccia ID3D12GraphicsCommandList) sono destinate all'impostazione dei descrittori direttamente nella firma radice.

Nota

Non esiste alcun concetto di matrice di descrittori radice in Direct3D 12. Le matrici del descrittore sono supportate solo negli heap dei descrittori.