Datenstrukturen für das kachelbasierte (verzögerte) Rendern

18

In modernen GPU-Architekturen für Mobilgeräte wird gekacheltes Rendering verwendet, um die Kohärenz des Speicherzugriffs zu erhöhen, indem der Bildraum in ein reguläres Raster kleiner Kacheln (z. B. 32 x 32 Pixel) unterteilt wird. Informationen zu den Arten von Datenstrukturen, die zum Verfolgen der Grundelemente verwendet werden, die jeder Kachel zugeordnet sind, sind knapp, wenn man bedenkt, dass beliebig viele Grundelemente eine bestimmte Kachel überlappen können.

Welche Datenstrukturen werden aus Sicht eines Treiberentwicklers üblicherweise zur Darstellung der zu einer Kachel gehörenden Grundelementsätze verwendet, und werden solche Strukturen entsprechend der Geometrie, die eine bestimmte Kachel überlappt, dynamisch zugewiesen / in der Größe geändert?

warrenm
quelle
3
Wirklich interessante Frage, und obwohl ich vermute, dass die meisten Details geheim sind, könnte dies ein guter Ausgangspunkt für jeden sein, der nachforschen
John Calsbeek

Antworten:

11

Dieser Blog-Beitrag, den John erwähnt, ist ein ziemlich guter Anfang (wenn ich das selbst sage!), Aber es gibt ein paar zusätzliche Details, die hilfreich sein könnten.

Für die PowerVR-Architektur wird die Zwischendatenstruktur - im Folgenden als primitive Liste oder Parameterpuffer (PB) bezeichnet -, in der die Daten pro Kachel gespeichert werden, nachdem alle Schattierungen der Scheitelpunkte und der Kachelungsprozess abgeschlossen sind, hauptsächlich von generiert und verwaltet die Hardware, anstatt der Treiber.

Die In-Memory-Strukturen des PB sind physikalisch in zwei Teile aufgeteilt. Zunächst Blöcke transformierter Scheitelpunktdaten, einschließlich Scheitelpunktattributen. Die Blöcke sind komprimiert, und wie Sie sich vorstellen können, handelt es sich größtenteils nur um gepackte und komprimierte Gleitkommadaten. Die zweite speicherinterne Struktur sind die Kacheldaten, die effektiv eine Liste von Listen sind.

Die Liste der obersten Ebene in dieser Datenstruktur wird als Region bezeichnet und kann für einen bestimmten primitiven Block eine Reihe von Kacheln anstelle einzelner Kacheln gleichzeitig codieren. Eine Region ist daher eine Reihe von Positionen für Bildschirmkacheln, Kachelzustände und dann eine Liste der komprimierten Blöcke, die die Geometrie in dieser Region enthalten. Mit Regionen arbeitet der Rasterer, und Sie können sich vorstellen, dass leere Kacheln nur automatisch übersprungen werden, obwohl es in einigen Fällen einen guten Grund gibt, dass der Rasterer leere Regionen besucht.

Der von der GPU für das PB verwendete Speicher wird in allen modernen PowerVR-Implementierungen dynamisch zugewiesen. Ein Zeiger auf diesen Speicher wird vom Treiber bereitgestellt, und der Treiber passt die Größe mithilfe der GPU nach Bedarf an. Dieser Mechanismus ist ein Kompromiss zwischen einer häufigen Neuzuweisung und der Minimierung des zugewiesenen PB-Speicherplatzes.

Moderne GPUs sind sehr bemüht, die Indirektion des Arbeitsspeichers zu minimieren, aber es ist einer der Fälle, in denen es wirklich schwierig ist und es keine andere Wahl gibt, die PB zu durchlaufen, um die Rasterisierungsstufe zu speisen. Zum Glück schließt die Zeigerjagd große Blöcke ab, die gut zwischengespeichert und in den Kern gestreamt werden.

Andere Architekturen funktionieren nicht genau so wie PowerVR, da der PB zum Teil so ist, wie er in unserer Architektur ist, um das vollständig verzögerte Pixelschattierungskonzept zu unterstützen, das wir implementieren. Das allgemeine Konzept gilt jedoch für alle anderen Kacheln in der Mobiler Raum, den ich kenne.

rys
quelle