Strutture di dati per il rendering basato su tile (differito)


18

Il rendering affiancato viene utilizzato nelle moderne architetture GPU mobili per aumentare la coerenza dell'accesso alla memoria suddividendo lo spazio dell'immagine in una griglia regolare di piccoli riquadri (ad es. 32x32 pixel). Le informazioni sono scarse sui tipi di strutture di dati utilizzate per tenere traccia delle primitive associate a ogni riquadro, considerando che arbitrariamente molti primitivi possono sovrapporsi a un determinato riquadro.

Dal punto di vista di uno sviluppatore di driver, quali strutture di dati vengono comunemente utilizzate per rappresentare gli insiemi primitivi che appartengono a un riquadro e tali strutture vengono allocate / ridimensionate dinamicamente in base alla geometria che si sovrappone a un riquadro particolare?


3
Domanda davvero interessante, e anche se sospetto che la maggior parte dei dettagli chiacchieroni siano una salsa segreta, questo potrebbe essere un buon punto di partenza per chiunque voglia fare la ricerca e scrivere un riassunto: blog.imgtec.com/powervr/…
John Calsbeek,

Risposte:


11

Quel post sul blog che John menziona è un buon inizio (se lo dico io stesso!), Ma ci sono un po 'di dettagli in più che potrebbero essere utili.

Per l'architettura PowerVR, la struttura dei dati intermedi - variamente chiamata elenco primitivo o buffer dei parametri (PB) - che memorizza i dati per riquadro, dopo che tutte le ombre dei vertici e il processo di piastrellatura sono completi, è in realtà principalmente generata e gestita da l'hardware, piuttosto che il driver.

Le strutture in memoria del PB sono fisicamente divise in due. Innanzitutto, blocchi di dati di vertici trasformati, inclusi gli attributi di vertici. I blocchi sono compressi e, come puoi immaginare, sono solo dati compressi e compressi in virgola mobile per la maggior parte. La seconda struttura in memoria sono i dati di piastrellatura, che è effettivamente un elenco di elenchi.

L'elenco di livello superiore in quella struttura di dati è chiamato area e può codificare un insieme di riquadri anziché un singolo riquadro alla volta, per un determinato blocco di base. Una regione è quindi un insieme di posizioni di riquadri dello schermo, stati di riquadri e quindi un elenco dei blocchi compressi che contengono la geometria in quella regione. Le regioni sono ciò su cui funziona il rasterizzatore e puoi immaginare che i riquadri vuoti vengano saltati automaticamente, anche se in alcuni casi c'è una buona ragione per cui il rasterizzatore visita le regioni vuote.

La memoria utilizzata dalla GPU per il PB è allocata in modo dinamico in tutte le moderne implementazioni di PowerVR. Il driver fornisce un puntatore a tale memoria e il driver, con l'aiuto della GPU, lo ridimensionerà come richiesto. Tale meccanismo costituisce un compromesso tra la necessità di riallocare frequentemente e la riduzione al minimo della quantità di spazio PB allocato.

Le GPU moderne si sforzano davvero di ridurre al minimo l'indirizzamento della memoria, ma camminare sul PB per alimentare la fase di rasterizzazione è uno di quei casi in cui è davvero difficile e non c'è altra scelta. Per fortuna il puntatore che segue avvolge blocchi di grandi dimensioni che memorizzano bene nella cache e vengono trasmessi nel core.

Altre architetture non funzionano esattamente allo stesso modo di PowerVR, perché parte del motivo per cui il PB è il modo in cui è nella nostra architettura è quello di aiutare il concetto di ombreggiatura dei pixel completamente differito che implementiamo, ma il concetto generale si applica a tutti gli altri piastrellisti nel spazio mobile di cui sono a conoscenza.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.