Struktury danych do renderowania opartego na kafelkach (odroczone)

18

Renderowanie kafelkowe jest stosowane we współczesnych architekturach mobilnych GPU w celu zwiększenia spójności dostępu do pamięci poprzez podzielenie przestrzeni obrazu na regularną siatkę małych (np. 32 x 32 piksele) płytek. Brakuje informacji na temat rodzajów struktur danych używanych do śledzenia prymitywów powiązanych z każdym kafelkiem, biorąc pod uwagę, że dowolnie wiele prymitywów może nakładać się na dowolny kafelek.

Z perspektywy dewelopera sterowników, jakie struktury danych są zwykle używane do reprezentowania prymitywnych zbiorów, które należą do kafelka, i czy takie struktury są dynamicznie przydzielane / zmieniane w zależności od geometrii, która zachodzi na konkretną płytkę?

warrenm
źródło
3
Naprawdę interesujące pytanie i chociaż podejrzewam, że większość drobiazgowych szczegółów to tajny sos, może to być dobry punkt wyjścia dla każdego, kto chce przeprowadzić badania i napisać streszczenie: blog.imgtec.com/powervr/...
John Calsbeek,

Odpowiedzi:

11

Ten post na blogu, o którym wspomina John, jest całkiem dobrym początkiem (jeśli sam to powiem!), Ale jest trochę dodatkowych szczegółów, które mogą być pomocne.

W przypadku architektury PowerVR pośrednia struktura danych - inaczej nazywana pierwotną listą lub buforem parametrów (PB) - przechowująca dane dla poszczególnych płytek, po zakończeniu cieniowania wierzchołków i zakończenia procesu kafelkowania, jest w rzeczywistości generowana i zarządzana przez sprzęt, a nie sterownik.

Struktury w pamięci PB są fizycznie podzielone na dwie części. Po pierwsze, bloki transformowanych danych wierzchołków, w tym atrybuty wierzchołków. Bloki są skompresowane i, jak można sobie wyobrazić, są w większości spakowane i skompresowane dane zmiennoprzecinkowe. Drugą strukturą w pamięci są kafelki danych, które faktycznie stanowią listę list.

Lista najwyższego poziomu w tej strukturze danych jest nazywana regionem i może kodować zestaw kafelków zamiast pojedynczej kafelków jednocześnie, dla danego bloku pierwotnego. Region jest zatem zbiorem lokalizacji kafelków ekranu, stanów kafelków, a następnie listą skompresowanych bloków, które utrzymują geometrię w tym regionie. Regiony są tym, na czym działa rasterizer, i możesz sobie wyobrazić, że puste kafelki są po prostu automatycznie pomijane, chociaż w niektórych przypadkach istnieje dobry powód, aby rasteriser odwiedził puste regiony.

Pamięć wykorzystywana przez GPU dla PB jest dynamicznie przydzielana we wszystkich nowoczesnych implementacjach PowerVR. Wskaźnik do tej pamięci jest dostarczany przez sterownik, a sterownik, z pomocą GPU, dostosuje rozmiar do potrzeb. Mechanizm ten jest kompromisem między częstym ponownym przydzielaniem a minimalizacją ilości przydzielonej przestrzeni PB.

Współczesne procesory graficzne naprawdę bardzo starają się zminimalizować pośrednią pamięć, ale chodzenie po PB, aby nakarmić etap rasteryzacji, jest jednym z tych przypadków, w których jest to naprawdę trudne i nie ma innego wyboru. Na szczęście pogoń za wskaźnikiem owija duże bloki, które dobrze buforują i są przesyłane strumieniowo do rdzenia.

Inne architektury nie działają dokładnie tak samo jak PowerVR, ponieważ jednym z powodów, dla których PB jest taki, jak w naszej architekturze, jest pomoc w pełni wdrożonej koncepcji cieniowania pikseli, ale ogólna koncepcja dotyczy wszystkich innych kafli w przestrzeń mobilna, której jestem świadomy.

rys
źródło