Condividi tramite


Mapping inclusi in un pool di riquadri

Quando viene creata una risorsa con il flag D3D11_RESOURCE_MISC_TILED , i riquadri che costituiscono la risorsa provengono da posizioni in un pool di riquadri. Un pool di riquadri è un pool di memoria (supportato da una o più allocazioni dietro le quinte - non visualizzato dall'applicazione). Il sistema operativo e il driver di visualizzazione gestiscono questo pool di memoria e il footprint di memoria viene facilmente compreso da un'applicazione. Le risorse riquadri mappano le aree 64 KB puntando alle posizioni in un pool di riquadri. Un fallout di questa configurazione consente a più risorse di condividere e riutilizzare gli stessi riquadri e anche per il riutilizzo degli stessi riquadri in posizioni diverse all'interno di una risorsa, se desiderato.

Il costo per la flessibilità di popolare i riquadri per una risorsa fuori da un pool di riquadri consiste nel fatto che la risorsa deve eseguire il lavoro di definizione e gestione del mapping dei riquadri nel pool di riquadri rappresentano i riquadri necessari per la risorsa. È possibile modificare i mapping dei riquadri. Inoltre, non tutti i riquadri in una risorsa devono essere mappati alla volta; una risorsa può avere mapping NULL . Un mapping NULL definisce un riquadro non disponibile dal punto di vista della risorsa che lo accede.

È possibile creare più pool di riquadri e qualsiasi numero di risorse riquadri può eseguire il mapping in qualsiasi pool di riquadri specificato contemporaneamente. I pool di riquadri possono anche essere cresciuti o ridotti. Per altre informazioni, vedere Ridimensionamento del pool di riquadri. Un vincolo esistente per semplificare l'implementazione del driver di visualizzazione e del runtime consiste nel fatto che una determinata risorsa riquadri può avere mapping solo in un pool di riquadri alla volta (anziché avere il mapping simultaneo a più pool di riquadri).

La quantità di spazio di archiviazione associato a una risorsa riquadri stessa (ovvero la memoria indipendente del pool di riquadri) è approssimativamente proporzionale al numero di riquadri effettivamente mappati al pool in qualsiasi momento. In hardware, questo fatto si riduce al ridimensionamento del footprint di memoria per l'archiviazione tabelle di pagine con la quantità di riquadri mappati (ad esempio, usando uno schema di tabella di pagine multilivello come appropriato).

Il pool di riquadri può essere considerato come un'astrazione interamente software che consente alle applicazioni Direct3D di essere in grado di programmare in modo efficace le tabelle delle pagine nell'unità di elaborazione grafica (GPU) senza dover conoscere i dettagli di implementazione di basso livello (o gestire direttamente gli indirizzi del puntatore). I pool di riquadri non applicano livelli aggiuntivi di indiretto nell'hardware. Le ottimizzazioni di una tabella di pagina a livello singolo usando costrutti come le directory di pagine sono indipendenti dal concetto di pool di riquadri.

Si esamini l'archiviazione che la tabella di pagina stessa potrebbe richiedere nel peggiore dei casi (anche se in pratica le implementazioni richiedono solo l'archiviazione approssimativamente proporzionale a ciò che viene mappato).

Si supponga che ogni voce della tabella di pagina sia a 64 bit.

Per la dimensione della tabella di pagine peggiore si raggiunge per una singola superficie, dato i limiti delle risorse in Direct3D 11, si supponga che una risorsa a riquadri venga creata con un formato a 128 bit per elemento (ad esempio un float RGBA), quindi un riquadro di 64 KB contiene solo 4096 pixel. Le dimensioni massime supportate di Texture2DArray pari a 16384*16384*2048 (ma con solo un singolo mipmap) richiederebbero circa 1 GB di archiviazione nella tabella di pagina se completamente popolate (non incluse le mipmap) usando voci di tabella a 64 bit. L'aggiunta di mipmap aumenta l'archiviazione di tabelle di pagine completamente mappata (peggiore) di circa un terzo, a circa 1,3 GB.

In questo caso l'accesso a circa 10,6 terabyte di memoria indirizzabile. Potrebbe esserci un limite per la quantità di memoria indirizzabile, tuttavia, che ridurrebbe questi importi, forse a circa l'intervallo di terabyte.

Un altro caso da considerare è una singola risorsa riquadri texture2D di 16384*16384 con un formato a 32 bit per elemento, inclusi mipmap. Lo spazio necessario in una tabella di pagine completamente popolata sarebbe di circa 170 KB con voci di tabella a 64 bit.

Si consideri infine un esempio usando un formato BC, ad esempio BC7 con 128 bit per riquadro di 4x4 pixel. Questo è un byte per pixel. Una Trama2DArray di 16384*16384*2048 inclusi mipmap richiederebbe circa 85 MB per popolare completamente questa memoria in una tabella di pagine. Ciò non è valido considerando questo consente a una risorsa riquadri di estendersi su 550 gigapixel (512 GB di memoria in questo caso).

In pratica, nessuna parte vicino a questi mapping completi verrebbe definito dato che la quantità di memoria fisica disponibile non permetterebbe in nessuna parte di essere mappata e a cui fa riferimento in un momento. Tuttavia, con un pool di riquadri, le applicazioni possono scegliere di riutilizzare i riquadri (come semplice esempio, riutilizzare un riquadro colorato "nero" per aree nere di grandi dimensioni in un'immagine) usando in modo efficace il pool di riquadri (ovvero i mapping delle tabelle di pagine) come strumento per la compressione della memoria.

Il contenuto iniziale della tabella di pagina è NULL per tutte le voci. Le applicazioni non possono anche passare i dati iniziali per il contenuto della memoria della superficie perché inizia senza backup della memoria.

Contenuto della sezione

Argomento Descrizione
Creazione di pool di riquadri
Un pool di riquadri viene creato tramite l'API ID3D11Device::CreateBuffer passando il flag di D3D11_RESOURCE_MISC_TILE_POOL nel membro MiscFlags della struttura D3D11_BUFFER_DESC a cui punta il parametro pDesc .
Ridimensionamento di pool di riquadri
Usare l'API ID3D11DeviceContext2::ResizeTilePool per aumentare un pool di riquadri se l'applicazione richiede più lavoro per il mapping delle risorse riquadri o per compattare se è necessario meno spazio.
Verifica dei rischi e risorse pool di riquadri
Per le risorse non riquadri, Direct3D può impedire determinate condizioni di rischio durante il rendering, ma poiché il rilevamento dei rischi sarebbe a livello di riquadro per le risorse riquadri, il rilevamento delle condizioni di rischio durante il rendering delle risorse riquadri potrebbe essere troppo costoso.

Creazione di risorse riquadri