@Amig_OS, post #178
@recedent, post #1
Przepraszam za ciszę w ostatnim czasie. Pracowałem nad sterownikiem R600 (oraz R700, Evergreen i Northern Islands) przez ostatnie kilka tygodni, głównie skupiając się na pisaniu kompilatora shaderów dla niego. Kompilator shaderów wydaje się być w dość dobrym stanie (więcej na ten temat w następnych akapitach, dla zainteresowanych), więc moje skupienie przesunie się na wykonanie wszystkich innych części wymaganych do działania sterownika. Te rzeczy to głównie podstawowa konfiguracja sprzętu, obsługa stanów, obsługa tekstur i tak dalej. Oznacza to, że niestety nie jestem jeszcze w miejscu, w którym sterownik może renderować nawet najprostsze rzeczy, ale kiedy już to zrobię, nastąpi bardzo szybki postęp w kierunku w pełni funkcjonalnego sterownika. Mam nadzieję, że sterownik R600 uruchomi swoje pierwsze proste aplikacje w przyszłym tygodniu, choć nie mogę obiecać, że właśnie wtedy to się stanie.
Poniższy tekst może być pominięty dla tych, którzy nie są zainteresowani techniczną stroną rozwoju sterownika.
Skąd mogę wiedzieć, że kompilator shaderów jest w dobrej formie, skoro nie mogę go jeszcze uruchomić? Cóż, w przypadku sprzętu graficznego w ogóle, a już na pewno Radeonów w szczególności, nie można zrobić zbyt wiele, jeśli chodzi o uzyskanie jakichkolwiek informacji o debugowaniu sprzętu. Piszę sterownik, testuję go i otrzymuję jeden z 4 możliwych rezultatów:
1) Następuje awaria oprogramowania.
2) Nic się nie dzieje.
3) Sprzęt się zawiesza, ale system operacyjny nadal działa.
4) Sprzęt całkowicie blokuje cały system.
1 jest najłatwiejszy do usunięcia, ponieważ jest to prawie na pewno problem z oprogramowaniem. Pozostałe 3 są znacznie trudniejsze do usunięcia, chociaż każdy tryb awarii daje wskazówkę, co się dzieje. Jednakże, błąd w kompilatorze shaderów może spowodować każdy z trybów awarii oznaczonych jako 2-4 powyżej, bez lub z niewielką ilością dodatkowych informacji, które pomogłyby mi dowiedzieć się, dlaczego tak się dzieje. Jednocześnie prawie każdy inny błąd w konfiguracji stanu Radeona może również spowodować któryś z tych samych 3 trybów awarii, więc naprawdę trudno jest powiedzieć, co się dzieje na pierwszy rzut oka, gdy pojawia się problem.
Jeśli chodzi o debugowanie shaderów, nie ma żadnego mechanizmu pozwalającego na przejście przez skompilowany program shaderów, aby zobaczyć co się dzieje i kiedy. Nie ma nawet sposobu na uzyskanie jakichkolwiek informacji o czasie działania programu, więc debugowanie jest w dużej mierze metodą prób i błędów, co jest bardzo czasochłonne.
Zatem jedną z rzeczy, którą robię, aby zredukować ilość czasu, który muszę spędzić na błądzeniu po omacku, jest to, że nie tylko piszę kompilator shaderów, ale także piszę disassembler dla binarnych shaderów, które są przesyłane do sprzętu Radeon w celu wykonania. Tak więc pisząc sterownik, najpierw każę mu skompilować jakikolwiek program, który zostanie mu przekazany, a zaraz potem dezasembluje to, co właśnie skompilował. Następnie zrzuca wszystkie te dane (oryginalne źródło shaderów, wszystkie pośrednie stany kompilatora po parsowaniu, optymalizacji, itp. i zdemontowany program) dla mnie w dzienniku debugowania. Następnie przechodzę przez wszystko ręcznie, porównując to z oryginalnym źródłem shaderów przekazanym do sterownika, aby upewnić się, że ostatecznie skompilowany program faktycznie odpowiada temu, co robi kod źródłowy.
Robienie tego w ten sposób jest nieco bardziej pracochłonne, ale oszczędza mi czas, ponieważ pomaga mi wyłapać wiele prostych błędów, które zdarzają się podczas początkowego pisania kompilatora, i pomaga mi potwierdzić, że to, co robi kompilator, jest rzeczywiście poprawne. Jest to również powód, dla którego mogę stwierdzić - bez faktycznego uruchomienia jakiejkolwiek binarki shaderów wyprodukowanej przez kompilator - że kompilator jest obecnie w dość dobrej formie.
Kolejną interesującą rzeczą w R600 i nowszych sprzętach jest to, że część sprzętu, która pobiera dane o wierzchołkach z pamięci i przedstawia je do przetwarzania przez vertex shader, który był sprzętem o stałej funkcji w poprzednich Radeonach, jest teraz w 100% samodzielnym shaderem. Oznacza to, że aby sprzęt pobierał dane o wierzchołkach z pamięci, sterownik musi wygenerować shader, który poinstruuje Radeona jak to zrobić.
@recedent, post #183
aby zredukować ilość czasu, który muszę spędzić na błądzeniu po omacku,
@Amig_OS, post #184
@recedent, post #185
@recedent, post #185
@Amig_OS, post #191
@AmiClassic, post #189
Ciekawe ile czasu te NOWE karty spędziły w koparkach
@recedent, post #203
@Phibrizzo, post #207
@recedent, post #208