Repository navigation
God of War: Sons of Sparta (PPSA28997) on Windows #1742
nahshongraham97
started this conversation in
Game bring-up
Replies: 0 comments
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
God of War: Sons of Sparta (PPSA28997) on Windows
Bring-up notes and compatibility report for God of War: Sons of Sparta (
UP9000-PPSA28997_00-SONSOFSPARTAPS50) on Windows 11.Status (October 2026)
Scenes/River.bank), and reached the first in-game save altar/checkpoint.GOWSOSSAVE999(global settings) andGOWSOSSAVE0(player save slot), with correct directory validation and multi-threaded stream decompression.Screenshots
Detailed Technical Journey: Getting the Game to Launch & Run
God of War: Sons of Sparta is a modern 2024 PS5 title built on the Unity 2022 LTS engine with IL2CPP, leveraging FMOD Studio for audio, Sony's AGC (Advanced Graphics Core) for graphics, and heavy asynchronous multithreading for AssetBundle streaming.
Getting this title from an early crash at 0 seconds to full in-game gameplay required identifying and resolving blockers across the entire stack:
flowchart TD A["ELF/SELF Relinking & CRT Guard"] --> B["Dynamic Guest PRX Discovery"] B --> C["scriptingGetMem & Handle 0 Lookup"] C --> D["FMOD Master Bank Bootstrap & Bus Mapping"] D --> E["SaveData Mount Status & POSIX Stat Mask"] E --> F["AGC DB_RENDER_CONTROL Stencil Clear & MRT (PR #1534)"] F --> G["Vulkan Triple Buffering & Mailbox Present Mode"] G --> H["Multi-threaded Stdio Descriptor Locking"] H --> I["Full In-Game Gameplay & Checkpoint Save"]1. System Libraries & Functions Resolved
Below is the complete ledger of all resolved PS5 system libraries, specifying whether functions were implemented, adapted, wrapped, or stubbed:
A.
libkernel& Guest Runtime Loader_init):GuestImageReader.cpp. SDK-built modules contain a global state check (48 83 3d ?? ?? ?? ?? 00 74 19 4c 89 f7 48 89 de). On Windows, the reconstructed process does not carry the native PS5 loader's initialization contract. The relinker replaces the conditionalJE +0x19with an unconditionalJMP +0x19.scriptingGetMem&scriptingFreeMem(NIDayuoL6Vjz2k):_aligned_mallocand_aligned_freewith 16-byte minimum alignment. Both readable name and NID alias are registered in PE export tables.main executable) Symbol Resolution:DynamicLoader.cpp. Handle 0 searches the main executable image exports first, falling back to compatibility kernel exports.GuestModuleBuilder.cpp. Unity dynamically loads plugins fromMedia/Plugins/andMedia/Modules/(e.g.lib_burst_generated.prx,PSN.prx,libfmodstudio.prx). The builder discovers them recursively without bloating staticDT_NEEDEDclosures.libkernel'ssceKernelLoadStartModulehandles.guest.prxsuffixes and extensionless base names.TimedWaiton Windows (PR fix(libkernel): give each nested TimedWait its own waiter on Windows #1476):sceKernelRaiseExceptionas APCs inside sleeping threads. Nested condition variable waits inside APCs now allocate independent waiter instances rather than corrupting the outer thread-local waiter queue.scePthreadMutexDestroy(PR fix(libkernel): return EBUSY when destroying a locked mutex #1483):SCE_KERNEL_ERROR_EBUSYwhen destroying a locked mutex according to FreeBSDlibthr/ PS5 semantics.NativePositioned):Stdio.cpp. When Unity background worker threads decompress AssetBundles (archives_assets_all.bundle,defaultlocalgroup_assets_.bundle), multiple threads callpreadconcurrently on synchronous Windows file handles. A 64-way descriptor mutex array (descriptorMutexes[descriptor % 64]) serializesSetFilePointerExandReadFileper handle, preventing file pointer corruption.B.
libSceSaveData.native&libSceSaveDataDialog.nativesceSaveDataMount3Mount Status:Export.cpp. WhenSCE_SAVE_DATA_MOUNT_MODE_CREATE2(0x20) was requested for an existing directory, the driver previously returnedmount_status = 1(SCE_SAVE_DATA_MOUNT_STATUS_CREATED). This caused Unity's C#SaveSystemto assume a brand-new directory and throwSystem.IO.DirectoryNotFoundException. Fixed to return0for existing directories and1only when freshly created.stat(NativeStat.cpp):GetFileAttributesWwas mapped intoFileStat.st_modewithout setting standard POSIX permission bits (0755for directories,0644for files). Mono/IL2CPP verifies mode masks when probing directories; compliant POSIX mode bits resolvedDirectory.Existsreturning false on Windows host paths._sd/GOWSOSSAVE999/GoW_SoS999.dat(global settings) and_sd/GOWSOSSAVE0/GoW_SoS0.dat(slot 0 save file).C.
libSceAgcDriver&libSceAgc(Vulkan Graphics)DB_RENDER_CONTROLStencil Clear & MRT Retention (PR fix(agc): preserve ClearMRT color writes and validate stencil clears #1534 by hamb3r & PR fix(agc): draw with DB_RENDER_CONTROL STENCIL_CLEAR_ENABLE #1479):B10G11R11scene target usingDB_RENDER_CONTROLSTENCIL_CLEAR_ENABLE. PR fix(agc): preserve ClearMRT color writes and validate stencil clears #1534 decodesDB_STENCIL_CLEARas a rasterized stencil replace (VK_STENCIL_OP_REPLACE) while preserving all MRT color attachments and scissor coverage. This completely eliminates the blinding bloom highlights and LCD-bleed artifacts obscuring menus and gameplay.minImageCountfrom double buffering (surface.minImageCount= 2) to triple buffering (surface.minImageCount + 1). EnabledVK_PRESENT_MODE_MAILBOX_KHR(falling back to FIFO, overridable viaAPS5_PRESENT_MODE=fifo). Sizedstate->presentSlotsto match swapchain capacity. This eliminates the severe 12.5 FPS / 7.5 FPS / 20 FPS VSync quantization beats caused by double-buffered FIFO stalls on 100 Hz / 120 Hz displays.PollSleep) inQueueWorker.cppcaused severe lock contention onGuestMemory::GpuMutex(), starving CPU submission threads. Retaining condition variable signaling restored smooth execution.FPOrdNotEqual32through bitwise integer NaN checks ((bits(a) & 0x7fffffff) <= 0x7f800000), avoiding AMD Windows driver wave32 ballot bugs.D. Audio (
FMOD Studio,FMOD Core,Resonance Audio)FMOD_Studio_System_GetBusBootstrap Wrapper:DynamicLoader.cpp. The title'sFMODUnity.RuntimeManager.GetBuslooks upbus:/Master Bus/Dialoguebefore the title has calledLoadBankFile. The compatibility wrapper intercepts the initial failing lookup, validates that/app0/Media/StreamingAssets/Master.bankandMaster.strings.bankexist, loads them into the FMOD Studio system, flushes commands, and retries.bus:/Dialogue. The wrapper safely mapsbus:/Master Bus/Dialoguetobus:/Dialogueand returns FMOD's real bus handle without fabricating dummy objects or swallowing exceptions.E.
libSceVideoOutDisplayWindow.cpp. Added support for command-line arguments (--fullscreen/-fullscreen) and environment variableAPS5_FULLSCREEN=1to launch directly into hardware exclusive fullscreen (SDL_WINDOW_FULLSCREEN), allowing AMD Fluid Motion Frames (AFMF) to hook into the Vulkan swapchain. PressingF11toggles fullscreen at runtime.F. Network & Commerce Stubs
libSceSysmodule:0x110(libSceNpCommerce).libSceNpManager:sceNpManagerRegisterReachabilityStateCallback/sceNpManagerUnregisterReachabilityStateCallback, stubbed returning success).libSceNpEntitlementAccess:sceNpEntitlementAccessGetEntitlementKeyand individual add-on lookups, returning signed-out/not-found status for consumable network checks without fabricating online licenses.2. Fork-Specific Implementations & Revisions
All changes and tests have been pushed to
nahshongraham97/AnyPS5@main:b2a26e9dVK_PRESENT_MODE_MAILBOX_KHR, sizing presentation slots to eliminate VSync frame quantization.b2a26e9dNativePositionedon Windows during multi-threaded bundle decompression.21c20f8f--fullscreenandAPS5_FULLSCREENenvironment variable support for true hardware exclusive fullscreen (AFMF support).233e9cf6by hamb3r)DB_STENCIL_CLEARas rasterized stencil replace, and preserves MRT color outputs (eliminates bloom/render vomit).fc659038) & PR #1520 (76de2457)TimedWaitand nested APC sleeps their own waiters and timer handles on Windows.969a4c8esceSaveDataMount3mount_statusreporting and provides compliant POSIX directory mode bits under Windows.969a4c8ebus:/Master Bus/->bus:/).3. Boot Flow: Clean Boot vs. Resuming Saves
During testing, an interesting engine behavior was observed regarding save data state:
_sd/GOWSOSSAVE0):sharedassets1.resource(13.6 MB), decodes and plays the 665-frame intro movie, opens the Main Menu ("PRESS ANY BUTTON TO START"), and smoothly launches intro cutscenes and Cyclops combat._sd/GOWSOSSAVE0):archives_assets_all.bundle,defaultlocalgroup_assets_.bundle,DialogueLOC_en-US.assets.bank) while holding the Sony splash screen.4. How to Run on Windows
eboot.bin,Media/,sce_module/).AnyPS5runtime and relinker:build/exact-eboot-run/libs/.All reactions