Come funziona Texture Cache nella GPU Rendering basato su piastrelle


9

Come funziona la cache con il rendering basato su tile?

Ci sono dei suggerimenti su come migliorare il rapporto di hit della cache per questo? (ad esempio, se le tessere vengono elaborate in orizzontale e ho segmenti verticali di triangoli con la stessa trama, funziona peggio per la cache che se avessi una disposizione triangolare in orizzontale?)


1
Cosa intendi con disposizione verticale o orizzontale dei triangoli?
Mokosha,

@Mokosha scusa, questo in qualche modo mi è passato inosservato. L'ho appena visto ora. Questa è una domanda più teorica che pratica e non so nemmeno se questo abbia senso adesso. Ad ogni modo, intendevo dire che un triangolo interseca le tessere (x, y) e (x + 1, y) e che queste due tessere vengono elaborate una dopo l'altra. Sarebbe meglio per la cache delle trame rispetto a Se avessi un triangolo che si interseca (x, y) e (x, y + 1)? (A causa dei pixel del bordo e della disposizione dei triangoli che non si trovano nella stessa direzione dell'elaborazione delle tessere)
Felipe Lira

Risposte:


19

Che si tratti di una GPU basata su tile o meno, ciò non influisce sull'architettura della cache delle trame. Il layout di memoria della trama apparirà come un sapore dell'ordine di Morton o della curva di Hilbert in tutte le GPU.

Di conseguenza, è più efficiente eseguire il rendering di triangoli vicini a triangoli equilateri poiché il sistema di memoria GPU recupera le linee cache di texel.

Quindi, ovviamente, sui bordi delle tessere, può succedere che devi recuperare due volte texel. Ciò ha un costo ridotto poiché i bordi dei riquadri sono solo "pochi" pixel.

Probabilmente le GPU desktop si comportano in modo identico alle GPU basate su tile come dimostrano esperimenti come i seguenti: http://www.g-truc.net/post-0597.html

Le dimensioni delle tessere sono diverse ma entrambe le architetture trasformano effettivamente i frammenti in una gerarchia di tessere di dimensioni diverse.

Quando si codifica per GPU basate su tile, la mia raccomandazione è di tenere sempre presente:

  1. Non cambiare oggetti framebuffer a meno che non sia necessario.
  2. Quando si associa un nuovo oggetto framebuffer, se non è necessario salvare il contenuto dell'attuale framebuffer, scartarlo. Se non si desidera caricare il contenuto del nuovo framebuffer, è necessario cancellare il framebuffer.

Ho aggiornato il secondo elemento poiché la modifica non era ciò che intendevo. Altrimenti, sembra fantastico!
Christophe,

Ciao Christophe, intendevi triangoli "equilateri" anziché "isoscele"? Piuttosto che "Hilbert" avrei detto "Morton" in quanto l'indirizzamento è molto più semplice nell'hardware.
Simon F,

@Christophe grazie! Questo è davvero utile. Quindi, per i pixel del bordo, la texture cache non ha importanza? È stato un po 'quello che mi chiedevo. Quindi, se ho un triangolo che interseca i riquadri (x, y) e (x + 1, y) e GPU solo il riquadro rasterizzato (x, y). Supponendo che il riquadro (x + 1, y) sarà il prossimo, anche se una diversa unità di esecuzione lo elabora, non trarrò beneficio dalla cache delle trame quando campionerò texel per questo triangolo?
Felipe Lira,

Inoltre, mi sono incuriosito dal modello di Hilbert. Ho sempre pensato che questo fosse vero per le texture compresse a blocchi. È vero per tutte le trame? PS: Anche io non ho seguito l'ultimo paragrafo.
Felipe Lira,

PVRTC codifica i blocchi di trama in un ordine di
mortaio
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.