Próbuję zrozumieć część userland na Raspberry Pi graficznego kodu sterownika z https://github.com/raspberrypi/userlandwewnętrznego działania z Raspberry Pi sterownika graficznego przestrzeni użytkownika (nie firmware lub część jądra)
mojego zrozumienia tak daleko jest: - firmware blob działa na GPU i oferuje interfejs podobny do OpenGL, który na niższych poziomach opiera się na komunikacie (tablicy bajtów) przechodzącym nad jednym z wielu 28-bitowych słów FIFO o nazwie VCHIQ (inne kolejki VCHIQ są nieistotne dla grafika) - w części procesora połączenia OpenGL są przekształcane w komunikaty dla GPU. Dostęp do obiektu niskiego poziomu (kolejki komunikatów lub VCHIQ - nie znalazłem jeszcze tej części w kodzie) wymaga modułu jądra Linux, ale nie ma tam logiki wysokiego poziomu. - część GPU jest zamknięta, ale to jest w porządku dla moich celów. Częścią procesora (ARM) jest, AFAIK, otwarty
Moim ostatecznym celem jest uzyskanie komunikacji z procesorem GPU pracującym na gołym metalu (bez Linuksa), ale z zamkniętym blobem oprogramowania wbudowanego. Jako pierwszy cel chcę zrozumieć, jak połączenie OpenGL jest faktycznie przekazywane do GPU. Coś poza tym nie jest częścią tego pytania.
Jednak utknąłem w znalezieniu właściwego kodu dla tego. Wywołania OpenGL używają RPC_CALL *, a z kolei RPC_DO, który wywołuje khronos_server_lock_func_table(). Jednak tej funkcji brakuje w kodzie i ku mojemu zaskoczeniu nie mogłem znaleźć nic przydatnego w Google.
Moje pytania: - czy nadal używam procesora ARM, czy też przeprowadziłem się do obszaru GPU, nie zauważając? Jeśli to drugie, to gdzie przekroczyłem tę linię? - Zakładając, że wciąż jestem po stronie procesora - gdzie jest kod dla tej funkcji? Czy jest w ogóle otwarty, czy też mamy tu zamknięte części po stronie procesora? Wszystkie źródła w sieci zdają się wskazywać, że kod procesora jest w 100% otwarty. - w którym momencie implementacja funkcji C OpenGL rzeczywiście wysyła komunikat do GPU? W pewnym momencie oczekuję wywołania funkcji jądra, która reprezentuje VCHIQ w pewnym momencie, prawdopodobnie zaimplementowana jako plik urządzenia.
AFAIK, implementacja OpenGL funkcjonuje wewnątrz kodu oprogramowania układowego GPU, którego nie jestem zainteresowany. Ale gdzie dokładnie przebiega granica pomiędzy CPU i GPU? Czy khronos_server_lock_func_table() jest częścią kodu CPU lub GPU? –
Dwa dokumenty, z którymi się łączyłeś, wydają się opisywać sprzęt GPU, co jest interesujące samo w sobie i przydatne, gdybym miał napisać własną wymianę oprogramowania GPU. Ale niestety nie znalazłem tam nic, jak rozmawiać z istniejącym oprogramowaniem. –
Przeszukałem kod jądra i nie zawiera on khronos_server_lock_func_table(). Nie jestem tym zaskoczony, ponieważ i tak nie można wywoływać funkcji w kodzie jądra z przestrzeni użytkownika. Kod jądra wydaje się implementować interfejs poziomu komunikatów. Pozostają zatem pytania: W jaki sposób połączenia OpenGL są tłumaczone na wiadomości? Gdzie są zdefiniowane typy wiadomości? –