4. 12. 2010

Mikrokód - uCode

Je dobre známy môj odpor ku súčasnej úrovni technológie renderingu, ktorá sa dostala definitívne do slepej uličky. Vidím 50 násobný nárast hrubého výkonu, čo sa premieta ledva do 2-5 krát lepšieho vizuálu, ak teda vôbec nejaký pozorujem. Preto to hanlivé označenie celej súčasnej generácie ako PS2 HD hry, a celé je to zabalené do obrovských problémov so stabilitou framerejtu. Samozrejme riešenie tohto problému je známe, aj niekoľko možných ciest ku skokovému nárastu efektivity hárdvéru. Aby ste však pochopili, kde smerujeme, je nutné mať aspoň hmlisté povedomie o praveku vytvárania grafiky, ku ktorému sa teraz paradoxne vraciame /vyznamné zníženie počtu krokov v procese generovania finálneho obrazu/. Nakoniec, totiž každý zistí, že na zabitie klinca do dreva je kladivo stále ten najlepší nástroj, a to aj o sto rokov odo dneška.

V bode nula bol "grafická karta" iba kus pamäte prilepenej ku CPU logike. A tá bez akýchkoľvek medzistupňov zapisovala pixely priamo do frame buffera. Časom sa všetky tie medzistupne /rasterizácia, textúrovanie, tranformácie, nasvietenie, pixel-vertex operácie, desiatky ďalších/ presunuli do špecializovaných akceleračných čipov, ktoré nakoniec skončili v jednom švábe - GPU. Šialená komplexnosť dnešných grafických operácii však prekonáva možnosti dnešného GPU hárdvéru, zviazaného filozofiou samotného renderingu pixel-polygon-tranformácia-textúra-svetlo atď. Malý príklad - máte PSone a hárdverovú podporu pre Gouraud shading, je to ďaleko rýchlejšie ako keby sme to realizovali za pomoci CPU. Zvládne však aj per-pixel Phong tieňovanie - nie !!

Identický model môžte aplikovať pri PS2 a PS3. Vieme, že ohromné množstvo grafických operácii pri PS3 je realizované "starým" spôsobom. CPU .. vlastne SPE priamo generuje grafiku do framebuffera, alebo to aspoň "predžuje" pre GPU. To jest z "niečoho" urobí niečo "iné" kompatibilnejšie pre zastaralé GPU schopné iba niektorých fixne daných prostocvikov. Samozrejme každého napadne rozšíriť flexibilitu inštrukčného setu GPU, čim ho však meníme na CPU, čím dochádza ku redundancii, lebo tu už jedno CPU máme, čím opäť končíme na najstaršej klasike CPU-pamäť a vymyslíme si postupne meter ďalších "akcelerátorov" - ktorých mená sa postupne dozviete aj tu postupom času v ďalších článkoch. Ak to ešte niekomu nie je jasné, hárdvér a dôverne známe pojmy tak ako ho ich poznáte dnes, budú behom 7-10 rokov konečne mŕtve a prestaneme sa čudovať, prečo tieň auta v hre z roku 1999 zrazu v hre z roku 2010 v tej istej sérií nepekne bliká, rozpadá sa, napriek tak brutálnemu nárastu výkonu.

S nadmerným nárastom komplexnosti a paradoxne aj so stratou efektivity špecializovaného hárdveru sa pritom bojuje od samého začiatku vytvárania grafiky. V snahe vytlačiť z GPU čo najviac, je niekedy povolené používať skutočne špinavé techniky - napriklad mikrokód. Veľmi náročné, ručne programovanie registrov čipu, intímne spojenie so železom. Asi najviac z nej v blízkej minulosti benefitovala N64 /ale dostaneme sa aj ku PS2/.

N64 mala objektívne veľmi výkonné CPU, fatálne zkriplený prístup-priepustnosť do pamäte, RDRAM s nevkusne vysokou latenciou /64 cyklov pri čítani, 640ns .. hnus/, a veľmi výkonné GPU /RSP+RDP/ fatálne zkriplené inštrukčným setom. Naštastie ostali tu jedny dvere pootvorené a RSP /Reality Signal Processor/ bolo možné programovať skrze tzv. mikrokód. RDP je Reality Drawing Processor - blbý rasterizér. Takže mámu tu RSP, ktoré predpisovo pochodovým krokom zvláda svoj denný chleba. Hárdverová podpora pre transformáciu polygónov, nasvietenie, clipping .. nebudem sa opakovať.

Čo by sa však stala, ak by sme vyhodili všetok ten SGI balast /rozumej "DirectX"/ a boli schopný tam dať ten svoj ? Lepší. Áno - GPU zrazu zvládne to, čo bolo predtým mimo jeho špecifikácii a dokonca oveľa rýchlejšie /viac polygónov, viac efektov, nové efekty, vyššie rozlíšenie, vyššia rýchlosť/. Oficiálny SGI kód mal dva módy: Fast3D /v hrubom cca 100K polys za sekundu plus efekty/ a Turbo3D /500-600K polys-sec, trochu grafických artefaktov/. Bláznivo veľký rozdiel. Mód čislo dva navyše pre oficiálne hry NEBOL povolený, aby neutrpela vizuálna kvalita hry. Tu sa trochu smejem pri pohľade na častý Z-fighting, alebo chýbajúcu perspektívnu korekciu textúr a subpixel presnosť PSOne hier. Šupanie do mikrokódu navyše Nintendo povolilo až na konci N64 cyklu. Škoda. Štandardná N64 hra bola dlhú dobu známa skôr strohou grafikou, milosrdnou hmlou zopár krokov od hráča, alebo masívnym doskakovaním grafiky. Fast3D mód bol neskôr modifikovaný /znížená presnosť, trochu zvýšená rýchlosť/ na oficiálnu Fast3D2ku.

Zopár ukážiek, čo špičkoví kóderi pomocou vlastného-custom mikrokódu z N64 vytiahli. Factor 5 a konverzia Indiana Jones and the Infernal Machine. Dosiahli vyššiu úroveň grafiky než PC /polycount, nasvietenie, partikle/ dokonca porovnateľnú kvality textúr bez ohľadu na prťavo malú pamäť nintenda. Iba v N64 verzii, keď zafúka vietor z fakieľ odskakujú iskry, alebo počas lezenia po skalách sa odlamujú kúsky vápenca. Inšpiratívne čitanie o vývoji máte celé v tomto odkaze. Boss Games Studios a nič iné ako ich Grand Turismo pre N64. To je slogan z dobovej reklamy. World driver championship. Zoznam grafických fines máte v prvom odseku. Objektívne je to graficky veľmi zdatná gamesa. Pekná komplexnosť, vysoká dohľadnosť, 480p mód, 8 áut na ceste, skids na asfalte, kvázi procedurálne hmlové efekty. Hárdverové Z-buffer kalkulácie neboli použité /N64 nemala dostatočný fillrate, takže sa na to išli hrubou silou - polycount, mikrokód/. V rovnakom roku ako WDC pre N64 kontrovala Psone so svojim Ridge Racer 4. Skutočne nádherná grafika, gourardovo tieňove takmer všade, svetlá, textúry, monštruózna dohľadnosť.

Posledným borcom z "rodu veľkých" je RARE a patologicky známa hra Conker Bad Fury Day. Obrovské scény, ani stopa po hmle, a násilnom doskakovaní grafike, početné perfektné farebné, svetelné zdroje, spracovanie tieňov. Polygónami sa míňalo aj na také finesy ako detailná animácia ksichtov, vrátane synchronizácie pier a hovoreného slova. Jedna z hier, ktorá je psou povinnosťou pre každého hráča /v hre nájdete všetko možné filmové narážky od Votrelca, Matrix, Drakulu, Zachráňte vojaka Ryana po Mechanický pomaranč/. Okrem iného sa dozviete aj "pravú" definíciu pojmu - plošinková hra. Koniec videa, ale pozrite si to celé.

void AddFraction(int &Num, int &Denom, int &Num2, int &Denom2)
/* This function is called after Reduce. This function adds the two
fractions Reduce() reduced
Pre: Two Fractions
Post: One reduced fraction */
{
if (Denom != Denom2)
{
Num = Num * Denom2;
Num2 = Num2 * Denom;
Denom = Denom * Denom2;
Denom2 = Denom2 * Denom;
Num = Num + Num2;
.
.

versus

LD a,3 (put the value 3 in register a)

versus

Increment PC ;skip past LD opcode
Fetch value from PC ;grab the '3'
Store value in register A
Increment
PC ;skip past the '3' and leave the PC looking at the next instruction


C++, assembler a mikród /super low level programovanie registrov/

Využitie mikrokódu na PS2 bolo ohromné, a zaplnilo by veľa knih. Ak vynechám chronicky známe prípady ako Shadow of the colossus, Black, GT4, Silent Hill 3 /baterka - tiene/. Stále mám v zálohe SplashDown 2: Rides Gone Wild /HDR nasvietenie, vodná pena, partikle, refrakcia, BDRF tieňovanie skútrov - to je na PS2ke ojedinelá vizualizácia interakcie svetla/odrazu a lesklého laminátu lode - Bi-directional Reflectance Distribution Function/, ATV Offroad Fury 2 a jeho ďalšie diely /soft shadows - tiene s mäkkými okrajmi sú antialiasované, 8-10K partiklov na frame, specular lighting - odlesky, geometria terénu, desiatky mikrokód pixel shaders/, Star Wars: Pod Racer Revenge /generovanie textúr terénu v reálnom čase, kompresia geometrie, projekcia tieňov, partikle, svetlo/. Teoreticky mohlo na jednej VU - vektor jednotke bežať 9 rôznych mikrokódov /9 x FMAC - Floating point Multiply-Accumulate/ a stále by ostala istá rezerva FMAC+FPU pre hlavné CPU. Pri návrhu PS2ky sa myslelo doslova na "všetko", flexibilita a možnosti hárdvéru boli niekoľko násobne vyššie než bola spoločenská objednávka.

Rovnaký princíp je použitý aj pri PS3. Vzhľadom na to, že každý herný systém ma niekde schovaného kostlivca v skrini, je dobré, ak systém má možnosť razantného zvýšenia výkonu, aj za cenu náročnejšieho programovania. PS3 tu šancu dostalo, xcrap nie. Uvedomte si, že aj to RSP v N64 je vlastne DSP procesor, čo vychádza z MIPS R4000 CPU jadra. PSP používa jeho modernú variantu ako svoje hlavné CPU !! Dnes je naozaj ťažké uhádnuť, kedy dôjde ku zmene paradigmy, a ktorý nový renderovací princíp vyhraje. Dnes sa značná časť GPU kremíka /stovky miliónov tranďákov/ snaží aspoň približne zúfalo aproximovať vizuálny efekt, ktorý by pritom vyzeral lepšie a bol by vytvorený rýchlejšie na diametrálne odlišnom "novom" hárdvéry s tretinovou komplexnosťou. Rozhodne preto chčijem na dnešné roztrasené dvojslotové PC GPU, čo žerú 400w a utrú hubu aj v starej hre Crysis, keď to prepnem do full HD na 60fps s 8xAA.