Linux se ve většině návrhových rysů drží UNIXu, jehož autoři se však grafikou
nezabývali (v roce 1972 to nebylo příliš aktuální). Během dlouholetého vývoje
UNIXu vzniklo mnoho více či méně úspěšných projektů, které mají za úkol tento
nedostatek odstranit. V oblasti GUI dnes jednoznačně zvítězily X, které jsem
zmiňoval předminule. Dnes se zaměřím zejména na potřeby programátorů her a
jiných multimediálních aplikací, kteří mají zcela jiné potřeby, než pro které
bylo původně X11 navrženo.
X svým návrhem příliš neodpovídá potřebám dnešních
multimediálních aplikací. Oddělení aplikace a grafického serveru do dvou
nezávislých programů je sice velice dobrý nápad, ale není zadarmo. Pokud
aplikace chce cokoliv zobrazit, musí buď použít primitiv podporovaných X
serverem (které byly navrženy pro potřeby zobrazování GUI a pro hry se příliš
nehodí) a nebo si obrázek nakreslit "u sebe" a pak jej poslat na server. Přitom
je nutné obrázek zkopírovat do výstupního bufferu, načíst serverem,
případně zkonvertovat do reprezentace použité videokartou a pak teprve
zobrazit. To značně zdržuje a navíc tím aplikace ztrácí veškerou možnost
využití akcelerací videokarty, které jsou dostupné jen pomocí primitiv
podporovaných X serverem, které ale nemají žádnou podporu pro 3D a video.
První řešení se objevilo už v roce 1989 přidáním rozšíření jménem MIT-SHM. To
umožňuje sdílet část paměti mezi X serverem a aplikací, která se pak používá
pro vykreslování. Díky tomu se ušetří veškeré kopírování obrazu před jeho
zobrazením a pro potřeby 2D her v podstatě postačuje. Problémem zůstává
hardwarová akcelerace a navíc některé triky často hrami využívané (čekání na
refresh obrazovky, změna grafických režimů apod.) jsou stále nedostupné.
Používání MIT-SHM je také docela obtížné, protože aplikace by měla podporovat
zobrazování do i těch nejpodivnějších hardwarů, které X za 15 let své existence
podporovaly. To není snadný úkol i přesto, že X má docela pěknou abstrakci
nad formáty.
Řešením pro 3D grafiku se měl stát PEX, který byl vyvinut firmou Digital a
Hewlet Packard v letech 1987-1991. Jedná se o implementaci grafického rozhraní
jménem PHIGS, které se mělo stát standardem pro grafické aplikace. Jeho návrh
je shodný s návrhem X11 - aplikace posílá příkazy v podobě grafických
primitiv (nyní ale primitiva zahrnují 3D funkce) a o jejich zobrazování se
stará X server. Tento slibný pokus se ale neujal. Vyjma několika screen saverů
neznám žádnou aplikaci, která by PEX využívala a navíc ani X servery většinou
nemají podporu pro hardwarovou akceleraci při zobrazování.
Rozumnou 3D grafiku přinesla až firma SGI. Open-GL je specifikace grafického
API podporující velké množství primitiv včetně 3D grafiky. Její implementace
dnes existuje na všech moderních platformách a stává se de facto standardem.
Lze použít jak pro psaní jednoduchých 2D aplikací, tak i pro opravdové 3D hry
a modeláře.
Samotné Open-GL specifikuje pouze kreslení (a i samotná inicializace je
závislá na platformě), existuje ale doplňková knihovna Glut, která zařídí
zbytek a umožňuje tak psát opravdu přenositelné grafické aplikace.
Firma SGI navíc navrhla protokol GLX pro zařazení Open-GL do X serveru a
jejich implementace už delší dobu podporuje přímý přístup aplikací k hardwaru.
Open-GL byl ale komerční standard a SGI neuvolnila jeho free softwarovou implementaci.
Dokonce i název Open-GL mohou nosit jen ty implementace, které prošly placenými testy
na shodu se standardem.
Díky tomu vznikl projekt Mesa, který zahájil v roce 1995 Brian Paul s cílem vytvořit
free softwarovou implementaci Open-GL pro Amigu. Svoji knihovnu však Open-GL nazvat
nemohl, protože neplánoval zaplatit poplatky za otestování a proto ji pojmenoval Mesa.
Dnes ve verzi 3.1 je Mesa plnohodnotnou a i docela rychlou (nejdůležitější funkce jsou
k dispozici i v x86 assembleru s podporou MMX a 3DNOW!) implementací Open-GL.
Problémem Mesy ale zůstala podpora 3D hardware. Přímý přístup k hardwaru z
uživatelské knihovny nejenom odporuje filosofii UNIXu, ale přináší i mnohá jiná
úskalí (Mesa se nesmí pohádat s ostatnímy programy - X serverem apod.). Na
konečném řešení tohoto problému pracuje firma Precision Insight, která byla za
tímto účelem také založena.
Na březen je plánována release nových XFree 4.0, které
budou obsahovat rozšíření jménem DRI. To snad bude zprostředkovávat jak
renderování grafických primitiv pomocí protokolu GLX a Mesy zabudované do X
serveru, tak i přímý přístup na hardware s aplikace. Navíc bude podpora 3D
akcelerací přímo v grafickém driveru pro XFree, který nyní bude oddělený modul.
To značně zjednoduší vývoj grafických driverů pod Linuxem a umožní firmám
distribuovat drivery i ve formě binárních modulů použitelných na všech
podporovaných platformách se stejným procesorem. Snad se tím vyřeší problém s
nedostatkem driverů pro 3D karty.
První alphaverze vypadají velice slibně a tak doufám, že se můžeme těšit na 3D
grafiku alespoň v kvalitě srovnatelné s DirectX pod Windows. Navíc XFree 4.0
slibují i mnoho dalších rozšíření - podporu pro multithreading (a tak se snad
už nebude kurzor myši zastavovat při vytížení X serveru), true type fonty,
hardwarové přehrávání MPEG animací, lepší akcelerace atd.
DGA je další rozšíření X serveru. Tentokrát má za úkol zprostředkovat přímý
přístup do videoram podobně jako DirectDraw interface ve Windows. Jedná se o
rozšíření specifické pro XFree, ale nabízí docela schůdnou cestu jak psát
fullscreen aplikace (a nebo aplikace používající přímého přístupu pro
zobrazování v okenním prostředí). Podporuje některé vymoženosti jinak v
prostředí X nedostupné jako je přepínání videomódů a hardwarový scroling. Dnes
jej podporuje několik her (například quake) a přehrávačů MPEGového videa. Celé
API je velice low level a není zrovna nejlépe zdokumentované a tak je dobré se
rozhlédnout po některých knihovnách, které jej překryjí.
X není jedinou cestou ke grafice pod Linuxem. Jedním z nejstarších
alternativních metod je SVGAlib. To je jednoduchá knihovna zprostředkující
základní grafické operace podobně jako grafické knihovny pod DOSem. Pro jejich
provádění používá přímého přístupu k hardwaru a to je i její hlavní slabinou.
Programy pod SVGAlib vyžadují rootovská práva a způsobují tak potencionální
security hole. Navíc pokud SVGAlibový program spadne, často nechá konzoli v
grafickém režimu a uživatel pak nevidí, co dělá (a často ani nic dělat nemůže,
jelikož jeho klávesnice je zablokovaná). SVGAlib je tak jednou z
nejjednodušších metod jak schodit Linuxe.
Dnes se na jejím vývoji už téměř nepracuje a tak ani podpora nových videokaret
není valná. Od verze 1.3.0 ale dokáže využít VESA BIOS a tak je na většině
moderních karet provozuschopná. Její výhoda spočívá zejména v jednoduchosti,
nenáročnosti a podobnosti DOSovému API a tak ji stále používají některé hry.
Poslední verze Linuxových kernelů přinesly další zajímavou alternativu. Podpora
emulace textových konzolí v grafickém režimu (která je stejně nutná na většině
ne-intelových platforem, kde textový režim videokarty často vůbec neumí) byla
zobecněna a kernel nyní nabízí jednoduchý interface pro grafiku. Pomocí
speciálního zařízení /dev/fb? je možné nastavovat grafické režimy,
přistupovat k videopaměti a nastavovat paletu. Není však k dispozici žádná
cesta, jak využít hardwarových akcelerací a navíc i podpora grafiky v kernelu
je velice jednoduchá - podporuje několik známějších videokaret a VESA
interface.
Velice ambiciózním projektem na vyřešení všech problémů s grafikou pod Linuxem
je GGI. Jeho primárním cílem je vytvořit grafické drivery jako nahrávatelné
moduly přímo do kernelu. Tím by se zamezilo situacím, kdy uživatelský proces
zprostředkovávající grafiku spadne a kernel není schopen uvést konzoli zpět do
použitelného stavu. Projekt však za mnoho let své existence tento cíl splnit
nedokázal stal se zajímavý z jiných důvodů. Jeho aplikační knihovna podporuje
výstup nejenom do tohoto kernelového interface, ale i do mnoha jiných knihoven
- SVGAlib, X11, Windows, AA-lib atd.
SDL je knihovna snažící se zjednodušit psaní her (a podobných programu) pod
Linuxem, Win32 a BeOS. Přináší jednoduchý, jednotný a velmi rychlý přístup k
audiu, videu a dalším potřebným periferiím. Od nedávného zveřejnění verze 1.0
její popularita stále stoupá a dnes ji používá mnoho nových her. Na vývoji se
valnou částí podílí firma Loki (zabývající se vývojem Linuxových verzí některých
komerčních her) a jsou k dispozici i některé rozšiřující knihovny - pro
přehrávání MPEGů, mixování zvuku, nahrávání obrázků apod.
K výstupu pod Linuxem může využít buď Xlib, MIT-Shm, nebo DGA.
A pro ty trpělivé, kteří dočetli článek až sem, proč nakonec neuvést mé osobní
a konečné řešení všech problémů s grafikou pod Linuxem. AA-lib je grafická
knihovna, která ke svému výstupu používá textový mód. Díky tomu veškeré
problémy s inicializací grafiky a hardwarovou 3D akcelerací odpadají.
Hardwarově akcelerovaný textový režim má dnes téměř každá videokarta a pomocí
AA-lib můžete změnit i svoji 386 s herculesem v grafické pracoviště.
Předpokládám tedy ze veškeré výše zmiňované projekty upadnou brzo v zapomnění.
Dnes AA-lib podporuje mnoho programů a knihoven. Pomocí GGI můžete pod AA-lib
spustit X11 a pomocí AA-VGA některé SVGAlibové aplikace - a zahrát si Quake v
textovém režimu zase není tak špatný nápad.