MASARYKOVA UNIVERZITA

Fakulta informatiky

BAKALÁŘSKÁ PRÁCE

Využití API grafického chipu 2700G

2008 Vladimír HYNEK

Masarykova univerzita Fakulta informatiky

ZADÁNÍ BAKALÁŘSKÉ PRÁCE

Datum: 20.11.2007

Student(ka): Vladimír Hynek, učo 98669 Program: FI BAP Aplikovaná informatika

Vedoucí práce: Mgr. Tomáš Gregar, učo 4099

Katedra (pracoviště): Katedra počítačových systémů a komunikací Fakulta informatiky

Název práce: Využití API grafického chipu Intel 2700G (Usage of Intel 2700G graphics API)

Zadání: PDA se v poslední době mění v plnohodnotné kapesní počítače. Jedním z nástrojů, které tomu po máhají, je grafický čip Intel 2700G; jeho možnosti odpovídají standardní grafické kartě. Má zve řejněné API, technickou a programátorskou dokumentaci.

Úkolem studenta je získat informace o tomto čipu a nastudovat jeho API. Výstupem práce pak bu de přehled vlastností a schopností daných API a aplikace, tyto možnosti zobrazující. Bude se jednat o

••• grafický výstup na externí monitor ve vyšším rozlišení, než je nativní rozlišení displeje

••• aplikace pracující s OpenGL ES, které je 2700G hardwarově urychlováno

Základní literatura: dokumentace obsažená v Intel 2700G SDK (3D API developer's guide, Video API refe rence paper, Display Configuration SDK Application Note paper)

Intel 2700G Multimedia Accelerator Datasheet

Introduction to Development Tools for Windows Mobilebased Devices http://msdn2.microsoft.com/enus/library/ms838188.aspx

Souhlas se zadáním (podpis, datum)

ii Poděkování

Na tomto místě bych chtěl velmi poděkovat všem, kteří mě v průběhu práce podporovali. Můj dík patří především vedoucímu práce Mgr. Tomáši Gregarovi za podnětné připo mínky a zapůjčení testovacího zařízení.

Prohlášení

Prohlašuji, že tato práce je mým původním autorským dílem, které jsem vypracoval samostatně. Všechny zdroje prameny a literaturu, které jsem při vypracování používal nebo z nich čerpal, v práci řádně cituji s uvedením úplného odkazu na příslušný zdroj.

iii Shrnutí

Tato práce si klade za cíl soustředit na jednom místě nejpodstatnější informace o čipu Intel 2700G a jeho API. Podává čtenáři popis existujících nastavení akcelerátoru pro střednictvím funkcí API a poukazuje na možné kombinace a úpravy těchto funkcí, za účelem maximálního využití schopností čipu. Rovněž nabízí stručný úvod do progra mování grafiky pro zařízení typu PDA. Popsané postupy ilustruje ve dvou ukázkových aplikacích. První z nich využívá API čipu k vytvoření grafického výstupu pro externí displej o vyšším rozlišení než je nativní rozlišení interního displeje PDA. Druhá pak na jednoduchém modelu demonstruje další z hlavních součásti API a sice OpenGLES. V neposlední řadě práce sumarizuje dostupné zdroje a odkazy tak aby mohla sloužit jako informační základ pro vývoj dalších aplikací.

iv Klíčová slova

Intel 2700G, akcelerace, API, OpenGLES, displej, povrch, video, komprese

v Obsah

1 Úvod ...... 1 2 Vznik a charakteristika akcelerátoru Intel 2700G...... 2 2.1 Parametry čipu ...... 3 2.2 Vnitřní struktura čipu ...... 3 3 Využití externího displeje ...... 5 3.1 Princip zobrazování dat ...... 5 3.2 Ovladač akcelerátoru a jeho konfigurace ...... 7 3.3 Aplikace BP_DualDisplay ...... 11 4 OpenGLES ...... 16 4.1 OpenGL a Intel 2700G ...... 16 4.2 Akcelerované funkce pro 2D grafiku ...... 17 4.3 Akcelerované funkce pro 3D grafiku ...... 18 4.4 Aplikace BP_OGLES_demo ...... 21 5 Akcelerace videa ...... 23 6 Závěr ...... 24 Literatura ...... 25 Přílohy ...... 26

vi Kapitola 1

Úvod

Počítače řady PC již několik let svými parametry bohatě dostačují pro plnění základ ních požadavků uživatelů, jako je editace textu, přístup k emailovým službám a Inter netu, přehrávání multimédií či programování hardwarově nenáročných aplikací. Po dobná situace panuje i v případě přenosných počítačů typu notebook, které díky ros toucímu výkonu a klesající ceně zaznamenaly velké rozšíření a směle konkurují tra dičním desktopům. Mnoho vývojářů se proto stále častěji místo na zvyšování výkonu zaměřuje především na miniaturizaci a snižování energetických nároků zařízení a tím umožňuje jejich lepší mobilitu. V posledních několika letech se proto na trhu sále čas těji objevují kapesní počítače typu PDA, jejichž cena je mnohdy srovnatelná s cenou mobilních telefonů vyšší třídy. Zatímco dříve sloužily kapesní počítače spíše jen jako diáře a organizéry, dnes se z nich stávají téměř plnohodnotné komunikační a multime diální nástroje. Samozřejmostí jsou textové a tabulkové procesory, prezentační pro gramy, multimediální aplikace, Internetové prohlížeče, hry a mnoho dalších aplikací. Také grafika těchto zařízení prodělala v posledních letech značný vývoj. Postupný přechod od dvou ke trojrozměrné akcelerované grafice otevírá stále více možností pro spolupráci výrobců hardwaru s vývojáři softwaru. Ta umožňuje jednak zkvalitnění hardwarových technologií a jejich přizpůsobení potřebám uživatele a jednak rychlejší vývoj softwaru pro nová zařízení. Proto firma Intel zveřejnila API a SDK ke svému multimediálnímu grafickému akcelerátoru Intel 2700G, což otevřelo cestu k jeho prak tickému využití. Čip vznikal v podmínkách silného konkurenčního prostředí a několikrát změnil majitele, což se neblaze podepsalo na jeho dokumentaci a tím i na možnostech a rych losti implementace. To však nic nemění na tom, že se jedná o kvalitní nástroj moderní počítačové grafiky s širokou škálou využití. Jeho silnou stránkou je možnost konfigu race grafických vstupů a výstupů, včetně využití externího displeje. Rovněž hardwaro vě urychluje celou řadu funkcí používaných ve 2D a 3D grafice. V neposlední řadě na bízí rozšíření multimediálních schopností PDA o integrovanou podporu pro přehrávání a dekompresi videa. Tyto tři hlavní okruhy také tvoří základní stavební kameny zveřejněného API a v následujících kapitolách je podrobněji rozebereme.

1 Kapitola 2

Vznik a charakteristika akcelerátoru Intel 2700G

Tato úvodní kapitola nabízí čtenáři stručnou historii a důvody vzniku grafického akce lerátoru. Popisuje parametry a vnitřní strukturu čipu, jejíž znalost má zásadní význam pro pochopení funkcí jednotlivých částí API, prezentovaných v dalším textu.

Požadavky na další a další nástroje, kvalitněji zpracované uživatelské rozhraní, vyšší rozlišení displeje, rychlejší zpracování procesů a delší životnost baterie s sebou přiná šejí i rostoucí nároky na hardware PDA. Integrace barevných displejů s vyšším rozli šením, kvalitnějšího zvuku a větší paměti umožnilo u mobilních telefonů a PDA ná stup lépe graficky zpracovaných aplikací včetně her. Byly to mimo jiné hry, které do nutily vývojáře zamýšlet se nad implementací trojrozměrné grafiky pro mobilní telefo ny a kapesní počítače. Vzniká tak paralela s desktopovými počítači, kde také přede vším hry uspíšily nástup 3D grafiky. Rostoucí funkcionalita a klesající cena zvýšily poptávku po mobilních zařízeních a tím i poptávku jejich producentů po výkonnějších hardwarových technologiích. Na konci 90. let pokrývala polovinu trhu s procesory pro mobilní telefony firma Texas Instruments, následovaná Qualcomm Inc. Intel se chtěl jako největší výrobce desktopových a serverových procesorů podílet i na tomto trhu, který sliboval nemalé zisky, a proto v posledních deseti letech investoval značné finanční prostředky do vý voje řady procesorů Intel PXA a grafických akcelerátorů Intel 2700G, určených pro mobilní zařízení. V roce 2002 koupil Intel od firmy Imagination Technologies jádro grafického akcelerátoru s názvem PowerVR MBX a vystavěl nad ním čip Intel 2700G s kódovým označením Marathon. Ten byl poprvé představen 12. dubna 2004 na konfe renci IDF (Intel Developer Forum) v Tchajpeji na Tchajwanu. Intel se však na trhu s mobilními produkty výrazněji neprosadil a v rámci restrukturalizace firmy výše uve dené technologie v roce 2006 prodal společnosti Marvell Technology. Po této transakci byla bohužel z internetových stránek Intelu odstraněna veškerá dokumentace o akcelerátoru. Jak vyplynulo z mojí komunikace se zástupci firmy, byla stejně jako akcelerátor, převedena do vlastnictví Marvell Technology. Tato společnost bohužel doposud nezveřejnila o čipu jakékoliv informace, ani nereagovala na e mailový kontakt. Proto jsou v současné době existující dokumenty špatně dostupné a neúplné. K pochopení funkcionality API tak vývojářům často nezbývá, než studovat stovky řádků jeho řídce okomentovaných zdrojových kódů. I přesto je možné tyto akcelerátory nalézt v několika vyráběných přístrojích, napří klad Dell Axim X50v, Dell Axim X51v a Pepper Pad.

2 2.1 Parametry čipu

Čip je vyroben 130 nm technologií a je uzavřen v pouzdře o velikosti 14x14 mm. Jádro čipu pracuje s frekvencí 75 MHz, s interní cache pamětí komunikuje pomocí sběrnice o šířce 32b, frekvenci 100 nebo 133 MHz a teoretickou propustností 400 respektive 533 MB/s. V současné době existuje ve třech verzích 2700G3, 2700G5 a 2700G7, které se liší velikostí integrované cache paměti a tím i svým zaměřením. Verze G5 a G7 jsou urče ny především k pokrytí požadavků na výkon, zatímco verze G3 vyniká nižšími energe tickými nároky. Intel 2700G3 obsahuje 384KB, Intel 2700G5 a G7 704KB cache pa měti. Intel 2700G7 navíc obsahuje lokální paměť typu SDRAM o velikosti 16MB. Intel 2700G je schopen dosáhnout rozlišení SXGA (1280 x 1024 x 16bpp) nebo XGA (1024 x 768 x 24bpp) při obnovovací frekvenci 60Hz. Rovněž podporuje pře hrávání videa ve formátech MPEG1 a MPEG2 o rozlišení až 720x480 a MPEG4 a Windows Media o rozlišení až 640x480, při nejméně 30 snímcích za sekundu. Všechny verze tohoto čipu jsou optimalizovány pro podporu procesorů Intel PXA250, PXA255 a řady PXA26x a PXA27x. Tyto procesory v sobě mimo jiné inte grují technologii Wireless MMX, pro podporu multimédií a technologii Wireless Intel SpeedStep, která umožňuje v závislosti na běžících aplikacích měnit frekvenci a napětí na procesoru a tím redukovat množství energie odebírané z baterie.

2.2 Vnitřní struktura čipu

Grafický akcelerátor se skládá z několika hlavních částí a rozhraní, jejichž prostřednic tvím komunikuje se svým okolím uvnitř PDA (viz. obrázek 2.1):

Řadič grafického akcelerátoru – řídí zobrazování dat a nastavení LCD přepínače

LCD přepínač – zajišťuje směrování příslušných proudů obrazových dat podle poža dovaného nastavení, spolu s řadičem akcelerátoru tvoří jeho jádro.

LCD vstup – vstup pro obrazová data z procesoru. Datový proud může být LCD pře pínačem dále směrován na interní či externí výstup

Výstup pro primární (interní) displej – obrazová data pro primární displej

Výstup pro sekundární (externí) displej – obrazová data pro sekundární displej

Integrovaná cache paměť

Lokální grafická paměť – pouze u verze Intel 2700G7

Systémová sběrnice – určená pro komunikaci mezi grafickým čipem a procesorem, slouží především pro zasílání řídících informací grafickému ak celerátoru

3

Obrázek 2.1: Schéma grafického akcelerátoru Intel 2700G

4 Kapitola 3

Využití externího displeje

Tato kapitola nabízí popis první ze tří hlavních částí API grafického akcelerátoru, která slouží především ke konfiguraci LCD přepínače. Nejprve je věnována pozornost prin cipu zobrazování dat akcelerátorem a je uveden přehled dostupných nastavení. Dále kapitola popisuje konkrétní možnosti komunikace s čipem, které pak využívá v závěrečné části, zabývající se vývojem aplikace BP_DualDisplay.

3.1 Princip zobrazování dat

Pokud abstrahujeme od fyzikální podstaty zobrazování dat na konkrétním typu monito ru, jsou obrazová data reprezentována maticí bodů (pixelů) o velikosti šířka x výška zobrazované oblasti. Podle velikosti barevné hloubky je každý pixel popsán přísluš ným počtem bitů. Pokud například uvážíme barevnou hloubku 16bpp (bits per pixel, bodů na pixel), je každý bod reprezentován 16 bity a jeho barva může tedy nabývat 2 16 = 65536 různých hodnot. Všechny pixely pokrývající zobrazovanou oblast jsou v paměti uloženy v poli o příslušné velikosti. Toto pole je rovněž označováno jako po vrch (surface nebo také off screen surface). Existují tři druhy povrchů: Intel 2700G rozlišuje Desktop a Secondary surface, procesor Intel PXA potom XScale surface. Desktop je standardní povrch pro grafický výstup operačního systému a aplikací. Slouží především k zobrazování uživatelské plochy PDA a jeho rozměry a bitová hloubka odpovídají parametrům interního disple je. Secondary surface je naproti tomu povrch s volitelnými rozměry i obsahem. Oba tyto povrchy jsou určené k zobrazení prostřednictvím akcelerátoru Intel 2700G. XSca le surface je povrch určený pro zobrazení prostřednictvím procesoru Intel PXA. Nezávisle na typu povrchu, jsou pixely z paměti čteny od začátku pole směrem k jeho konci a zobrazovány na monitoru zleva doprava, od shora dolů. Vykreslení ob sahu povrchu na displej zajišťuje zobrazovací řadič. Systémy založené na procesorech Intel PXA a akcelerátoru 2700G mohou s výhodou využívat dvou těchto řadičů. Jeden je vestavěn přímo v procesoru a druhý v grafickém akcelerátoru. Pomocí LCD přepí nače je možné určit, který výstup bude ovládán kterým řadičem a zda se na oba výstu py bude posílat povrch s identickým či rozdílným obsahem. Vznikají tak následující možnosti zapojení:

3.1.1 Připojen pouze interní displej Ve výchozím nastavení je k vykreslení povrchu určen řadič akcelerátoru. Data obsaže ná v povrchu Desktop putují od řadiče do LCD přepínače, který je směruje na výstup pro interní displej. Pokud z nějakého důvodu požadujeme aby vykreslování řídil zob razovací řadič procesoru, je nutné nejprve zajistit aby v případě změny v povrchu Desktop došlo k jeho zkopírování do povrchu XScale. Data z tohoto povrchu pak putu jí přes zobrazovací řadič procesoru a LCD vstup akcelerátoru k LCD přepínači, který je směruje na výstup pro interní displej.

5 3.1.2 Připojen interní i externí displej Pokud je kromě interního připojen i externí displej, můžeme zvolit, zda oba displeje budou zobrazovat stejný nebo rozdílný obraz.

3.1.2.1 Interní a externí displej se stejným obrazem Zobrazovací řadič grafického akcelerátoru může ovládat oba displeje za před pokladu, že akceptují stejné parametry (rozlišení, barevnou hloubku, obnovo vací frekvenci). Potom je povrch Desktop směrován na výstup jak pro interní, tak i pro externí displej. Je možné také zvolit variantu, kdy je jeden z displejů ovládán řadičem pro cesoru a druhý řadičem grafického akcelerátoru. Vzhledem k předpokladu, že externí displej nabízí kvalitnější parametry, bude tento zpravidla ovládán řadi čem akcelerátoru, který dosahuje vyšších výkonů. Potom bude povrch Desktop směrován na výstup pro externí displej. Obdobně jako v případě samostatného interního displeje bude nutné zajistit kopírování Desktopu do povrchu XScale. Ten pak bude řadičem procesoru přes LCD přepínač vykreslován na interní displej. Poslední a ne příliš doporučovanou variantou je ponechat zobrazování obou displejů pouze na řadiči procesoru. Znamená však enormní zátěž procesoru, která se projeví v plynulosti vykreslování a chodu aplikací. Maximální dosaži telné rozlišení je v této konfiguraci pouze 800x600px.

3.1.2.2 Interní a externí displej s rozdílným obrazem Zde vstupuje do hry povrch Secondary surface, který může mít jiné rozměry než povrch Desktop a může být směrován na výstup s odlišnou obnovovací frekvencí než na které pracuje interní displej. O naplnění jeho obsahu se musí starat aplikace, která jej využívá. Tento povrch je poté prostřednictvím grafic kého akcelerátoru načítán a směrován na výstup pro externí displej. Pokud na interním displeji požadujeme zobrazenou plochu operačního systému, musíme v případě změny povrchu Desktop zajistit jeho kopírování do povrchu XScale, stejně jako v předchozím případě.

6 3.2 Ovladač akcelerátoru a jeho konfigurace

Ovladač akcelerátoru umožňuje zjišťovat a měnit nastavení pomocí několika výčto vých typů, struktur a funkce ExtEscape (viz. příloha B a C). Pochopení jejich základní funkcionality a provázanosti je základním stavebním kamenem k využití čipu Intel 2700G. Nejprve si uvedené typy a struktury stručně popíšeme a následně ukážeme je jich aplikaci v praxi.

3.2.1 Výčtové typy

3.2.1.1 DCFG_DISPLAY_SURFACE

typedef enum _DCFG_DISPLAY_SURFACE_ { DCFG_DESKTOP, DCFG_SECONDARYSURFACE, } DCFG_DISPLAY_SURFACE;

Akcelerátor 2700G rozeznává 2. typy povrchů: Desktop a Secondary surface, které identifikuje jako DCFG_DESKTOP a DCFG_SECONDARYSURFACE.

3.2.1.2 DCFG_LCD_SOURCE

typedef enum _DCFG_LCD_SOURCE_ { DCFG_SOURCE_MARATHON, DCFG_SOURCE_XSCALE, DCFG_SOURCE_NOT_APPLICABLE, } DCFG_LCD_SOURCE;

Každému ze dvou grafických výstupů je přiřazen zdroj datového proudu. Buď jde o Intel 2700G (označovaný v dokumentaci též jako Marathon) nebo o proce sor Intel PXA s technologií Intel XScale. Pokud je daný grafický výstup vypnut, přiřadíme mu jako zdroj typ DCFG_SOURCE_NOT_APPLICABLE.

3.2.1.3 DCFG_LCD_IN_FORMAT

typedef enum _DCFG_LCD_IN_FORMAT_ { DCFG_LCD_IN_555, DCFG_LCD_IN_556, DCFG_LCD_IN_565, DCFG_LCD_IN_655, DCFG_LCD_IN_665, DCFG_LCD_IN_666, DCFG_FORMAT_NOT_APPLICABLE, } DCFG_LCD_IN_FORMAT;

Tento typ určuje datový formát pixelů, které akcelerátor získává prostřednictvím LCD vstupu od grafického řadiče procesoru. Číslo na konci typu udává způsob uložení pixelu v paměti. 555 a 556 jsou 15 bitové, 565, 655 a 665 16 bitové a 666 18 bitový formát. U typů 556 a 665 je nejvyšší bit nedefinovaný. Pixel je v paměti uložen ve formátu RGB a každá číslice udává počet bitů pro uložení dané barevné složky. Například 565 znamená 5 bitů pro červenou (Red), 6 bitů pro zelenou (Green) a 5 bitů pro modrou (Blue) složku.

7 3.2.2 Struktury

3.2.2.1 DCFG_CONNECT_SURFACE

typedef struct _DCFG_CONNECT_SURFACE_ { DCFG_DISPLAY_SURFACE eSurface; ULONG ulBorderColor; ULONG ulRefreshRate; ULONG ulPhysRotation; } DCFG_CONNECT_SURFACE;

Struktura udává, který povrch bude akcelerátor vykreslovat, jestli Desktop nebo Secondary surface. ulBorderColor určuje barvu ohraničení povrchu, pokud je vyžadována, ulRefreshRate obnovovací frekvenci a ulPhysRotation otočení displeje ve stupních.

3.2.2.2 DCFG_SWITCH_LCD

typedef struct _DCFG_SWITCH_LCD_ { BOOL bValid; BOOL bActivate; DCFG_LCD_SOURCE eLcdSource; DCFG_LCD_IN_FORMAT eXScaleFormat; } DCFG_SWITCH_LCD;

Struktura, která slouží k nastavení jednoho z grafických výstupů pomocí LCD přepínače. Aby přepínač nastavil parametry uvedené v následujících proměn ných, musí být bValid nastaveno na TRUE . bActivate aktivuje a deaktivuje daný výstup. eLcdSource určuje, zda zdrojem dat pro výstup bude grafický řadič ak celerátoru nebo procesoru. Pokud je bActivate FALSE , uvádíme v tomto para metru DCFG_SOURCE_NOT_APPLICABLE . eXScaleFormat je formát pixelů pocházejících z grafického řadiče procesoru a je platný pouze pokud je eLcd- Source nastaven na DCFG_SOURCE_XSCALE , jinak musí tento parametr obsahovat DCFG_FORMAT_NOT_APPLICABLE .

3.2.2.3 DISPCFG_DISPLAY_SYSTEM

typedef struct _DISPCFG_DISPLAY_SYSTEM_ { BOOL bSet; DCFG_SWITCH_LCD sLcdInternal; DCFG_SWITCH_LCD sLcdExternal; DCFG_CONNECT_SURFACE sConnectSurface; } DISPCFG_DISPLAY_SYSTEM;

Asi nejdůležitější struktura, která pomocí předcházejících struktur a výčtových typů uchovává informace o nastavení LCD přepínače pro interní a externí displej a o povrchu připojeném k akcelerátoru. bSet nastavujeme na TRUE pokud do struktury zapisujeme a na FALSE pokud ze struktury čteme. sLcdInternal a sL- cdExternal jsou struktury popisující konfiguraci výstupů pro interní a externí displej.

8 3.2.2.4 DISPCFG_CREATE_SURFACE typedef struct _DISPCFG_CREATE_SURFACE_ { WORD wWidth; WORD wHeight; } DISPCFG_CREATE_SURFACE;

Ovladač čipu Intel 2700G umožňuje vytvořit zcela nový povrch s vlastními roz měry a využívat jej jako vstup grafických dat. Struktura slouží pro uchování šířky a výšky tohoto povrchu.

3.2.2.5 SURFACE_PHYSICAL_VIEW typedef struct _SURFACE_PHYSICAL_VIEW_ { ULONG ulPhysAddress; ULONG ulWidth; ULONG ulHeight; ULONG ulStride; ULONG ulBpp; BOOL bDriverRealigned; LONG lPhysicalRotation; } SURFACE_PHYSICAL_VIEW;

Spolu se strukturou DISPCFG_GET_SURFACE_INFO slouží tato struktura pro získání a uložení fyzických informací o daném povrchu. ulPhysAddress představuje fyzickou adresu v paměti, na které je povrch uložen. ulWidth a ulHeight popisují šířku a výšku povrchu v pixelech. ulStride udává šířku povrchu v bytech a slouží především k určení, zda došlo k rotaci povrchu (záměnu hodnot šířky a výšky) či nikoliv. Rovněž je možné jej použít pro výpočet celkové velikosti povrchu. ulBpp představuje barevnou hloubku povrchu v bitech na pixel. bDriverRealigned je nastaven na hodnotu TRUE pokud došlo ke změně velikosti nebo k rotaci povrchu. lPhysicalRotation je úhel ve stup ních o který byl povrch rotován.

3.2.2.6 DISPCFG_GET_SURFACE_INFO typedef struct _DISPCFG_GET_SURFACE_INFO_ { DCFG_DISPLAY_SURFACE eDisplaySurface; SURFACE_PHYSICAL_VIEW sPhysSurfaceInfo; } DISPCFG_GET_SURFACE_INFO;

Ve spojení se strukturou SURFACE_PHYSICAL_VIEW slouží k získání fyzických informací o konkrétním povrchu, jehož identifikátor je uveden v eDisplaySurface .

9 3.2.2.7 DISPCFG_ACQUIRE_LOCK

typedef struct _DISPCFG_ACQUIRE_LOCK_ { BOOL bAcquire; BOOL bRelease; BOOL bSuccess;

} DISPCFG_ACQUIRE_LOCK;

Struktura používaná pro uzamčení grafického akcelerátoru konkrétní aplikací a pro uvolnění tohoto zámku při ukončování aplikace. Aktivace zámku je nutná vždy před přístupem aplikace ke zdrojům a nastavením, se kterými akcelerátor pracuje. Zámek je aktivní pokud je bAcquire rovno TRUE a bRelease FALSE . V tu chvíli nemůže k nastavení akcelerátoru přistupovat žádná jiná aplikace. Uvolnění zámku docílíme nastavením bAcquire na FALSE a bRelease na TRUE . bSuccess indikuje, zda je zámek aktivní ( TRUE ) či neaktivní ( FALSE ).

3.2.3 Využití funkce ExtEscape Funkce ExtEscape z knihovny Gdi32.lib umožňuje komunikaci s ovladačem akcelerá toru prostřednictvím parametrů, které definuje jeho API, a výše uvedených struktur. ExtEscape předá ovladači potřebné struktury a hodnotu typu int , která určuje jak má ovladač se strukturami zacházet. Konfigurační hodnoty jsou definovány v hlavičkovém souboru API dispconfig.h a pojmenovány následovně:

3.2.3.1 DRVESC_CONFIG_DISPLAYSYSTEM Je ovladači předána spolu se strukturou DISPCFG_DISPLAY_SYSTEM a slouží k nastavení LCD přepínače podle parametrů uložených ve struktuře.

3.2.3.2 DRVESC_CREATE_OFFSCREENSURFACE Dá ovladači pokyn k vytvoření nového povrchu podle parametrů uložených ve struktuře DISPCFG_CREATE_SURFACE .

3.2.3.3 DRVESC_GET_SURFACEINFO Ovladač provede naplnění struktury DISPCFG_GET_SURFACE_INFO informacemi o povrchu v této struktuře zvoleném.

3.2.3.4 DRVESC_DIRTY Ovladač zjistí, zda došlo ke změně povrchu připojeného na vstup grafického ak celerátoru. Jako návratovou hodnotu ovladač vrací TRUE pokud se povrch změnil a FALSE pokud nikoliv.

3.2.3.5 DRVESC_ACQUIRE_DUALDISPLAY Prostřednictvím struktury DISPCFG_ACQUIRE_LOCK provede ovladač aktivaci či deaktivaci zámku akcelerátoru a uloží do této struktury odpovídající hodnotu bSuccess .

10 Deklarace funkce ExtEscape : int ExtEscape( HDC hdc, int nEscape, int cbInput, LPCSTR lpszInData, int cbOutput, LPSTR lpszOutData );

Význam jednotlivých parametrů je následující: hdc představuje kontext zařízení (v na šem případě Intel 2700G), nEscape je některá z hodnot uvedených výše, cbInput je velikost vstupní struktury, lpszInData pak vstupní struktura, cbOutput velikost vý stupní struktury a lpszOutData výstupní struktura. Pro změnu či získání informací o aktuálním nastavení stačí funkci ExtEscape předat příslušné parametry a ovladač se postará o jejich korektní naplnění.

3.3 Aplikace BP_DualDisplay

Jak jsem již zmínil v úvodu, grafický akcelerátor umožňuje obrazový výstup na externí displej a to až do rozlišení 1280x1024x16bpp nebo 1024x768x24bpp při obnovovací frekvenci 60Hz. I přes to, že se zejména ve spojení s prezentační technikou jedná o velmi kvalitní nástroj, existuje v současné době pouze minimum aplikací, které by toto vyšší rozlišení využívaly. Podařilo se mi objevit pouze jedinou a to ClearVue od firmy Westtek. Proto jsem se rozhodl využít API 2700G a funkce, které nabízí k naprogramování vlastní aplikace nazvané BP_DualDisplay.

3.3.1 Nástroje pro vývoj aplikace BP_Dual Display Pro editaci zdrojových kódů aplikace jsem zvolil Visual Studio 2005, což doporučova né integrované prostředí pro vývoj aplikací určených pro Pocket PC. Obsahuje mimo jiné ARM (Advanced RISC Machine) emulátor, který je možno s výhodou využít pro efektivní testování aplikací přímo na vývojovém stroji, bez nutnosti použití referenční platformy. Rozšíření Visual Studia o Windows Mobile 5.0 SDK pro Pocket PC pak umožňuje vytvářet aplikace pro platformu Windows Mobile 5.0. Synchronizaci a pře nos souborů mezi vývojovým strojem a emulátorem, resp. později fyzickým zařízením, zajišťuje Microsoft ActiveSync 4.5. Dále bylo nutné použít Intel 2700G SDK, který obsahuje API pro komunikaci s grafickým čipem Intel 2700G. Pro testování hardwa rově závislých částí aplikace jsem použil PDA Dell Axim X51v, který je vybaven gra fickým čipem Intel 2700G.

Důležité je pořadí instalace všech uvedených nástrojů, které by mělo být následující:

• Microsoft ActiveSync 4.5 • Intel 2700G SDK • Visual Studio 2005 • Windows Mobile 5.0 SDK pro Pocket PC

11 Po úspěšné instalaci je možné upravovaný zdrojový kód ihned testovat prostřednictvím emulátoru nebo připojeného fyzického zařízení. V praxi je spojení vývojového a testo vacího stroje poněkud problematické. Po spojení obou zařízení spustí aplikace Active Sync proces rapimgr.exe, který spotřebuje značnou část systémových prostředků (ně kdy až 95% procesorového času) a operační systém jej není schopen korektně ukončit. Dalším problémem, jehož příčinu se mi nepodařilo nalézt a uspokojivě odstranit, je nestabilní spojení vývojového a testovacího stroje. Při testování aplikace umožňující grafický výstup na externí displej je po úpravě zdrojového kódu nutné zařízení odpojit od vývojového počítače aby bylo možné k němu připojit externí displej. Po opětovném připojení se vývojový stroj již není schopen s testovacím zařízením spojit a je nutné provést jeho restart, což je při množství potřebných úprav zdrojového kódu značně ča sově náročné.

3.3.2 Souborová struktura aplikace Vlastní aplikace sestává z několika souborů. Jednak je to vstupní soubor, který zajišťu je interakci s uživatelem pomocí okenní aplikace, dále pak soubor obsahující všechna potřebná nastavení. Z tohoto souboru jsou volány funkce, struktury a výčtové typy de finované v souborech API. Tyto funkce API následně využívající funkci ExtEscape ke komunikaci s ovladačem čipu.

BP_DualDisplay.cpp Vstupní bod aplikace, obsahuje funkci WinMain a okenní aplikaci pro interakci s uživatelem. Z tohoto souboru jsou volány funkce definované v BP_DualDisplay_config.cpp, které zajistí požadovanou konfiguraci akcelerátoru.

BP_DualDisplay.h Hlavičkový soubor pro BP_DualDisplay.cpp.

BP_DualDisplay_config.cpp Hlavní konfigurační soubor pro aktivaci a deaktivaci duálního displeje. Z funkce WinMain jsou volány tři jeho funkce. DualDisplay aktivuje duální displej, StopDesktopToXScaleTransfer a RestoreDefaultDisplayMode zajistí obnovení původní konfigurace. Tyto tři hlavní funkce využívají řady pomocných funkcí, obsažených jednak v tomto souboru a jednak v souborech API.

Dispconfig.h Hlavičkový soubor API Intel 2700G, který obsahuje definice výčtových typů, struktur a hodnot pro nastavení funkce ExtEscape .

DDDrvEsc.h Hlavičkový API soubor obsahující definice proměnných a deklarace funkcí, které jsou definovány v souboru DDDrvEsc.cpp

DDDrvEsc.cpp Soubor API obsahující definice funkcí, které předávají výše uvedené struktury a pro střednictvím funkce ExtEscape ovladači. Zajišťují tak dosažení požadované konfigu race nebo získávají informace o stavu akcelerátoru.

12 Dále jsou součástí programu soubory zdrojů, pomocí kterých je možné konfigurovat nabídky, kurzory, ikony, znakové řetězce, klávesové zkratky apod. a soubor README.TXT , který popisuje souborovou strukturu aplikace a uvádí licenční podmínky pro používání Intel 2700G API.

3.3.3 Princip fungování aplikace BP_DualDisplay V následujícím textu bude vysvětlen princip, na kterém aplikace pro duální displej pracuje (viz. obrázek 3.1). Jeho pochopení usnadní orientaci ve zdrojovém kódu a spo lu s ním nastíní možné způsoby využití API a jeho struktur. Po spuštění aplikace BP_DualDisplay je nejprve uživatel vyzván k aktivaci duální ho displeje. Jakmile tak učiní, jsou inicializovány všechny potřebné struktury a aplika ce si vyžádá kontext grafického akcelerátoru a grafického řadiče procesoru. Následně jsou do příslušné struktury uloženy informace o povrchu Desktop. Je provedeno uzamčení akcelerátoru a naplnění struktur pro konfiguraci LCD přepínače. Ten je na staven tak, že výstupem na externí displej je Secondary surface generovaný akceleráto rem a výstup na interní displej pochází z grafického řadiče procesoru. Dále je vytvořen povrch Secondary surface o požadované velikosti, která odpovídá rozlišení externího displeje. Interní displej je překryt oknem černé barvy, aby nedocházelo k zobrazování artefaktů při přepínání konfigurace displeje. Následně je vyvolána funkce API, která předá ovladači akcelerátoru příslušné struktury a ten provede konfiguraci LCD přepí nače. Dále je vytvořeno druhé vlákno aplikace, které při změně povrchu Desktop tento kopíruje do povrchů Secondary surface a XScale surface. V případě Secondary surface dochází v rámci kopírování i k násobení pixelů (řádků i sloupců), tak aby plocha po kryla celý povrch. Pixely Secondary surface pak prostřednictvím řadiče akcelerátoru a LCD přepínače putují na výstup pro externí displej. XScale surface je naproti tomu vykreslován grafickým řadičem procesoru přes LCD vstup akcelerátoru a LCD přepí nač na výstup pro interní displej. Nakonec je provedeno odhalení displeje zrušením maskovacího okna a uživatel může dále využívat jak interní, tak také externí displej. Při ukončování aplikace dojde nejprve k ukončení vlákna zajišťujícího kopírování povrchu Desktop. Displej je překryt oknem černé barvy a je obnoveno původní nasta vení LCD přepínače, tedy interní displej je ovládán řadičem grafického akcelerátoru a externí displej je deaktivován. Tohoto nastavení dosáhneme stejným způsobem jako při aktivaci duálního displeje s jediný rozdílem, kterým jsou odlišné parametry v konfiguračních strukturách. Dále je zrušeno černé maskovací okno a paměť alokova ná pro konfigurační struktury a Secondary surface je vrácena zpět operačnímu systé mu. Nakonec je uvolněn zámek a kontext akcelerátoru, stejně jako kontext grafického řadiče procesoru a aplikace je ukončena.

13

Obrázek 3.1: Schéma práce programu BP_DualDisplay

14 Rád bych se ještě krátce vrátil k funkci zabezpečující kopírování pixelů povrchu Desktop do povrchů Secondary surface a XScale surface. Kopírování do XScale fun guje jednoduše neboť oba povrchy mají stejné rozměry i orientaci. Přenesení povrchu Desktop do Secondary surface je již poněkud složitější (viz. ob rázek 3.2). Secondary surface má jednak zpravidla větší rozměry a jednak je oproti po vrchu Desktop otočen o 90 stupňů tak, aby jeho šířka byla větší než výška. Toto otoče ní jsem zvolil záměrně aby bylo možné dosáhnout co nejvyššího zobrazitelného rozli šení a z důvodu kompatibility s externími displeji neboť většina z nich má také šířku větší než výšku. Při vlastním kopírování pixelů jsou tyto postupně čteny z povrchu Desktop a ukládány do Secondary surface tak aby došlo k rotaci a násobení pixelů. Je den zdrojový pixel se tedy zobrazí jako více cílových. Bohužel jsem při pokusu o do sažení maximálního udávaného rozlišení (tj. 1280x1024) zjistil, že pixely se sice do povrchu Secondary korektně přenesou, ale z důvodu, který se mi nepodařilo objasnit se na externím displeji v každém řádku nevykreslí posledních 80 pixelů. Nejvyšší dosa žené rozlišení aplikace DualDesktop tak činí 1200x1024x16pbb při obnovovací frek venci 60Hz.

Obrázek 3.2: Kopírování Desktop surface do Secondary surface

15 Kapitola 4

OpenGLES

Tato kapitola popisuje další základní část Intel 2700G API a sice implementaci Open GLES (OpenGL for Embedded Systems). V úvodu přibližuje spojení standardu OpenGL a čipu 2700G. Dále se věnuje akcelerovaným funkcím OpenGLES, které jsou v jejím závěru využity v ukázkové aplikaci.

4.1 OpenGL a Intel 2700G

OpenGL (Open ) je knihovna funkcí programovacího jazyka C, která umožňuje vykreslování 2D a 3D grafiky prostřednictvím grafického hardware na vý stup počítače. V současné době patří mezi nejpoužívanější grafická API na většině platforem. Její první verze byla navržena firmou Silicon Graphics Inc. (SGI) již v roce 1992, dnes existuje ve verzi 2.1. OpenGL je platformově nezávislé a plní funkci roz hraní mezi aplikací a hardwarem, který pracuje s obrazovými body. OpenGLES (OpenGL for Embedded Systems) je multiplatformní grafické API pro embedded (vestavěné) systémy, jako jsou kapesní počítače, mobilní telefony, pa lubní počítače automobilů a jiná zařízení vyžadující kvalitní grafický výstup. Vzniklo z přesně definovaných podmnožin funkcí klasického OpenGL a vytvořilo tak rozhraní mezi softwarovými aplikacemi a hardwarovou akcelerací grafiky. V závislosti na ob lasti použití postupně vznikly tři hlavní řady: OpenGLES 1.x, OpenGLES 2.x a OpenGL ESSC 1.0.

4.1.1 OpenGLES 1.x OpenGLES 1.x není plně programovatelné rozhraní a je určeno pro hardware s pevně zabudovanými funkcemi. Poslední vydaná verze nese označení OpenGLES 1.1 a je definována podle specifikace OpenGL 1.5.

4.1.2 OpenGLES 2.x Nejnovější verzí této větve OpenGLES je 2.0, která je definována podle specifikace OpenGL 2.0 a je určena pro programovatelný hardware. K vykreslování pixelů na ob razovku využívá tzv. shaderů, které dosahují lepších vizuálních efektů než standardně zabudované funkce.

4.1.3 OpenGLSC (Safety Critical) 1.0 Tato verze OpenGL pro Embedded systémy je speciálně navržena s ohledem na bez pečnost. Je definována jako podmnožina funkcí OpenGLES 1.0 a je určena pro nasa zení v systémech vyžadujících vysokou míru bezpečnosti, jako například letecká a au tomobilová technika.

16 Pro zobrazování 2D a 3D grafiky obsahuje API Intel 2700G implementaci Open GL ES verze 1.0, která vznikla na základě specifikace OpenGL 1.3. Akcelerátor je pro Open GLES 1.0 optimalizován a poskytuje jeho funkcím hardwarové urychlování. To je mnohdy rozpoznatelné i pouhým okem bez přesnějšího měření. Pokud například vy užijeme OpenGLES k zobrazení jednoduché 3D scény, je v systému s akcelerátorem 2700G vykreslována o poznání plynuleji, než například na softwarovém emulátoru bez hardwarové akcelerace.

4.2 Akcelerované funkce pro 2D grafiku

4.2.1 2D Ořezávání Umožňuje akcelerátoru ořezávat pixely zpracovávané plochy pouze na obdélník o ve likosti zobrazovaného okna. Veškeré objekty jsou tak oříznuty a dále jsou zpracovává ny pouze jejich viditelné části. Hardwarové ořezávání snižuje nároky na softwarové ořezávání a tím zvyšuje grafický výkon.

4.2.2 AntiAliasing Aliasing znamená vznik obrazových chyb jako jsou zubaté linie a moiré nebo u anima cí problikávání některých obrazových částí. Tyto chyby vznikají tím, že přímky jsou zobrazovány pomocí řady pixelů na pixelové mřížce, čímž vzniká zubatá linka. Další příčinou je nedostatečné rozlišení, kdy množství pixelů na obrazovce nedostačuje k zobrazení textury s vyšším rozlišením a dochází tak k její deformaci . Funkce anti aliasingu přidávají kolem linií lehké stíny nebo mlhu, tím odstraňují viditelné ostré přechody a s nimi i obrazové chyby vzniklé aliasem.

4.2.3 Alfa míchání Alfa míchání využívá takzvaného RGBA barevného prostoru. Nejedná se o nic jiného než standardní barevný prostor RGB doplněný o alfa kanál, který vyjadřuje míru prů hlednosti daného objektu. Alfa míchání tedy umožňuje vytvářet kombinace barev ob jektů v závislosti na jejich vzájemné poloze a transparentnosti.

4.2.4 2D BLT Engine Intel 2700G poskytuje hardwarovou akceleraci pro blokový přenos dat (Block Transfer of Data, BLT) z jednoho místa v paměti na jiné. Takové přenosy jsou velmi časté při běžných grafických operacích, kdy se přenášejí bloky dat, které popisují zobrazované pixely. Provádění těchto operací na úrovni hardwaru jednak snižuje zatížení procesoru a jednak poskytuje plynulejší grafické uživatelské rozhraní. Existují dva druhy BLT používané při přenosu obrazových dat: průhledný a neprů hledný. Neprůhledný BLT zapíše data popisující pixel do požadovaného umístění bez ohledu na data která se v tomto umístění nachází. Původní data jsou tak přepsána daty novými a na daném místě se zobrazí barva nového pixelu. Průhledný BLT porovnává barvu původního pixelu s barvou nově zapisovaného pixelu. Do určeného umístění za píše kombinaci těchto dvou barev podle zvolené hodnoty propustnosti.

17 4.3 Akcelerované funkce pro 3D grafiku

Intel 2700G implementuje celou řadu funkcí pro akceleraci 3D grafiky. Jejich princip a využití úzce souvisí se způsobem, jakým jsou data vykreslována na grafický výstup. Zobrazování 3D scén na monitoru počítače v praxi znamená matematické převede ní 3D scény do 2D obrazu. 3D scéna je popsána množinou vrcholů s konkrétními sou řadnicemi. Objekty ve 3D prostoru jsou tvořeny z polygonů (nejčastěji trojúhelníků), které jsou ohraničeny vrcholy. Na tyto polygony jsou aplikována rastrová data a vzni ká viditelná 3D scéna. Vykreslení konkrétního 3D obrazu probíhá v několika fázích, nazývaných vykres lovací řetězec (rendering ). Vstupem jsou údaje o vrcholech a rastrová data a výstupem rastrový obraz vhodný pro zobrazení na monitoru. Nejprve jsou 3D data transformována v závislosti na požadovaném úhlu pohledu. Následuje nasvícení scény, kdy jsou uvažovány veškeré světelné zdroje a jejich působení na objekty. Dále je scéna oříznuta jen na velikost viditelného okna a z dalšího zpracování jsou vynechány vrcho ly, které leží mimo toto okno. Polygonům je přiřazena textura vytvořená na základě rastrových dat a povrch objektů tím získá barvu a jiné vizuální vlastnosti. V dalším kroku jsou polygony převedeny na pixely a předány rastrové paměti (framebufferu), kde čekají než budou moci být zobrazeny na monitoru. O korektní zobrazení viditelnosti jednotlivých pixelů se stará blok rastrové paměti zvaný Zbuffer nebo také Depth buffer. Slouží k porovnávání hloubky jednotlivých pi xelů, tj. jejich umístění na ose Z (osa vedoucí od stínítka obrazovky směrem dozadu). Pokud chceme na místo se stejnými souřadnicemi X a Y vykreslit další pixel, jsou po rovnány Z hodnoty nového a původního pixelu uloženého ve framebufferu. Podle vý sledku je nový pixel buď zahozen a nebo je jím přepsán původní pixel, případně může docházet k míchání barev obou pixelů. Do Zbufferu se tak musí přistupovat při vy kreslování každého pixelu a navíc jsou vykreslovány i pixely, které ve výsledném ob razu nebudou viditelné, což vede ke značné neefektivitě. Proto akcelerátor Intel 2700G implementuje řadu funkcí, které šetří výpočetní výkon a snižují zátěž systémové sběr nice.

4.3.1 Dělení obrazovky (Screen Tiling) U zařízení, která tuto metodu nepoužívají, jsou polygony určené k vykreslení posílány grafickému akcelerátoru v náhodném pořadí, bez předchozího setřídění. Zhodnota každého pixelu se tak musí porovnávat se Zhodnotami ostatních pixelů zobrazované scény, což jsou operace náročné na vytížení Zbufferu a šířku přenosového pásma pa měti. Intel 2700G používá dělení obrazovky, kdy je scéna rozdělena na množství ob délníků, které jsou postupně zpracovávány. To umožňuje grafickému akcelerátoru po rovnávat vždy jen Zhodnoty pixelů, které leží ve stejné oblasti a celkově tak zpraco vávat menší objemy dat.

4.3.2 Deffered Texturing Tato metoda spočívá v nanášení textury pouze na pixely, které budou ve výsledné scé ně viditelné. Nejprve jsou porovnány Zhodnoty pixelů ve zpracovávané oblasti a je určeno, které z nich budou viditelné, případně se uváží poměr alfa míchání. Následně je nanesena příslušná textura. Tím se grafický akcelerátor vyhne případům nadbyteč ného či několikanásobného nanášení textury.

18 4.3.3 Převod čísel s pevnou na čísla s pohyblivou desetinnou čárkou Intel 2700G vnitřně pracuje s čísly s pohyblivou desetinnou čárkou. Je však schopen akceptovat i data s pevnou desetinnou čárkou a vnitřně provádí příslušné konverze, které by jinak zatěžovaly procesor.

4.3.4 Ořezávání malých objektů Při vykreslování pracuje akcelerátor s trojúhelníky o různých velikostech. Vlivem transformací může docházet k tomu, že velikost jednotlivých trojúhelníků bude menší než jeden pixel, což je nejmenší zobrazitelný bod. Trojúhelníky o takovéto minimální velikosti zbytečně zatěžují akcelerátor i přes to, že nakonec nebudou zobrazeny. Proto jsou ještě před nasvícením scény a nanesením textur odstraněny.

4.3.5 Ořezávání objektů mimo viditelnou oblast Trojúhelníky jsou v prostoru definovány souřadnicemi svých vrcholů a jako takové mohou ležet i mimo právě zobrazovanou oblast. To že nejsou viditelné však nezname ná, že nemusejí být zpracovávány grafickým akcelerátorem. Za účelem snížení počtu zpracovávaných polygonů bylo zavedeno ořezávání takovýchto trojúhelníků.

4.3.6 Ořezávání odvrácených stran objektů U každého 3D objektu je viditelná jen ta část, která je přivrácena k pozorovateli. Na základě tohoto faktu byla vyvinuta metoda, kdy jsou na obrazovku vykreslovány jen ty polygony, které jsou přivráceny směrem k pozorovateli. Dochází tak opět ke značné redukci celkového množství zpracovávaných informací.

4.3.7 Efekt mlhy Mlha přidává do vykreslované scény atmosférické efekty a iluzi prostoru čímž přispívá ke zvýšení míry reality. Je možné měnit barvu a hustotu mlhy. V závislosti na míře ponoření objektů do mlhy lze zvolit jejich barvu nebo případné ořezávání a ušetřit tak výpočetní výkon.

4.3.8 Perspektivní korekce textur Nanášení textur na objekty znamená mapování 2D povrchu na 3D objekt. Úhel pohle du na prostorový objekt může být různý a může se v čase měnit. Tomu musí odpovídat i namapovaná textura. Intel 2700G podporuje korekci mapovaných textur, tak aby se zobrazovaly ve správné perspektivě a výsledný objekt se jevil realisticky.

4.3.9 Komprese textur Velikost a množství textur se v moderní grafice stává nezanedbatelným problémem. Textury spotřebují značnou část přenosového pásma a procesorového času a proto je nutné jejich velikost redukovat. Intel 2700G nabízí kompresní formát, který je kompa tibilní i se standardem DirectX.

19 4.3.10 Mapování a filtrování textur Obdobně jako pixel je nejmenší jednotkou obrazu, texel je nejmenší jednotkou textury. Na jeden pixel lze namapovat texturu o velikosti právě 1x1 texel. Intel 2700G umožňu je využívat textury o velikosti až 2048x2048 texelů a jejich rozměry mohou být stan dardní čtvercové nebo i obdélníkové. Velikost textury však málokdy odpovídá velikos ti objektu, na který je mapována. Proto je nutné provést její zmenšení či zvětšení a pomocí výpočtů určit, jak se budou texely mapovat na pixely objektu. Právě o tyto vý počty se starají texturové filtry, kterých Intel 2700G nabízí hned 7. Jednotlivé filtry rozlišujeme jednak podle toho, zda jsou určeny pro zvětšení či pro zmenšení textury a jednak podle poměru mezi kvalitou a rychlostí výpočtu. Volba vhodného filtru tak mů že významně ovlivnit úroveň detailů a plynulost vykreslování výsledného obrazu. Kompletní popis všech filtrovacích metod a jejich principů již přesahuje rozsah této práce. Proto se zde omezím pouze na výčet a stručnou charakteristiku filtrů, které Intel 2700G podporuje.

4.3.10.1 Bodové vzorkování (Point sampling) Při zvětšení i zmenšení textury se použije texel, jehož souřadnice leží nejblíže středu pixelu. Toto filtrování je nejméně náročné na výkon, ale je také nejméně kvalitní a ve výsledném obrazu mohou vznikat poruchy a nespojitosti.

4.3.10.2 Bilineární vzorkování (Bilinear sampling) Pro zvětšení i zmenšení se použije lineární průměr z pole 2x2 texely, které leží nejblíže středu pixelu. Bilineární vzorkování vykazuje lepší kvalitu výsledného obrazu, ale za cenu náročnějších výpočetních operací.

4.3.10.3 Mipmapování (Mipmapping) Mipmapování řeší problém s velikostí objektů poněkud odlišným způsobem než bodo vé či bilineární vzorkování, i když tyto techniky v sobě také integruje. Používá se pro zmenšení textury. Nejprve je ze základní textury vytvořena posloupnost textur o zmen šujícím se rozlišení, takzvaných mipmap. Podle velikosti zobrazovaného objektu je k namapování vybrána mipmapa s vhodným rozlišením. Intel 2700G podporuje násle dující varianty mipmapování:

Bodové mipmapování (Point mipmapping) Nejprve je vybrána mipmapa o odpovídajícím rozlišení, které se co nejvíce blíží velikosti objektu, na který texturu mapujeme. Následně je pomocí metody bodo vého vzorkování vybrán vhodný texel pro konkrétní pixel.

Bilineární mipmapování (Bilinear mipmapping) Opět je nejprve vybrána mipmapa o rozlišení, které se co nejvíce blíží velikosti texturovaného objektu, ale hodnota texelu je vypočítána metodou bilineárního vzorkování.

Bodové mipmapování s využitím lineární interpolace (Point mipmapping li near) Nejprve jsou vybrány dvě vhodné mipmapy, které svým rozlišením odpovídají velikosti texturovaného objektu. V každé mipmapě je metodou bodového vzor kování vybrán kokrétní texel. Hodnota výsledného texelu je pak spočítána jako lineární průměr těchto dvou texelů.

20 Trilineární vzorkování (Trilinear sampling) Podobně jako v předchozím případě jsou vybrány dvě mipmapy o vhodném roz lišení. V každé z nich je metodou bilineárního vzorkování vypočítána hodnota texelu. Výsledný texel je pak získán jako lineární průměr těchto dvou texelů.

Bodové mipmapování s využitím lineární interpolace a trilineární vzorkování umožňuje plynulý přechod mezi dvěma mipmapami, narozdíl od bodového a bi lineárního mipmapování, kde je přechod skokový.

4.3.10.4 Anisotropní filtrování () Všechny doposud popisované filtry byly isotropní, což znamená že nanášení textury na objekt probíhalo vždy ve směru některé ze souřadných os a textura měla čtvercový tvar. Pokud je však potřeba nanést texturu rovnoběžníkového či lichoběžníkového tva ru, dochází u předchozích typů filtrování ke zkreslení a ztrátě detailu. Anisotropní fil trování dovoluje tento problém částečně eliminovat a vylepšit tak kvalitou výsledného obrazu. Anisotropní filtr nejprve vybere mipmapu, která se svým rozlišením nejvíce blíží veli kosti texturovaného objektu a do výpočtu zahrne i posloupnost dalších tří mipmap, kte ré jsou menší než první zvolená mipmapa. Pro daný pixel získá z každé mipmapy me todou bilineárního vzorkování jeden texel. Hodnota výsledného texelu je pak vypočte na jako lineární průměr těchto čtyř texelů.

4.4 Aplikace BP_OGLES_demo

Cílem aplikace je demonstrace některých výše popsaných funkcí, které jsou akcelerá torem Intel 2700G hardwarově urychlovány. Následující stručný popis, nabízí nejen přehled funkcionality aplikace, ale také popis instalace použitých knihoven, který bývá v literatuře často opomíjen.

4.4.1 Instalace knihoven Knihovna OpenGLES není standardní součástí operačního systému Windows, proto je nutná její instalace a integrace do vývojového prostředí. Kromě této knihovny využívá demonstrační program další pomocné funkce, defi nované v knihovnách GLUES (OpenGL Utility Library for Embedded Systems) a GLUTES (OpenGL Utility Toolkit for Embedded Systems). Ty mají rozšiřující cha rakter a často slouží především pro usnadnění komunikace s okenním systémem cílové platformy. Jejich integraci do vývojového prostředí Visual Studia 2005 zajistíme následovně: Nejprve vložíme do složky s nainstalovaným Windows Mobile 5.0 SDK pro Pocket PC hlavičkové a pomocné zdrojové soubory knihoven. Typicky se jedná o složku Windows CE Tools\wce500\Windows Mobile 5.0 Pocket PC SDK\Include\Armv4i a soubory gl.h, egl.h, egltypes.h, glext.h, glutes.h, glues.h, glues_sin.h a glues.c. Dále vložíme do složky Windows CE Tools\wce500\Windows Mobile 5.0 Pocket PC SDK\Lib\ARMV4I soubory knihoven glutes.lib, glutes.exp, glutes_static.lib, lib GLES_cm.lib a libGLES_cm.exp. Nakonec do adresáře Windows v příslušném emulá toru či fyzickém zařízení přidáme soubory knihoven libGLES_CM.dll a glutes.dll. Nyní máme připraveno prostředí pro využití OpenGLES v praxi.

21 4.4.2 Struktura a princip fungování aplikace Zdrojový kód aplikace je umístěn v souboru BP_OGLES_demo.cpp. Po jejím spuštění je nejprve inicializována knihovna GLUTES a s její pomocí vytvořeno okno podporu jící OpenGLES. Dále je provedeno počáteční nastavení všech funkcí OpenGLES, které budou následně využívány. Jsou načtena data textury uložené ve formátu RAW. Jedná se o bezkompresní formát, takže nejsou nutné žádné konverze a data můžeme načítat jednoduše prostřednictvím bitového proudu. Pomocí načtených informací jsou vygenerovány textury a nastaveny parametry jejich filtrování. Prostřednictvím polí souřadnic jsou vykresleny a otexturovány dva jednoduché objekty, reprezentující pís mena FI. Oba objekty rotují kolem souřadné osy Y aby lépe vynikly použité funkce OpenGLES. Klepnutím na dotykový displej lze vyvolat kontextové menu a zvolit na stavení některé z implementovaných funkcí. Konkrétně je možné zvolit ořezávání od vrácených či přivrácených stran objektů, filtrování textur bodovým nebo bilineárním vzorkováním, aktivovat nebo deaktivovat alfa míchání a využití efektu mlhy. Uvedená nastavení je možné libovolně kombinovat a ihned sledovat jejich vliv na zobrazovanou scénu.

22 Kapitola 5

Akcelerace videa

V této kapitole se již jen stručně zmíním o třetí a poslední části Intel 2700G API, kte rou tvoří hardwarová podpora pro akcelerované video.

Intel 2700G nabízí akceleraci pro videoformáty MPEG1, MPEG2, MPEG4 a WMV. Pro pochopení jejího fungování je nejprve nutné znát základní princip komprese a de komprese, kterou tyto formáty využívají. Video se skládá z posloupnosti snímků (frames). Jeho komprese využívá dvou zá kladních vlastností videa – nízké míry neuspořádanosti (entropie) pixelů v jednotlivých snímcích a opakujících se informací v po sobě jdoucích snímcích. Nízká entropie v tomto případě vyjadřuje fakt, že pixely ležící ve stejné oblasti mají identickou nebo velmi podobnou barevnou hodnotu. Nadbytečnost dat udává, že dva po sobě jdoucí snímky jsou téměř totožné. Nízká entropie se při kompresi využije tak, že každý snímek je nejprve rozdělen na bloky o velikosti 8x8 nebo 16x16 pixelů. Ty jsou následně zakódovány diskrétní kosi novou transformací (DCT) a přeuspořádány do zigzag formátu (ZZ). Pro dekompresi videa je nutné provést inverzní operace, tedy inverzní diskrétní kosinovou transformaci (IDCT) a inverzní zigzag přeuspořádání (IZZ). Nadbytečnost dat v po sobě jdoucích snímcích se při kompresi využívá v procesu nazývaném kompenzace pohybu (motion compensation). Pomocí porovnání jednotli vých bloků dvou snímků, je určen pohybující se objekt. Místo toho aby byl objekt ukládán v každém snímku zvlášť, je možné jej definovat a popsat jeho pohyb pomocí vektoru, čímž dojde ke snížení velikosti paměti, nutné pro uložení sekvence snímků. Při kompresi jsou kompletně uloženy jen některé snímky, ostatní jsou pak dopočí távány jako jejich rozdíl. Z tohoto pohledu rozeznáváme tři typy snímků:

5.1 Isnímky (Iframes, intracoded frames) Jsou kompletně uložené snímky. K jejich dekódování nejsou vyžadovány žádné další snímky.

5.2 Psnímky (Pframes, predicted frames) Psnímek je ukládán jako rozdíl mezi bezprostředně předcházejícím I nebo P snímkem a ukládaným snímkem. Je tudíž závislý na existenci Isnímků.

5.3 Bsnímky (Bframes, bidirectionally predicted frames) Bsnímek je ukládán jako rozdíl mezi bezprostředně předcházejícím a následujícím snímkem. Těmito snímky mohou být I nebo Psnímky. Bsnímky nejsou požívány k výpočtu dalších snímků.

Při dekompresi videa provádí Intel 2700G výše uvedenou inverzní diskrétní kosinovou transformaci, inverzní zigzag přeuspořádání a kompenzaci pohybu již na hardwarové úrovni. Nabízí tak značné úspory procesorového času. Rovněž není nutné při provádě ní transformací využívat operační paměť, čímž dochází nejen k redukci prostorových nároků, ale i ke snížení zátěže systémové sběrnice.

23 Kapitola 6

Závěr

V práci se podařilo popsat vývoj a parametry akcelerátoru Intel 2700G spolu s tře mi hlavními částmi jeho API. V první ze dvou vytvořených aplikací byl využit grafic ký výstup pro externí displej a dosaženo rozlišení 1200x1024x16bpp při frekvenci 60Hz. Druhá ukázková aplikace pak na jednoduchém 3D modelu demonstruje některé z funkcí OpenGLES, jež jsou akcelerátorem hardwarově urychlovány. Práce rovněž soustřeďuje řadu užitečných a mnohdy obtížně dostupných informací o Intel 2700G API, které mohou posloužit jako základ pro další využití akcelerátoru. Vývoj jeho no vých verzí je však věcí nejistou. Budoucnost s sebou bezpochyby přinese zvýšené ná roky jak na kvalitu a rychlost vykreslování, tak také na spotřebu energie. To si vyžádá vznik následníků čipu Intel 2700G, ať to již budou jeho vylepšené varianty či produkty konkurenčních firem. Je jisté, že bude docházet ke zvyšování frekvence jádra čipu i je ho sběrnice, rozšiřování přenosového pásma, zvyšování velikosti interní cache paměti a v neposlední řadě k rostoucí integraci, která umožní další miniaturizaci čipu. Mož nosti hardware však nejsou nevyčerpatelné a proto je očekáván vývoj nových metod pro zpracování obrazových dat spolu s nalezením efektivnějších algoritmů pro jejich implementaci. Nezbývá než čekat, který z vývojářů přinese do světa počítačové grafiky další rozměr.

24 Literatura

[1] Intel 2700G Multimedia Accelerator Datasheet, duben 2004, http://www.xscale.jp/XSDoc/2700G/30094801.pdf

[2] Intel 2700G Multimedia Accelerator Design Guide, duben 2004, http://www.xscale.jp/XSDoc/2700G/30094901.pdf

[3] Blythe, D., Munshi, A., Leech, J.: OpenGLES Version 1.1.10 (Full Specification), duben 2007, http://www.khronos.org/registry/gles/specs/1.1/es_full_spec.1.1.10.pdf

[4] Segal, M., Akeley, K., Frazier, Ch., Leech, J.: The OpenGL Graphics System: A Specification (Version 1.5), říjen 2003 http://www.opengl.org/documentation/specs/version1.5/glspec15.pdf

[5] OpenGLES 1.0 Framework Software Developer’s Guide, leden 2005, http://www.xscale.jp/XSDoc/2700G/30327202.pdf

[6] Shreiner, D., Woo, M., Neider, J., Davis, T.: OpenGL Průvodce programátora, Brno, Computer Press 2006

[7] Video Acceleration API Software Developer’s Guide for Intel 2700G Multime dia Accelerator, leden 2005 http://www.xscale.jp/XSDoc/2700G/30095001.pdf

[8] Koenig, A., Moo, B.: Rozumíme C++, Praha, Computer Press 2006

[9] Introduction to Development Tools for Windows Mobilebased Devices http://msdn2.microsoft.com/enus/library/ms838188.aspx

25 Přílohy

Příloha A

Součástí práce je přiložené CD, kde naleznete: • text této práce ve formátu MS Word • text této práce ve formátu PDF • zdrojové kódy aplikace BP_DualDisplay • zdrojové kódy aplikace BP_OGLES_demo • hlavičkové a zdrojové soubory Intel 2700G API • soubory knihoven OpenGLES, GLUES a GLUTES

Příloha B

Ukázka vytvoření a naplnění konfigurační struktury pro aktivaci externího displeje.

DISPCFG_DISPLAY_SYSTEM sDisplayConfig; sDisplayConfig.sLcdInternal.bValid = TRUE; sDisplayConfig.sLcdInternal.bActivate = TRUE; sDisplayConfig.sLcdInternal.eLcdSource = DCFG_SOURCE_XSCALE; sDisplayConfig.sLcdInternal.eXScaleFormat = DCFG_LCD_IN_565; sDisplayConfig.sLcdExternal.bValid = TRUE; sDisplayConfig.sLcdExternal.bActivate = TRUE; sDisplayConfig.sLcdExternal.eLcdSource = DCFG_SOURCE_MARATHON; sDisplayConfig.sLcdExternal.eXScaleFormat = DCFG_FORMAT_NOT_APPLICABLE;

Příloha C

Ukázka využití funkce ExtEscape pro nastavení konfigurace LCD přepínače.

ExtEscape(hdcMarathon, DRVESC_CONFIG_DISPLAYSYSTEM, sizeof(DISPCFG_DISPLAY_SYSTEM), (LPSTR) &sDisplayConfig, 0, NULL);

26