- Atlus's GFD engine with CRI middleware (CPK archives, ADX2 sound, Sofdec2 movies through movie::Decoder); 3,128 GLSLC shaders: 3,050 loose files in data/shaders_binary, 76 in main and 2 the game compiles at boot (captured on the Mac) - Shader chain, for every game: this GLSLC (GPU code 1.15) writes each vertex shader as a VertexA part (shader type 0, the position) and a VertexB part (the other outputs) in one code area; shader_split.py reads type 0 as a vertex shader (sph_stage) and dmsh_build.py merges the two parts as Ryujinx does (vertex_ab). Without it every varying was lost and the screen was black. Every other profile's dmsh_chain.h rewritten with its c1_full / cb_extent lists carried over (the merge touches only type-0 vertex shaders, which no other game has); The Great Ace Attorney Chronicles checked on the Mac - Host, for every game: nvnDeviceGetInteger reports at least the GPU code version of the game's own GLSLC (the game refused to compile its built-in shaders against SDK 7's 1.5–1.14); nn::settings::GetAvailableLanguageCodeCount; nv12-uv-stride in the movie decoder's output format (CRI's player reads it unchecked and crashed on the first picture); a segment commit at the first pass boundary after a buffer → texture copy, since the game reuses the copy's staging memory a frame later (the subtitle band came out as another texture's blocks) - Memory: mem_used 96 MB (the rewritten modules take 92 MB, so SetHeapSize failed and the game ran on a 32 MB heap) - Prewarm list recorded from boot through the intro into the first Nightmare stage
2.7 KiB
2.7 KiB
| 1 | # Game profile of Catherine: Full Body (Switch, base game v0 + update 1.0.1a = v131072). In bring-up | ||||||
|---|---|---|---|---|---|---|---|
| 2 | # Format: see dm/games/README.md | ||||||
| 3 | # Atlus's GFD engine (the game's code name xrd758) on SDK 8.2.1, NVN; modules main + subsdk0 (GLSLC, the runtime shader compiler) + subsdk1 (NintendoSDK_movie) + sdk. | ||||||
| 4 | # RomFS: everything in five CRI CPK archives (data/Base.cpk, Model.cpk, Puzzle.cpk, Keyfree.cpk, Patch.cpk), CRI ADX2 sound (data/sound*/*.acb / .awb) and CRI Sofdec2 movies | ||||||
| 5 | # (data/movie*/*.usm, H.264 decoded through the SDK's movie::Decoder, hle_movie.c). | ||||||
| 6 | # Shaders: GLSLC outputs, one stage each: 3,050 in data/shaders_binary (*.vs / *.ps), 76 in main, and 2 the game compiles at boot with its own GLSLC from GLSL sources in main | ||||||
| 7 | # (captured on the Mac, hle_glslc.c). Its GLSLC (GPU code version 1.15) writes shader type 0 into every vertex shader's SPH (shader_split.py sph_stage) | ||||||
| 8 | # ---- Identity ---- | ||||||
| 9 | title_id | 0100BF00112C0000 | |||||
| 10 | program_id | 0100BF00112C0000 | |||||
| 11 | # ---- App ---- | ||||||
| 12 | # Game name: only a label for profile listings and the Mac window title; the iOS app name is the game name in the base NSP, and the bundle ID comes from the base game title ID (build_ipa.sh / NSP script) | ||||||
| 13 | name | Catherine: Full Body | |||||
| 14 | ipa | CatherineFullBody.ipa | |||||
| 15 | app_category | public.app-category.puzzle-games | |||||
| 16 | # ---- Versions ---- | ||||||
| 17 | # only the merged 1.0.1a copy is extracted; the base game's own build IDs are added when needed | ||||||
| 18 | build | v131072 | 1.0.1a | main=93a79c77da81f7f15db021c5c7431eb4 | subsdk0=c8a3cc0b1d1858330a881c0c2fc87940 | subsdk1=60c6edbbfcebd4176cc301d5d9cb5a6f | sdk=5fd4f531c1195e9e5510c9e73f22cd39 |
| 19 | package | v131072 | |||||
| 20 | shader_versions | v131072 | |||||
| 21 | # ---- Files ---- | ||||||
| 22 | # load order as on Horizon: main, subsdk*, sdk (subsdk0 = GLSLC, subsdk1 = NintendoSDK_movie) | ||||||
| 23 | modules | main subsdk0 subsdk1 sdk | |||||
| 24 | romfs_marker | data/Model.cpk | |||||
| 25 | zip_store | .awb:.cpk:.usm:.metallib | |||||
| 26 | # ---- Memory ---- | ||||||
| 27 | # The NPDM declares no system resource (META +0x14 = 0): nninitStartup sets a heap of the pool − 64 MB (3.11 GB), and main's bss is 48 MB. The 4 GB block of the other games | ||||||
| 28 | # without virtual address memory (256 MB in front + 256 MB alias region + 256 MB stack region + 3.25 GB heap region) | ||||||
| 29 | mem_reserve | 0x100000000 | |||||
| 30 | mem_alias | 0x10000000 | |||||
| 31 | mem_stack | 0x10000000 | |||||
| 32 | app_pool | 0xCD500000 | |||||
| 33 | # The rewritten modules take 92 MB (main 61 MB with its bss, GLSLC 9.5 MB, the movie library 7.6 MB, sdk 13.8 MB), more than the default 64 MB of used memory, so SetHeapSize(pool − 64 MB) | ||||||
| 34 | # failed and the game ran on a 32 MB heap until a 96 MB memory pool's storage came back null (main+0x2eb954). 96 MB, as the NSP script's guess after the rewrite | ||||||
| 35 | mem_used | 0x6000000 | |||||
| 36 | # ---- Shader split (shader_split.py; GLSLC outputs in loose RomFS files, main and the run-time capture) ---- | ||||||
| 37 | shader_groups | /data/=data | |||||
| 38 | shader_note | Catherine: Full Body shaders |