Uso dei descrittori direttamente nella firma radice
Per evitare la necessità di passare attraverso un heap 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. Questo significa che lo spazio dell'heap del descrittore non deve essere allocato dall'applicazione per disegno e salva una tabella del descrittore nella nuova posizione nell'heap del descrittore. Inserendo qualcosa nella firma radice, l'applicazione sta semplicemente consegnando la responsabilità del controllo delle versioni al driver; ma questa è l'infrastruttura che i driver hanno già.
Per il rendering che usa pochissime 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).
- Visualizzazioni 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 tipizzati che possono essere associati ai descrittori radice includono
StructuredBuffer<type>
,RWStructuredBuffer<type>
ByteAddressBuffer
eRWByteAddressBuffer
. I buffer tipizzato,Buffer<uint>
ad esempio eBuffer<float2>
non possono. - SRV delle strutture di accelerazione 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, che non possono essere indicizzati in modo dinamico.
struct SceneData
{
uint foo;
float bar[2];
int moo;
};
ConstantBuffer<SceneData> mySceneData : register(b6);
Nell'esempio mySceneData
precedente non può essere dichiarato come matrice, come se cbuffer mySceneData[2]
fosse mappato a un descrittore nella firma radice. Questo perché 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 in mySceneData
precedenza è presente una matrice bar[2]
. L'indicizzazione dinamica all'interno del buffer costante è valida. Un descrittore nella firma radice si comporta esattamente come lo stesso descrittore si comporta se è stato eseguito l'accesso tramite un heap del descrittore. Ciò è in contrasto con le costanti inlining direttamente nella firma radice, che appare anche come un buffer costante, ad eccezione del vincolo che l'indicizzazione dinamica all'interno delle costanti inlined non è consentita, quindi bar[2]
non sarebbe consentita.
Queste API (dall'interfaccia ID3D12GraphicsCommandList ) sono destinate all'impostazione dei descrittori direttamente nella firma radice.
- SetComputeRootConstantBufferView
- SetGraphicsRootConstantBufferView
- SetComputeRootShaderResourceView
- SetGraphicsRootShaderResourceView
- SetComputeRootUnorderedAccessView
- SetGraphicsRootUnorderedAccessView
Nota
Non esiste alcun concetto di matrice di descrittore radice in Direct3D 12. Le matrici di descrittore sono supportate solo negli heap del descrittore.