Heap del descrittore visibile dello shader

Gli heap del descrittore visibile dello shader sono heap descrittori a cui è possibile fare riferimento dagli shader tramite tabelle descrittori.

Panoramica

Gli heap descrittori a cui è possibile fare riferimento gli shader tramite tabelle descrittore sono disponibili in un paio di versioni: un tipo heap, D3D12_SRV_UAV_CBV_DESCRIPTOR_HEAP, può contenere visualizzazioni risorse shader, viste di accesso non ordinate e visualizzazioni buffer costante, tutte combinate. Qualsiasi posizione specificata nell'heap può essere qualsiasi tipo di descrittore elencato. Un altro tipo di heap, D3D12_DESCRIPTOR_HEAP_TYPE_SAMPLER, archivia solo i campionatori, riflettendo il fatto che per la maggior parte dell'hardware, i campionatori vengono gestiti separatamente da SRV, UAV, CBV.

Gli heap descrittori di questi tipi possono essere richiesti per essere visibili o meno quando viene creato l'heap (quest'ultimo, non visibile, può essere utile per i descrittori di staging nella CPU). Quando richiesto di essere visibile allo shader, ognuno dei tipi heap precedenti può avere un limite di dimensioni hardware per qualsiasi allocazione dell'heap del descrittore singolo.

Le applicazioni possono creare un numero qualsiasi di heap del descrittore e gli heap non visibili dello shader non sono vincolati alle dimensioni. Se un heap descrittore visibile creato dall'applicazione è inferiore al limite di dimensioni hardware, il driver può scegliere di allocare in modo secondario l'heap del descrittore da un heap del descrittore sottostante più grande in modo che più heap del descrittore API si adattino a un heap del descrittore hardware. Il motivo è che per alcuni hardware, il passaggio tra gli heap del descrittore hardware durante l'esecuzione richiede un'attesa gpu per l'inattività (per assicurarsi che i riferimenti GPU all'heap descrittore precedentemente siano completati). Se tutti gli heap descrittori creati da un'applicazione rientrano nelle capacità massime dell'heap hardware applicabile, non si verificheranno attese di questo tipo durante il cambio di heap del descrittore API durante il rendering. Le applicazioni devono consentire la possibilità, tuttavia, che il passaggio dell'heap del descrittore corrente potrebbe comportare un'attesa per l'inattività.

Per evitare di essere interessati da questa possibile attesa per l'inattività nell'opzione dell'heap del descrittore, le applicazioni possono sfruttare le interruzioni nel rendering che causerebbero l'inattività della GPU per altri motivi, perché il tempo necessario per eseguire le opzioni dell'heap del descrittore, poiché un'attesa per l'inattività avviene comunque.

Il meccanismo e la semantica per identificare gli heap del descrittore negli shader durante la registrazione dell'elenco di comandi o del bundle sono descritti nella guida di riferimento all'API.

un esempio

L'immagine seguente mostra due heap descrittori che fanno riferimento a due trame 2D separate archiviate in due slot di un heap predefinito di grandi dimensioni. È possibile accedere all'heap del descrittore visibile tramite la pipeline grafica (inclusi gli shader) e quindi la trama 2D è disponibile per la pipeline.

heap del descrittore visibile e non visibile

Nota

Spesso esiste un limite per l'hardware GPU della quantità di memoria locale gpu scrivibile dalla CPU (detta memoria combinata di scrittura) per gli heap del descrittore. In genere questo limite è di circa 96 MB per tutti i processi. Un heap del descrittore di un milione di membri, con descrittori di 32byte, utilizzerebbe ad esempio 32 MB. Se necessario, il driver eseguirà il fallback sulla memoria di sistema, anche se è consigliabile non creare un numero elevato di heap di descrittore di grandi dimensioni.

 

Heap descrittore