Jak działa karta graficzna?

W prehistorii informatyki, gdy po serwerowniach biegały dinozaury ;-D komputery drukowały wyniki swoich obliczeń na drukarkach lub dalekopisach. Aż pewnego dnia ktoś wykombinował, że dużo lepiej byłoby oglądać wyniki na ekranie kineskopu, bo i papier się zaoszczędzi i hałas będzie mniejszy ;-) I chwała mu za to, bo dzięki niemu mamy teraz karty graficzne. Zresztą chyba się ze mną zgodzisz, że trudno byłoby grać w Quake'a na drukarce! ;-D

No właśnie. Czy podczas siania z bazooki w zgraję Obcych w rozdzielczości 1024x768 i 32-bitowej głębi kolorów przyszło Ci kiedykolwiek do głowy, jak działa karta graficzna, która tworzy dla Ciebie cały ten obraz krwawej masakry? :-) Jeśli chcesz się zajmować programowaniem grafiki, koniecznie musisz znać zasady działania kart graficznych. Zwłaszcza że współczesne karty mają wiele zaawansowanych funkcji i wykonują skomplikowane obliczenia, generując realistyczne sceny 3D.

Działanie karty graficznej

Mówiąc najprościej, karta graficzna to układ elektroniczny, który odwzorowuje fragment pamięci komputera jako obraz na ekranie monitora. Obszar pamięci, w którym przechowywane są dane graficzne aktualnie wyświetlanego obrazu, nazywany jest pamięcią obrazu lub buforem ramki [ang. framebuffer]. Zadaniem karty graficznej jest odczytać zawartość tej pamięci i tak pokierować monitorem, by ją wyświetlił.

Wydaje się, że to proste zadanie. Jednak problem polega na tym, że monitor CRT [z lampą kineskopową] nie jest urządzeniem cyfrowym i nie rozumie tego, co jest w pamięci komputera. Dlatego każda karta graficzna posiada specjalny układ, zwany DAC [ang. Digital-Analog Converter = przetwornik cyfrowo-analogowy]. Układ ten zamienia cyfrowe dane graficzne na sygnały analogowe zrozumiałe dla monitora. Od jego wydajności zależy, jak często obraz na monitorze może być odświeżany. Od możliwości tego układu zależy też głębia kolorów wyświetlanego obrazu.

Pierwsze karty graficzne trzymały dane graficzne ekranu w zwykłej pamięci RAM. Szybko okazało się, że takie rozwiązanie jest zbyt powolne. Układ DAC musi przemiatać pamięć obrazu wielokrotnie w ciągu sekundy. Aby więc DAC pracował wydajniej, karty graficzne wyposażono we własne szybkie układy pamięci RAM, zwane pamięcią video [VRAM]. Do takiej pamięci karta ma szybszy dostęp, bo nie musi do niej sięgać przez i tak już zapchaną magistralę systemową. W dodatku nowoczesne karty mogą używać do komunikacji z pamięcią video nawet 128-bitowych szyn danych! 8-) Nie muszę chyba tłumaczyć, że dane graficzne mogą mknąć przez taką magistralę jak po autostradzie ;-J

Budowa karty graficznej
Rys. 1: Budowa karty graficznej.

Na rysunku 1 przedstawiłem budowę przeciętnej karty graficznej. Żółte strzałki pokazują szybką komunikację pomiędzy procesorem graficznym [GPU] a pamięcią Video RAM i układem DAC. Niebieska strzałka pokazuje wolniejszą drogę komunikacji karty graficznej ze "światem zewnętrznym" poprzez szynę systemową. Fioletowa falista strzałka to sygnał analogowy podawany przez układ DAC na wyjście do gniazda monitora.

Fizycznie kostki pamięci video znajdują się na karcie graficznej, ale to nic nie szkodzi ;-) Karta graficzna jest układem wejścia/wyjścia mapowanym w pamięci. Oznacza to, że pamięć video jest widziana przez procesor jako część jego przestrzeni adresowej. Można raz "zameldować" pamięć video pod jednym adresem, a kiedy indziej pod innym. Przykładowo w trybach textowych pamięć obrazu jest zamapowana pod adresem B8000, a w trybach graficznych pod adresem A0000. Tak więc procesor może się niczym nie przejmować i zwyczajnie odwoływać się do tej pamięci w taki sam sposób, jak do zwykłych komórek pamięci RAM [oczywiście poprzez szynę systemową ;-P].

Standardy VESA i bufor ramki

Za starych dobrych czasów bardzo popularnym trybem graficznym kart VGA był tak zwany tryb 13h. Był to tryb graficzny o rozdzielczości 320x200 i 8-bitowej głębi kolorów. Jego popularność brała się stąd, że łatwo było go programować. Każdy piksel w tym trybie zajmował jeden bajt, a cały bufor ramki mieścił się w jednym 64-kilobajtowym segmencie. Niestety w wyższych rozdzielczościach i głębiach kolorów pojawia się problem: bufor ramki przestaje się już mieścić w jednym segmencie. Jak sobie z tym poradzić, by zachować taki sam sposób dostępu do pamięci obrazu?

Standard VESA 1.2 rozwiązuje ten problem stosując banki pamięci. Sztuczka polega na tym, że cała pamięć video jest podzielona na banki, które są widoczne jakby "przez dziurkę od klucza". My sobie pracujemy dalej z 64-kilobajtowym blokiem, tak jak dotychczas, jednak za każdym razem ten blok odpowiada innemu obszarowi pamięci video. To jak patrzeć przez okno, za którym zmienia nam się widok ;-)

Oczywiście problem ten przestał być problemem, gdy komputery miały coraz więcej pamięci. W dodatku w trybie chronionym procesorów od 386 wzwyż nie trzeba sobie już zawracać głowy podziałem pamięci na segmenty. Z tego względu dostęp do pamięci video przez 64-kilobajtowe "okno" okazał się nieekonomiczny. Wraz ze standardem VESA 2.0 wprowadzono tak zwany liniowy bufor ramki [ang. linear framebuffer]. Od tego momentu do bufora ramki można się już odwoływać jak do jednolitego, ciągłego bloku pamięci.

To tyle na początek. W kolejnych odcinkach powiem o tym, jakie są formaty zapisu pixeli w pamięci video, jak wyświetla się bitmapy, oraz jakie możliwości sprzętowego wspomagania rysowania oferują nam nowe karty graficzne.


Subskrybcja

Buttony
Pomagał GIMP Powered by NAVI GameCreator GameCreator GameCreator