Trable se Spider-Manem

Zatím jsem se o tom myslím na blogu nezmiňoval, ale opravdu nemám rád Windows 10. Dokonce bych řekl, že je to jeden z mála operačních systémů, které jsou méně stabilní a rozbitější než Linux, což je ocenění, ke kterému u mne není jednoduché se dopracovat. Byl jsem tudíž nadmíru znechucen, když jsem zjistil, že se „nový“ Spider-Man, na jehož osvobození z osidel platformy PlayStation jsem čekal již od roku 2018, kdy tento titul spatřil světlo světa poprvé, neobejde bez technologie Direct3D 12, jíž Microsoft, jak již je tradicí, vyšperkoval pouze systémy Windows verze 10 a 10.5 (někdo to myslím zaokrouhluje nahoru jako 11). Já, jakožto věrný uživatel Windows 8.1 – Snyder Cut verze Windows NT 6, která je po upravení Start Menu v podstatě jen o něco ošklivější Windows 7, ale s podporou novějšího hardware a ještě několik měsíců před EOL – jsem tímto gestem byl oficiálně poslán na kluziště… ale nebyl bych to já, abych se vzdal tak snadno!

Prvním nabízejícím se řešením bylo to naprosto očividné a obdobně pitomé – aktualizovat si OS. Takovou pošetilost jsem ze zřejmých důvodů okamžitě zavrhnul, přeci jen, update je ne vždy upgrade a Windows 10 jsou toho zářným příkladem, ale připomenulo mi to, že mám na druhém disku kvaziaktuální instalaci Ubuntu. Restartoval jsem tedy do Linuxu a po hodinách pachtění se s Wine a překladači z Direct3D na Vulkan to vypadalo, že se Spider-Man s pomocí open-source alterega mého již ne úplně nejnovějšího herního počítače stane realitou, ale to by to nebyl Linux, aby se něco nepokazilo. První misi jsem dohrál bez problémů, ale hned na začátku druhé začala hra v takřka náhodných záchvatech framedropů v lepším případě padat, v horším uvádět celý OS do kómatu prolomitelného výhradně tlačítkem reset.

Jelikož se ukázalo, že jsem patrně ve svých zjevně ojedinělých obtížích odkázán sám na sebe, rozhodl jsem se, že k tomu budu muset jít odjinud, neboť s Linuxem umím asi tak jako s weby, a tak jsem restartoval zpět do Windows se zcela novým plánem. Došel jsem totiž k logickému závěru, že pokud dokáže nějaké Linuxové cosi překládat Direct3D na Vulkan, neexistuje sebemenší důvod, proč bych z toho Linuxového cosi nemohl udělat Windowsové cosi. Trochu jsem zabrouzdal internetem a vzápětí mne jakýsi neznámý pan neonfloppy v mém přesvědčení utvrdil. Zajásal jsem, naklonoval si repozitáře potřebných knihoven a otevřel disassembler, zamýšleje nejprve odstranit ze hry kontrolu verze systému.

Struktury a názvy proměnných jsem doplnil sám, až tak pokročilé dekompilátory zatím nejsou.

Ačkoli jsem s x86(_64) assembly v životě mnoho zkušeností neměl a raději ani mít nechci, dokumentace WinAPI mi v hledání problematického místečka v kódu zdárně pomohla, a tak jsem do spustitelného souboru na patřičné místo (je-li to někomu k něčemu, jedná se o offsety 0x1C98B21 a 0x1C98B3F, na každém šest bajtů) vlepil několik devadesátek (0x90 je kód operace no-op v x86), zhluboka se nadechnul a dvojklikem mu nechal svůj stroj napospas.

Ale ouha! Patrně mých 6 gigabajtů videopaměti našemu pavoučímu hrdinovi není dost. Zkusil jsem snížit detaily, ale chyba se stále vracela. Připadalo mi to nadmíru podivné, neboť jsem se ani nedostal k takovým těm startovacím animacím PlayStation Studios – čpěla z toho nějaká neplecha uvnitř. Ušetřím vás podrobností o několikahodinovém prozkoumávání dekompilace a zdrojů podpůrných knihoven a dojdu rovnou k věci – problém byl někde mezi VKD3D a ovladači NVIDIA.

Ještě než se vrhnu do vysvětlování, co se tam tak královsky pokonilo, doporučuji přečíst si tenhle článek, poněvadž ty tabulky rozvržení paměti jsou tu klíčové. Zkrátka a dobře: Vulkan dovoluje aplikacím přistupovat k paměti grafické karty na delikátnější úrovni než třeba OpenGL nebo starší verze Direct3D, k čemuž využívá konceptu „heapů“ v paměti. Dedikované grafické karty obvykle disponují alespoň dvěma hlavními heapy – jedním přímo na grafické kartě a druhým, záložním v systémové RAM. Ten první se obvykle používá pro prostředky, ke kterým není potřeba přímo přistupovat z CPU (textury, buffery), zatímco ten druhý, ač výkonnostně podřadný, disponuje vším, co bychom očekávali od standardní RAM, a lze jej tedy efektivně použít pro readbacky či streamování. Pak se ale sem tam objevuje ještě jeden, třetí heap, který kombinuje výhody obou předchozích – vyhrazuje totiž jistou část adresního prostoru RAM pro manipulaci high-performance videopaměti pomocí obvyklých instrukcí z CPU. Je to docela chytrá věc, a tudíž není divu, že ji mnoho programů používá… ale ouha! NVIDIA ji patrně na mém systému nepodporuje. VKD3D s absencí této funkce patrně nepočítalo, a tak si při alokaci v tomto prostoru nevědělo rady a zahlásilo, že nemá dostatek paměti. Ale co… sice to není chování úplně podle pravidel, ale upravil jsem jeden řádek kódu tak, aby v podobných případech byla alokace přesměrována do standardní systémové paměti, a hle – hra se skutečně zapnula na Windows 8.1!

Ale nebyl bych to já, aby všechno fungovalo, jak má, a já teď spokojeně hrál Spider-Mana. Hra běžela naprosto příšerně (na Linuxu šla v pohodě na High, ale ty spontánní kolapsy to potopily) a po nějaké době začala náhodně padat. Tentokrát jsem bohužel neměl moc možností, co s tím udělat – takový holt už Vulkan na mojí NVIDII je. Onen veleúžasný výrobce grafických karet si totiž asi před rokem usmyslel, že už jej nebaví poskytovat ovladače systému Windows 7. Dobře, proč ne, na to má právo, přeci jen, v tu chvíli již byly sedmičky několik měsíců po EOL… ale museli zároveň ksakru utnout podporu i 8.1, dokonce i navzdory tomu, že jsou ještě do příštího ledna oficiálně podporované Microsoftem!?

Musím se tak spokojit s rozbitou implementací Vulkanu 1.2, na které, vypadá to, žádného Spider-Mana ani náhodou nerozjedu. Tak to završím hořkým citátem Linuse Torvaldse:

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna.