Wie funktioniert der Textur-Cache in der kachelbasierten Rendering-GPU?

9

Wie funktioniert der Cache mit kachelbasiertem Rendering?

Gibt es Tipps, wie Sie die Cache-Trefferquote verbessern können? (Wenn beispielsweise Kacheln horizontal verarbeitet werden und ich vertikale Dreiecksegmente mit derselben Textur habe, funktioniert dies für den Cache schlechter als wenn ich Dreiecke horizontal auslegen würde?)

Felipe Lira
quelle
1
Was meinst du mit vertikaler oder horizontaler Anordnung von Dreiecken?
Mokosha
@Mokosha sorry, das ist mir irgendwie unbemerkt geblieben. Ich habe es gerade gesehen. Dies ist eher eine theoretische als eine praktische Frage, und ich weiß nicht einmal, ob dies jetzt Sinn macht. Ich meinte jedenfalls, ein Dreieck schneide die Kacheln (x, y) und (x + 1, y) und die beiden Kacheln werden nacheinander verarbeitet. Wäre das besser für den Textur-Cache als wenn ich ein Dreieck hätte, das (x, y) und (x, y + 1) schneidet? (Wegen der Randpixel und des Layouts der Dreiecke, die nicht in die gleiche Richtung
Felipe Lira

Antworten:

19

Ob es sich um eine kachelbasierte GPU handelt oder nicht, wirkt sich nicht wirklich auf die Textur-Cache-Architektur aus. Das Speicherlayout der Textur sieht in allen GPUs wie eine Art Morton-Ordnung oder Hilbert-Kurve aus.

Infolgedessen ist es effizienter, Dreiecke zu rendern, die nahe an gleichseitigen Dreiecken liegen, da das GPU-Speichersystem Cache-Zeilen von Texeln abruft.

Offensichtlich kann es an Kachelrändern vorkommen, dass Sie Texel zweimal abrufen müssen. Dies hat geringe Kosten, da Kachelränder nur "wenige" Pixel sind.

Möglicherweise verhalten sich Desktop-GPUs identisch mit kachelbasierten GPUs, wie Experimente wie die folgenden zeigen: http://www.g-truc.net/post-0597.html

Die Größe der Kacheln ist unterschiedlich, aber beide Architekturen verarbeiten Fragmente tatsächlich zu einer Hierarchie von Kacheln unterschiedlicher Größe.

Bei der Codierung von kachelbasierten GPUs empfehle ich Folgendes:

  1. Wechseln Sie nicht zwischen Framebuffer-Objekten, es sei denn, Sie müssen dies wirklich tun .
  2. Wenn Sie beim Binden eines neuen Framebuffer-Objekts den Inhalt des aktuellen Framebuffers nicht speichern müssen, verwerfen Sie ihn. Wenn Sie den Inhalt des neuen Framebuffers nicht laden möchten, sollten Sie den Framebuffer löschen.
Christophe
quelle
Ich habe das zweite Element aktualisiert, da die Bearbeitung nicht das war, was ich meinte. Ansonsten sieht es toll aus!
Christophe
Hallo Christophe, meintest du eher "gleichseitige" Dreiecke als "gleichschenklige"? Anstelle von "Hilbert" hätte ich "Morton" bestellt, da die Adressierung in der Hardware viel einfacher ist.
Simon F
@Christophe danke! Das ist wirklich hilfreich. Ist der Textur-Cache für die Randpixel nicht wichtig? Das habe ich mich gefragt. Wenn ich also ein Dreieck habe, das die Kacheln (x, y) und (x + 1, y) schneidet, und die GPU gerade die Kacheln (x, y) gerastert hat. Angenommen, die Kachel (x + 1, y) wird die nächste sein, auch wenn eine andere Ausführungseinheit sie verarbeitet, kann ich dann beim Abtasten von Texeln für dieses Dreieck nicht vom Textur-Cache profitieren?
Felipe Lira
Außerdem wurde ich neugierig auf das Hilbert-Muster. Ich habe immer angenommen, dass dies für blockkomprimierte Texturen gilt. Gilt das für alle Texturen? PS: Ich bin auch nicht dem letzten Absatz gefolgt.
Felipe Lira
PVRTC codiert Texturblöcke in einer Morton-Reihenfolge
ashleysmithgpu