(3D) Grafika a video pod Linuxem


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.

X11

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.

MIT-Shm

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.

PEX

Ř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í.

Open-GL

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.

Mesa

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.

XFree 4.0 a Direct Rendering Infrastructure

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

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í.

SVGAlib

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.

Frame buffer

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.

GGI

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

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.

AA

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.