Hlavní navigace

Grafické karty a grafické akcelerátory (14)

1. 6. 2005
Doba čtení: 15 minut

Sdílet

Celé dnešní pokračování seriálu o grafických kartách a grafických akcelerátorech je věnováno podrobnějšímu popisu grafické karty VGA, která měla ve své době velký význam jak pro vývoj graficky orientovaných aplikací, tak i herního software a grafických demo programů.

Obsah

1. Hardwarové součásti grafické karty VGA
2. Organizace obrazové paměti
3. Standardní textové režimy dostupné na grafické kartě VGA
4. Rozšířené textové režimy VGA
5. Standardní grafické režimy VGA
6. Rozšířené grafické režimy VGA
7. Další programovatelné funkce grafické karty VGA
8. Synchronizační signály a jejich časování
9. Obsah dalšího pokračování

1. Hardwarové součásti grafické karty VGA

Po hardwarové stránce je grafická karta VGA podobná dříve popsané kartě EGA. Na obou zmíněných typech grafických karet jsou integrovány obvody řadiče obrazovky (CRTC – Cathode Ray Tube Controller), řadiče přístupu do paměti (sekvencéru), řadič přístupu k jednotlivým bitovým rovinám (GDC – Graphics Device Controller), řadiče barvových atributů (ATC – Attribute Controller), obvodu pro přemapování barev (CLUT – Color Look-Up Table) a nově také DA převodník, protože ke kartě VGA se připojuje analogový monitor. Důležité je, že všechny tyto obvody jsou plně konfigurovatelné, protože jsou jejich řídicí registry mapovány do oblasti I/O portů mikroprocesoru počítače. Vzhledem k tomu, že musela být dodržena kompatibilita s MDA, CGA a také EGA, je grafická karta VGA ještě komplikovanější než už tak dost komplikovaná EGA a její programování není v žádném případě jednoduché.

2. Organizace obrazové paměti

Obrazová paměť byla na grafické kartě VGA organizována do takzvaných bitových rovin. Bitové roviny byly čtyři, každá měla kapacitu 64 kB, celkově byla na grafické kartě dostupná obrazová paměť o kapacitě 256 kB. Nejprve si povíme, jak se bitové roviny používaly v šestnáctiba­revných grafických režimech, tam je jejich funkce ve své podstatě nejjednodušší. Bitové roviny si můžeme představit jako čtyři plochy, které jsou položeny na sebe. V šestnáctiba­revných grafických režimech je pro každý pixel nutné rezervovat čtyři bity, v každé bitové rovině je pro pixel rezervován právě jeden bit. To také znamená, že v každém bytu bitové roviny jsou uloženy (samozřejmě neúplné) informace o osmi pixelech. Vzhledem k tomu, že se do adresového prostoru mikroprocesoru mapovala vždy pouze jedna bitová rovina, bylo čtení a zápis barev do jednotlivých pixelů velmi pomalé. Určitého urychlení se dalo dosáhnout změnou zápisového či čtecího režimu, ale i tak je organizace obrazové paměti asi největším (a možná jediným) záporem této grafické karty. Poněkud odlišná je organizace paměti v grafickém režimu o rozlišení 320×200 pixelů v 256 barvách, který bude podrobněji popsán v páté kapitole. Také textové režimy (viz třetí a čtvrtá kapitola) využívají bitové roviny svým vlastním způsobem, zejména se liší způsob jejich mapování do adresového prostoru mikroprocesoru.

3. Standardní textové režimy dostupné na grafické kartě VGA

Standardní textové režimy, které jsou pomocí grafické karty VGA přes její VGA BIOS dostupné, navazují na textové režimy používané u předchozích grafických karet, VGA je v tomto ohledu dokonce do značné míry kompatibilní i s původní kartou MDA. Ve všech dále uvedených textových režimech se používá zvláštní přístup do obrazové paměti, kdy se do první bitové roviny ukládají ASCII kódy znaků, do druhé bitové roviny jejich barvové atributy a třetí rovina obsahuje bitové masky jednotlivých znaků. Programátorovi jsou však (samozřejmě bez použití speciálních programovacích technik) dostupné pouze první dvě bitové roviny, které jsou zřetězeny tak, aby bylo možné ukládat data ve dvojicích ASCII kód+barvový atribut. Mezi standardní textové režimy patří:

  1. Textový režim, ve kterém jsou znaky zobrazovány po 40 znacích na 25 textových řádcích, popředí i pozadí znaku může obsahovat jednu ze šestnácti barev. Tento režim je do značné míry kompatibilní s grafickou kartou CGA, každý znak je však zobrazován v rastru 9×16 pixelů. V tomto režimu je aktivní grafická plocha rovna rastru 360×400 pixelů. Textový kurzor je programovatelný, ale pouze ve vertikálním směru; ve směru horizontálním je vždy roztažen po celé délce znaku.
  2. Textový režim, kde jsou znaky zobrazovány po 80 znacích na 25 řádcích, popředí i pozadí znaku může obsahovat jednu ze šestnácti barev. Tento prakticky nejpoužívanější textový režim je opět kompatibilní s grafickou kartou CGA, každý znak je však zobrazován v rastru 9×16 pixelů namísto původních 8×8 pixelů. Z toho vyplývá, že aktivní grafická plocha je rovna rastru o rozlišení 720×400 pixelů.
  3. Textový režim, ve kterém jsou znaky zobrazovány po 80 znacích na 25 řádcích. Jednotlivé znaky mohou být zobrazeny buď šedou, či bílou barvou, také je možné zvolit podtržení jednotlivých znaků. Pozadí znaků může být buď černé, nebo šedé. Tento režim, jež je kompatibilní s kartou MDA, se často používal na starších notebocích s černobílým (pasivním) displejem.

4. Rozšířené textové režimy VGA

Standardní textový režim karty VGA používá rozlišení 720×400 pixelů. Toto rozlišení je však možné měnit. Další dva často používané textové režimy lze získat tak, že se sníží vertikální rozlišení na 200 či 350 obrazových řádků, lze provést i zvýšení rozlišení na 480 obrazových řádků. Výsledkem jsou textové režimy s rozlišením 720×200 pixelů a 720×350 pixelů. Tyto režimy mají samozřejmě horší prokreslování znaků než režim původní, jejich použití je tak omezeno pro speciální aplikace – starší notebooky, zobrazovací LCD panely, prokládaný výstup na video (350 řádků) apod. Také je možné zvolit pomalejší krystal, kterým se generují hodinové signály (jak uvidíme dále, má karta VGA dva krystaly o různých rezonančních frekvencích). Tím se sníží horizontální rozlišení z 720 pixelů na 640 pixelů. Kombinací obou metod se tak dají vytvořit následující textové režimy:

GFX 14a
Horizontální rozlišení Vertikální rozlišení Poznámka
640 200 pro podporu některých LCD panelů
640 350
640 400 použit u některých starších notebook
640 480 časování odpovídá hi-res grafickému režimů
720 200
720 350
720 400 standardní režim se snímkovou frekvencí 70 Hz
720 480 režim s třiceti zobrazenými řádky textu

Kromě toho je možné měnit počet obrazových řádků, ze kterých se skládá maska znaků. Místo standardních šestnácti řádků se často používá řádků čtrnáct (28řádkový textový režim), 10 (40řádkový textový režim) a 8 (50řádkový textový režim). Samozřejmě je nutné pro tyto textové režimy dodat odpovídající definice znaků – viz například linuxovou utilitu setconsolefont a k ní příslušející datové soubory. Pro operační systém DOS existuje pro změnu fontu těchto utilit nepřeberné množství, z českých výtvorů jmenujme například utilitu VGA28.

5. Standardní grafické režimy VGA

Grafická karta VGA podporuje mnoho standardních grafických režimů. Některé z těchto režimů jsou vytvořeny tak, aby se do co největší míry zachovala kompatibilita se staršími grafickými adaptéry, další grafické režimy jsou zcela nové. Mezi podporované standardní grafické režimy patří:

GFX 14b
Horizontální rozlišení Vertikální rozlišení Počet barev Poznámka
320 200 4 kompatibilita s barevným režimem karty CGA
640 200 2 kompatibilita s hi-res (dvoubarevným) režimem karty CGA
320 200 16 kompatibilita s low-res režimem karty EGA
640 200 16 kompatibilita s mid-res režimem karty EGA
640 350 4 kompatibilita s hi-res režimem karty EGA s 64kB grafické paměti
640 350 16 kompatibilita s hi-res režimem karty EGA s 256kB grafické paměti
640 480 2 nový monochromatický hi-res režim se čtvercovými pixely
640 480 16 nový šestnáctibarevný hi-res režim se čtvercovými pixely
320 200 256 nový 256 barevný low-res režim, ve kterém dochází ke zřetězení bitových rovin

Popišme si nyní tři nové grafické režimy karty VGA podrobněji.

  1. Režim 640×480×2 je vytvořen tak, aby se pro adresaci všech pixelů mohla využít pouze jedna bitová rovina. Práce s grafikou je v tomto režimu velmi jednoduchá: od adresy 0xa000:0000 do adresy 0xa000:ffff je mapována nultá bitová rovina, přičemž je standardně zobrazováno prvních 38400 bytů, což odpovídá 307200 pixelům, protože vždy osmice pixelů je uložena v jednom bytu. Zbývající paměťovou kapacitu bitové roviny lze využít například ke scrollingu obrazovky, protože ve skutečnosti je možné zaplnit až 819 obrazových řádků, z nichž je jich zobrazeno pouze 480.
  2. Režim 640×480×16 je velmi podobný režimu předchozímu. Jediný rozdíl spočívá v tom, že jsou využity všechny čtyři bitové roviny, které jsou logicky uloženy „nad sebou”. Od adresy 0xa000:0000 do adresy 0xa000:ffff může být namapována libovolná bitová rovina či dokonce jejich kombinace (ovšem pouze pro zápis, čtení se provádí vždy z jedné bitové roviny). V každé bitové rovině je využito 38400 bytů, celý obraz má tedy velikost 38400*4=153600 bytů. Podobně jako v předchozím režimu je i zde možné zbývající kapacitu bitových rovin vyplnit obrazem, a pomocí scrollování tak využít všech 819 obrazových řád­ků.
  3. Režim 320×200×256 je velmi zvláštní a v některých svých vlastnostech i geniální :-). Pokud si spočteme kapacitu obrazové paměti potřebnou pro uložení obrázku, dojdeme k hodnotě 64000 bytů, tj. zhruba ke kapacitě jedné bitové roviny. Celý obraz by tedy teoreticky mohl být uložen v jedné rovině a zbývající tři bitové roviny by bylo možné využít pro jiné účely (například double či triple buffering). Tak jednoduché to však není (ostatně jde o výrobek IBM). Ve skutečnosti jsou totiž využity všechny čtyři bitové roviny, které jsou zřetězeny tak, že první pixel (celý byte) je uložen v nulté bitové rovině, druhý pixel v první bitové rovině atd. Kolo se uzavírá pro pátý pixel, který je opět uložen v nulté bitové rovině. To znamená, že v každé bitové rovině je vždy využit jeden byte a následující tři byte ve čtveřici zůstávají nevyužity. Tato zřetězená struktura je opět mapována od adresy 0xa000:0000 do adresy 0xa000:ffff tak, že pixely jsou z pohledu procesoru uloženy lineárně v jednom segmentu. Z výše uvedeného je patrné, že tvůrci VGA sice vytvořili grafický režim s absolutně nejjednodušším přístupem ke grafické paměti (ze strany procesoru), který dosud nebyl v tomto ohledu překonán, ale ztratili celých 75 % kapacity obrazové paměti. To však nic nemění na skutečnosti, že tento grafický režim byl použit v mnoha hrách, demech i uživatelských programem.
GFX 14a

Organizace obrazové paměti ve standardním grafickém režimu 320×200 pixelů

6. Rozšířené grafické režimy VGA

Nejznámějším rozšiřujícím grafickým režimem je takzvaný mód X (X-mode). Tento grafický režim se vytvoří tak, že se grafický adaptér nejprve nastaví do standardního grafického režimu 320×200×256 a posléze se provedou dvě operace: vypnutí zřetězení (chaining) bitových rovin a posléze nastavení 240 obrazových řádků. Vypnutím zřetězení se dosáhne toho, že je k dispozici celých 256 kB operační paměti, na druhou stranu se však ztrácí jednoduchá možnost adresace jednotlivých pixelů, protože se musí provádět výběr bitových rovin pro každou čtveřici pixelů (viz následující obrázek). Vhodným výběrem bitových rovin se však zápisem jednoho bytu mohou nastavovat barvy buď jednoho, dvou, tří, nebo čtyř pixelů, což může urychlit některé grafické operace, například vyplňování ploch (tento způsob „snížení rozlišení” byl volitelně použit například i ve hře Doom). Zvýšení počtu zobrazených obrazových řádků z 200 na 240 přináší jednu dobrou a jednu špatnou vlastnost. Dobrou vlastností je, že pixely v tomto režimu jsou čtvercové, což se projevuje například u algoritmů pro kresbu kružnice nebo při zobrazování fotografií. Nevýhodou však je, že se sníží obnovovací frekvence obrazu ze 70 Hz na pouhých 60 Hz.

GFX 14b

Organizace obrazové paměti v grafickém režimu X-mode

Mód X se dá různým způsobem dále modifikovat. Jednou z modifikací je změna vertikálního rozlišení. Poměrně jednoduše jde nastavit 200, 240, 400 a 480 zobrazitelných obrazových řádků. Při 200 a 400 řádcích se používá obnovovací frekvence obrazu 70 Hz, při 240 a 480 řádcích obrazová frekvence 60 Hz. Celkový počet řádků, které se do kapacity bitových rovin vměstnají, je stále roven 819, což znamená, že i v režimu 320×400×256 je možné použít plnohodnotný double buffering, který se velmi jednoduše provádí pouhou změnou počátku zobrazované grafické paměti. Další modifikace spočívá ve výběru druhého krystalu, čímž se zvýší horizontální rozlišení z 320 pixelů na 360 pixelů. Nejvyšší grafické rozlišení v 256 barvách, které by mělo pracovat na všech typech monitorů, tak narůstá na hodnotu 360×480 pixelů. Přeprogramováním registrů CRTC lze zvýšit (či snížit) jak vertikální rozlišení, tak i rozlišení horizontální, některé režimy však nefungují na všech monitorech (zejména na LCD displejích starších notebooků). Jednu dobu byl například populární režim 256×480 pixelů, kde se operace putpixel značným způsobem zjednodušila. Naopak byla k dispozici i rozlišení 400×500 apod., ta však již nebyla stabilní.

7. Další programovatelné funkce grafické karty VGA

Asi nejzajímavější funkcí je podpora horizontálního a vertikálního scrollingu obrazovky. Vertikální scrolling je jednoduchý – změní se počátek vykreslované obrazové paměti. V grafických režimech je k dispozici 819 obrazových řádků, takže scrolling je možný přes více než dvě obrazovky (samozřejmě kromě režimů 640×480×16 a 320×480×256). Pro nastavení horizontálního scrollingu je zapotřebí změnit řídicí registry karty tak, aby se na jeden obrazový řádek alokovalo více byte, než odpovídá počtu zobrazených pixelů – například v režimu 320×240×256 se na jeden řádek alokuje 512 bytů. Potom je možné horizontální scrolling provádět kombinací změny počátku obrazové paměti a změny registru pro scrolling, který způsobí posun po jednotlivých pixelech.

Další zajímavou funkcí, která je však méně známa, je podpora rozdělení obrazovky (screen split) na dvě části. Princip je takový, že v jednom řídicím registru je obsaženo číslo „rozdělujícího” obrazového řádku. Pokud čítač řádků dosáhne této hodnoty, nastaví se počátek obrazové paměti (odkud se vykresluje) na nulovou hodnotu. To znamená, že další obrazový řádek na obrazovce je vykreslován od počátku bitových rovin. Pro efektivní použití rozdělené obrazovky se musí pomocí řídicích registrů nastavit počátek obrazové paměti na hodnotu jinou než nulovou, aby nedocházelo k dvojímu zobrazení obrazu (první obrazový řádek se tak ve skutečnosti nečte z počátku bitových rovin, ale z relativně vzdálených adresových oblastí). Rozdělená obrazovka se typicky používá ve hrách, kdy se horní část obrazovky mění (scrolluje atd.), zatímco v dolní části je zobrazeno skóre a další relativně statické údaje.

Poslední funkcí, která stojí za zmínku, je podpora 512 současně zobrazitelných znaků v textových režimech. Vhodným nastavením registrů grafické karty lze dosáhnout toho, že jeden atributový bit není použit pro specifikaci barvy pozadí, ale pro výběr sekundární znakové sady. Z toho vyplývá, že se v textovém režimu může současně zobrazit 512 různých znaků namísto běžných 256. Sníží se tak sice barevnost dokumentu, ale pro textové editory je takto upravený textový režim takřka ideální (ze známých textových editorů tuto vlastnost podporoval snad jen WordPerfect, ale nemám s ním osobní zkušenost, sám jsem dával přednost českému Matu).

8. Synchronizační signály a jejich časování

Ve své podstatě není grafická karta VGA nic jiného než složitý posuvný registr, který čte data z obrazové paměti a sériovým postupem je přes DA převodník vysouvá na video výstup spolu s generování horizontálních a vertikálních synchronizačních signálů. Celý proces řízení grafického displeje musí být velmi přesně synchronizován, aby na obrazovce monitoru nedocházelo ke vzniku různých artefaktů či ke zkreslení zobrazovaného obrazu. Z tohoto důvodu jsou hodinové frekvence řízeny pomocí oscilátoru s krystalem. Na grafické kartě VGA jsou zabudovány dva krystaly s odlišnou frekvencí: první krystal má frekvenci nastavenu vybroušením na 25,175 MHz, druhý krystal na 28,322 MHz. Výběrem jednoho z krystalů se specifikuje celkový počet pixelů zobrazitelných na jednom obrazovém řádku. Obecně se dá říci, že standardní textové i grafické režimy operují buď s 640, nebo se 720 zobrazitelnými pixely na jednom obrazovém řádku, změnou některých registrů se však tato hodnota může v určitém rozmezí měnit (známé hodnoty 320 a 360 horizontálně zobrazitelných pixelů jsou dosaženy „pouze” zdvojením pixelů). Všimněte si, že podíl obou výše zmíněných frekvencí je roven podílu 720/640.

V typickém hi-res rozlišení grafické karty VGA se využívá frekvence hodinových pulsů nastavená na 25,175 MHz. Tato frekvence je poněkud vyšší než přesná hodnota spočítaná prostým vynásobením celkového počtu pixelů ve snímku snímkovou frekvencí (640×480×60). Je tomu tak kvůli nutnosti generování horizontálních a vertikálních synchronizačních impulsů, a také kvůli vytváření (většinou) tmavých okrajů na obrazovce – v těchto chvílích se z obrazové paměti nečtou žádná data. Tmavé okraje (nazývané border, overscan, blank lines/columns) jsou vytvořeny na každém obrazovém řádku na pravém i levém okraji obrazovky. Je také vytvořeno několik zcela tmavých obrazových řádků na horním a/nebo spodním okraji obrazovky.

V grafickém režimu o rozlišení 640×480 pixelů se používá následující časování: hodinová frekvence je nastavena na 25,175 MHz (je použit první krystal s nižší rezonanční frekvencí), řádková frekvence je rovna 31469 Hz, což odpovídá dvojnásobku řádkové frekvence dle normy NTSC. Obrazová frekvence (tj. počet obnovení obrazu za sekundu) je rovna 59,94 Hz, což opět odpovídá normě NTSC. Vzhledem k takto nastavenému časování je možné poměrně jednoduchým způsobem převést video signál z karty VGA na video vstup televize pracující dle normy NTSC. Je samozřejmě nutné upravit barvovou paletu, protože NTSC nepoužívá RGB kódování barev.

Časování jednoho obrazového řádku v režimu 640×480 vypadá následovně:

  8 pixelů zpoždění mezi horizontální synchronizací a daty
 96 pixelů horizontální synchronizace
 40 pixelů zpoždění mezi daty a horizontální synchronizací
  8 pixelů levý okraj (přenáší se barva)
640 pixelů video signál (data)
  8 pixelů pravý okraj (přenáší se barva)
---------
800 pixelů celkem 

Jak je zvykem, jsou všechny časové údaje uvedeny v „pixelech”, délka trvání jednoho „pixelu” se jednoduše vypočítá z hodinové frekvence 25,175 MHz.

Časování jednoho snímku vypadá následovně:

  2 řádky zpoždění mezi vertikální synchronizací a daty
  2 řádky vertikální synchronizace
 25 řádků zpoždění mezi daty a vertikální synchronizací
  8 řádků horní okraj (přenáší se barva)
480 řádků video signál
  8 řádků dolní okraj (přenáší se barva)
---------
525 řádků celkem 

Časování není opět uvedeno v sekundách, ale v obrazových řádcích, jejichž dobu lze získat z řádkové frekvence 31469 Hz. Také si všimněte celkového počtu řádků, který odpovídá normě NTSC. Norma PAL používá 625 řádků, ale nižší snímkovou frekvenci, takže připojení karty VGA na televizi pracující ve formátu PAL je více problematické a pro její zprovoznění je zapotřebí programově změnit některé registry VGA (nastavit frekvenci krystalu 25,175 MHz, povolit dělení frekvence dvěma, nastavit prokládaný režim a přeprogramovat CRTC tak, aby generoval 625 řádků, z nichž 480 je viditelných).

Pro ilustraci si ještě uveďme časování u grafického režimu s rozlišením 640×350 pixelů, kde již není norma NTSC brána v úvahu. Z tohoto důvodu je možné snížit počet obrazových řádků a současně i zvýšit snímkovou frekvenci na hodnotu 70.086 Hz tak, aby hodinová frekvence a řádková frekvence zůstaly zachovány: 25,175 MHz a 31469 Hz.

Časování jednoho obrazového řádku v režimu 640×350 vypadá následovně:

  8 pixelů zpoždění mezi horizontální synchronizací a daty
 96 pixelů horizontální synchronizace
 40 pixelů zpoždění mezi daty a horizontální synchronizací
  8 pixelů levý okraj (přenáší se barva)
640 pixelů video signál (data)
  8 pixelů pravý okraj (přenáší se barva)
---------
800 pixelů celkem 

Časování jednoho snímku je však odlišné:

 31 řádky zpoždění mezi vertikální synchronizací a daty
  2 řádky vertikální synchronizace
 54 řádků zpoždění mezi daty a vertikální synchronizací
  6 řádků horní okraj (přenáší se barva)
350 řádků video signál
  6 řádků dolní okraj (přenáší se barva)
---------
449 řádků celkem 

Standardní textový režim se od grafických režimů odlišuje v tom, že místo krystalu o frekvenci 25,175 MHz se používá krystal s rezonanční frekvencí nastavenou na 28,322 MHz. Díky vyšší frekvenci je možné dosáhnout většího horizontálního rozlišení, které je rovno 720 pixelům, namísto běžných 640 pixelů. Také se zvýšila obnovovací frekvence obrazu ze 60 Hz na 70 Hz, současně však došlo ke snížení vertikálního rozlišení na 400 řádků (z původních 480).

ict ve školství 24

9. Obsah dalšího pokračování

Další pokračování tohoto seriálu již bude konečně věnováno grafickým akcelerátorům, a to jak pro počítače PC, tak i pro grafické stanice. Nejprve si popíšeme základní funkce karet SVGA, z nichž některé obsahují zárodek grafického akcelerátoru, a potom již bude řeč o skutečně profesionálních řešeních.

Autor článku

Vystudoval VUT FIT a v současné době pracuje na projektech vytvářených v jazycích Python a Go.