From 1a782136af2e551f6bbe30aa2b95c1ba03a41159 Mon Sep 17 00:00:00 2001 From: seedds Date: Thu, 22 Oct 2026 01:18:54 +0800 Subject: [PATCH] Patrick's Parabox plays on the Mac: profile 0100E44016C22000 (update 1.0.1, SDK 13.3.7) --- dm/games/0100E44016C22000/bf_want.tsv | 1 + dm/games/0100E44016C22000/c1_full.tsv | 2 + dm/games/0100E44016C22000/cb_extent.tsv | 370 +++++++++++++ dm/games/0100E44016C22000/dmsh_chain.h | 2 + dm/games/0100E44016C22000/game.tsv | 42 ++ dm/games/0100E44016C22000/pso_manifest.tsv | 12 + dm/games/0100E44016C22000/shader_facts.tsv | 2 + dm/games/0100E44016C22000/shader_map.tsv | 489 ++++++++++++++++++ .../shader_map.tsv.conflicts.tsv | 2 + dm/games/0100E44016C22000/shader_pairs.tsv | 244 +++++++++ dm/games/README.md | 2 +- dm/gfx/tools/unityfs.py | 26 +- dm/host/dm.h | 1 + dm/host/hle_audio.c | 2 + dm/host/hle_sdk16.c | 17 +- dm/host/loader.c | 10 + dm/tools/patch_nso.py | 7 + docs/agents/03-bringup.md | 4 +- docs/agents/04-graphics.md | 2 +- docs/development.md | 9 + 20 files changed, 1232 insertions(+), 14 deletions(-) create mode 100644 dm/games/0100E44016C22000/bf_want.tsv create mode 100644 dm/games/0100E44016C22000/c1_full.tsv create mode 100644 dm/games/0100E44016C22000/cb_extent.tsv create mode 100644 dm/games/0100E44016C22000/dmsh_chain.h create mode 100644 dm/games/0100E44016C22000/game.tsv create mode 100644 dm/games/0100E44016C22000/pso_manifest.tsv create mode 100644 dm/games/0100E44016C22000/shader_facts.tsv create mode 100644 dm/games/0100E44016C22000/shader_map.tsv create mode 100644 dm/games/0100E44016C22000/shader_map.tsv.conflicts.tsv create mode 100644 dm/games/0100E44016C22000/shader_pairs.tsv diff --git a/dm/games/0100E44016C22000/bf_want.tsv b/dm/games/0100E44016C22000/bf_want.tsv new file mode 100644 index 0000000..54caeb8 --- /dev/null +++ b/dm/games/0100E44016C22000/bf_want.tsv @@ -0,0 +1 @@ +# generated diff --git a/dm/games/0100E44016C22000/c1_full.tsv b/dm/games/0100E44016C22000/c1_full.tsv new file mode 100644 index 0000000..1f8dd66 --- /dev/null +++ b/dm/games/0100E44016C22000/c1_full.tsv @@ -0,0 +1,2 @@ +# chain b-59674bb2e85b 2026-10-22T01:20:27+08:00 +c62d1fc4921c1377 diff --git a/dm/games/0100E44016C22000/cb_extent.tsv b/dm/games/0100E44016C22000/cb_extent.tsv new file mode 100644 index 0000000..019e89c --- /dev/null +++ b/dm/games/0100E44016C22000/cb_extent.tsv @@ -0,0 +1,370 @@ +# chain b-59674bb2e85b 2026-10-22T01:20:28+08:00 +# shader key, then reg:bytes for each uniform slot whose reads stay inside its first bytes, and s for each storage slot it never writes (cb_extent.py) +00398cc3ae952e94 0:336 +007b5324a6b09547 1:144 +01fd2a158880c46c 1:224 +028401d54d1da1c6 0:144 +02bec2a78674d1ef 0:144 +02d285985f4de0ab 0:368 +035894b5106cf3ed 0:128 +037438dae11cad1e 0:464 +0454a3d2658fd56b 0:176 +051453afa2700cdc 0:192 +05b24d65460208c3 0:16 +064388a1ea548fdd 0:240 +0651176a5536a3cb 0:32 +065c182e971f45c1 0:16 +08dc3102cfd5e8a6 0:128 +08ede48328583fff 1:208 +08f55ea70dd1a7b1 0:240 +0922f9587e4d3469 0:240 +0b5b6d79e979b005 1:448 +0c00c5964de0cf09 0:16 +0c2e31bd3a74d664 0:48 +0c58a9807559beed 1:272 +0c8f1ab91d1f17fc 1:224 +0d28f332ae8b6794 0:176 +0e3bb972b87289ac 0:208 +103806f0287d8e82 1:224 +11db94d170361780 1:320 +12216c2c1ad65862 0:64 +12831359e24a7f36 0:32 +1352e7349aa5bd6c 0:144 +146888d011c11397 0:512 +16aba97d8accd368 0:16 +16ad2805653f294e 0:16 +189bccb4c9e62dc2 0:16 +18d233c8ce2063e4 0:336 +1981166796292a76 1:416 +19d4f6967f979e57 0:64 +1abc381c7d51a1d0 0:144 +1b641b486f4abb1f 1:224 +1c045a3a60e93e0b 0:384 +1c0d7fa6f7368bd3 0:64 +1c1746f5c6fe9026 1:224 +1c242554b4b193b2 0:240 +1c4051f65f9e8cfb 1:224 +1c58396df9868b41 0:16 +1cbc84f8bec27e8b 1:208 +1d627f037640066a 0:144 +1dc05ad5665d8a4c 0:144 +1dd63d696de56011 0:64 +1e6f6dfcb83ff0b8 0:224 +1f1f6ce60520176e 0:64 2:16 +1f49444eb070222b 0:96 +1fc399a55a876215 0:128 +201cb8bbacbd7fb6 0:208 +20b025826301b00f 0:144 +20e0baf64f67d500 0:192 +212fe6ce984594a6 0:288 +21f320aa3e0030e5 0:224 +2238281fcd903961 0:288 +22f9d5ca0b87ae27 1:272 +23591ece28f910db 1:224 +253365b47bc23cef 1:128 +254a103276ca365a 1:352 +263d647497125956 0:176 +271314fb1fb20d8b 1:176 +2762b390c0cca2f2 0:256 +2834d0f201c46f22 1:208 +29e8b6c3c27263b1 1:224 +2a647aa26fc99cf8 1:224 +2c70157eea350c83 1:272 +2d1b3f3d711cef38 0:96 2:16 +2d54d683ffec1179 0:528 +2e14bb2e1fc9bb47 0:64 +2e8626643d800da2 0:16 +2ea3e2b04a7693b2 1:224 +2f0ecae82daaa2a7 0:400 +2f8bac40925cf9f9 0:16 +2feb52b9b07c6bb4 0:544 +30c26fb6e1165cfd 1:144 +3108af9f8e703d14 0:176 +31dd28ab16c9b094 0:128 +32235f83ccde1464 0:400 +33f51f36ef977fb8 1:224 +3561765c9625666c 0:16 +35ece51bb0b7aa05 0:224 +36449adfc03e9e5b 1:224 +3666d87ffee9554c 1:272 +3718295bc534e823 0:208 +3734b4abd25c2229 0:144 +3828da8b076a5964 1:224 +38573b29e4bf9640 0:16 +3b5c436e26d15f0d 1:208 +3b88d6408daa4c5c 1:224 +3b8d8c63a04b13ff 0:64 2:16 +3b9259f246fd8177 0:64 2:16 +3ba237ef74f5656a 0:16 +3d216981f8303530 0:48 +3e2e4abbe70118d9 0:432 +3e8c5183ded746c5 1:208 +3ef2cd371bd1d7d4 1:144 +42befc9e1176ae86 1:272 +430d0acce4542399 0:64 2:16 +4326dbe869ffbb43 0:128 +4328bd7a54647831 1:224 +448c5333ac729300 1:224 +44b82f659a8279b2 0:144 +454720065ef1da4e 0:240 +457e078032e176f4 1:512 +45dbe097320bcba1 0:16 +4608c5baaeff20b8 1:224 +469436582c1329fb 0:144 +4960a262b6e24914 1:144 +49941b99bfe9089c 1:176 +4bcfc6506597598a 1:224 +4c00795c04d586b8 1:224 +4c627b41d9d0fa15 0:208 +4c87f534b74003b7 0:256 +4dc791f1e1e7e723 1:128 +4e7a069f2ffbcb3a 0:192 +4e8a8c1276a73092 0:208 +4e8caa87a3ecc5b4 0:192 +4f01106667b2dd73 1:272 +4f04284668cda745 0:144 +512b38e0e6936c1b 0:416 +517e627e2500b040 1:208 +52b405a534888e0b 0:32 +538b03ec322601ef 0:192 +53ece5df50060618 1:320 +5472dc7f2cecbc9d 0:176 +547ee4eefb71ad11 0:208 +54f6e6159418ddb6 1:128 +552bbc8ffc2459e4 0:16 +5685d1e2f0f730ad 1:208 +5719c76aea0dea70 0:16 +576e73f8b29f1d9d 1:224 +58319adbd982e2d8 0:256 +5869f7f587c67fd5 1:208 +59d05f6d419a5cf8 0:288 +5a100b1157cfe052 0:64 +5a36a7f010d54404 0:288 +5bf448b017c1e13e 0:176 +5d1c5b2a2e82cfaa 0:144 +5d9007df01d0dae1 1:224 +5e1d0a1bf9c0d9bf 0:144 +5e9399c6470a2353 1:224 +5ea50d77ecbcbdf1 1:224 +605081002963558b 1:320 +608c6acd64d675ce 0:288 +60fbe25cb56a7712 1:144 +6110ad0911b1d041 1:224 +61e17c4d0a5a2105 1:224 +637aa064cea3a05c 0:272 +63b9b40e6a0bd085 0:16 +63dab7ccf5608439 1:224 +63f7419f7d499a2d 1:224 +642b4363780b1ad3 0:16 +64aca428385e81d8 0:64 2:16 +64b1773d20d6bfce 0:144 +6556c131671b2ab4 0:160 +65adf94335678c81 0:48 +65d7472ab008889d 0:288 +6725ccddb7de8597 1:224 +672dff69fcab818a 0:512 +67933675ff36accf 0:192 +68ac2c5409d20d3b 0:16 +68ca89ea7bf8e08c 1:208 +6974cb506cdf808a 0:368 +6b8277ce8b82084b 0:224 +6c12767b9f91c778 0:144 +6c2eea4841001a97 1:208 +6ca9d4e07ce005ab 1:336 +6de9932e2c5de332 1:240 +71be74524c418730 1:224 +71f40fc6564d17f0 0:144 +720133bda2941918 1:224 +73b28c641d419aec 1:224 +7462b18d6d3f6acd 0:128 +74fbb2966adbeccc 0:144 +7597820a9c775fee 0:256 +763dbaf40c8bf151 0:16 +76452803be815e62 0:128 +76f48e2d5c70cb13 1:208 +76f72c003a44a51c 1:224 +77682234d04061e8 0:128 +78946f118ed7e65b 0:16 +78dd986b37afdef7 0:16 +79ad22033eeca459 1:272 +79bed8fd7dddc190 0:64 2:16 +7a3164fd32a19ef8 0:32 +7a9b6636a6d82836 0:16 +7b2ec731b8f6b1bb 0:16 +7cbad1dbebcdefed 1:144 +7d09833cfad48650 1:224 +7e1f73c27f2c8898 1:288 +7e8817c64eb7ba4e 1:144 +7ea13e9a0d6ae55a 0:448 +7ec1742913d9eafb 0:496 +7f99e57c7b37af0a 0:64 +7fec7ba415989235 0:80 2:16 +80f8c47784f926dd 0:256 +815f1e765259d6e4 0:64 +818975b7b29beac3 0:192 +82016d9869592493 1:416 +820f62d3eb811d75 0:128 +82feb52b3d67a05c 1:208 +83b13152e7ee094c 0:32 +83c296d84fda5b2d 0:48 +850aa723ed1418a8 0:400 +850dd3b7557336ac 0:336 +866bad01c08030a6 1:304 +86d2af23efeb93c3 1:272 +8999be1ce52a7e0f 1:224 +8a0c9551358dc234 1:272 +8a4d4e241b7aa60a 0:128 +8aaae08479567db8 0:144 +8aeaca2a4758a2bd 0:144 +8b5480013a696a13 0:272 +8c08ab9ffe0754cf 0:128 +8cc9281727f83e2b 1:208 +8d1b91c8b1bac900 0:448 +8e7cc7a6c62ca116 0:128 +8f3c7e83d2839765 0:16 +8fb8f8045fb30559 1:224 +9004c489232b63c6 1:272 +9101e6d447e5d619 1:208 +911febe0a0f8b259 1:192 +94504b7583cc4cb8 1:272 +9464138a02165965 0:256 +94fce7a21a5f086a 1:224 +95607a04ae0fe777 1:272 +9683a2919e4392f8 1:144 +99c0b83f5566025e 0:128 +9a1d5e59897b998f 0:64 +9af2907c7a167e26 1:176 +9b0f5347f1e6d392 0:256 +9b49bfb318caa317 1:224 +9baec0226376d6ac 0:128 +9c09edbd5ec2f13f 1:208 +9c5f8353fe610f5c 0:256 +9ca2ef07adeea226 1:192 +9da548fbdfa199d0 1:128 +9e39ccd9150477e1 0:448 +9ff8b3cc29b36e9a 0:64 2:16 +a05896a336fd2430 0:544 +a0f6da96e19cc89d 1:224 +a1b889ebd904003e 1:208 +a431b756a46553f0 0:144 +a57c4c2cd426e0a2 0:16 +a5853f3aae29c22e 0:144 +a5bae1156cbae44f 0:224 +a6c10e9640b06a6c 0:144 +a763572eb327193b 0:16 +a77214284b543a3d 0:288 +a79608f6984963a9 0:64 +a7ec99e9f2d6fe52 0:256 +a9a2aac70fce0505 0:128 +a9d75708385e65ac 0:128 +a9ed6a198208176d 1:128 +a9ffc432f9a5221b 0:32 +ab22b38a18960270 0:240 +ab521b9ddc509678 0:144 +aba45e6c24c1719e 0:80 +ad72b6483d438634 1:224 +ad7d9e76bcbf821a 0:48 +ae7524bcc0d357f6 0:384 +b14e61477cda386a 0:240 +b1523e1715ed1ffe 0:288 +b1579037482f84d2 0:16 +b4c6cb40157e7e7a 1:448 +b55911c9e62633fb 1:144 +b7c1a0fd7e74af09 0:528 +b9340926ee8317b6 0:64 2:16 +bbcf09def079f900 1:224 +bcc9a0ea73904bf2 0:208 +bd48d38db2c06e84 1:208 +be6c641cff370911 0:144 +beb10cfa9b095a45 1:224 +c097cd5d5d2eb88b 0:16 +c203d14fd51cca25 1:384 +c212018ea30733f6 0:496 +c2a48646a78719f4 0:16 +c42651553e9b4977 0:224 +c4329d61294e9670 0:16 +c500036faad1f981 0:480 +c629dc1d5960c09e 1:224 +c62d1fc4921c1377 0:160 +c76c0d6e7f9b2d5e 0:32 +c7c82cccf2674227 0:288 +c8170f0120011ba6 0:224 +c8ef8fef61043381 0:224 +c9a3f8cf0733b97c 0:144 +caeebcde9f565580 1:208 +cd375a4b47398de0 1:336 +cf37aedcf237eda7 0:64 +cfb16341fc83d918 1:272 +cfbf314a59b3acde 0:144 +d0bb6465b6d2ff7c 0:208 +d0d34347bb40a903 0:128 +d0ea30176b383ef3 0:16 +d0f8e76b3c06c1ae 0:192 +d1765451ae8474c7 0:16 +d292d10e75f043c4 0:160 +d3304425b480594f 0:192 +d4ea6a856021a728 1:336 +d4f7794f6af8599a 1:128 +d50534e953b635ab 1:224 +d619b83106aefb18 1:224 +d66d09ce180d7fbc 0:144 +d785ab013883475b 1:208 +d8eea154dcc04b47 1:272 +d9b426d5ceeae08b 1:208 +db134d4fe7001380 1:208 +db5a4562057f1022 0:416 +de06d6c38ac2cfc2 0:144 +ded118752fec7cc6 0:208 +df55cfb6cfecb5c2 1:224 +dfecd32fe505066e 1:224 +e0e6a430bf54b117 1:224 +e12f2744a4904755 0:256 +e14a3e13850c22b4 0:256 +e21bd2828f9ca0b5 0:64 +e2738fdfb7e4404f 0:176 +e2a55b293701e7a7 1:336 +e301decfd89e9c01 1:224 +e4b076b7820d6765 0:496 +e552fbd474213e47 1:224 +e61c9c7aa47fa032 0:192 +e645149e89fdf09b 1:272 +e67d1b52492a3afc 0:128 +e6aa2533dace377b 1:224 +e6e192be4eafd0e2 0:16 +e8212e8594b661eb 1:224 +e86f63dd7aa96777 0:128 +e8fa6efcc545d3b3 0:128 +e942dc8fc945f383 1:128 +e9ad4a49b7553103 0:208 +ed7b750d32cc7171 1:224 +edda55fc6eda677f 0:144 +edf3af767f761286 1:336 +ee79b649974876e1 1:240 +eec3d1acf0835ab9 0:128 +eed6de9d98b6b7fb 1:128 +eef6a5b4e774239e 1:144 +ef19d135ba41f429 1:224 +ef760d9ec12296c2 0:144 +f0589e1589a7d436 0:64 2:16 +f25230c0c352503f 0:144 +f25f0fbc66707175 0:144 +f2b69d8b0a04d919 0:416 +f48b979b468e9d54 0:64 +f4f77b6434a02ada 0:128 +f5b2a2496f585b69 0:64 2:16 +f5b8272553b981fe 0:192 +f66cab3d319d7101 0:16 +f6c30c8ec16eac71 0:416 +f7115215ff18628f 1:480 +f883f51011f77b2d 1:224 +f9945dd7b0d801aa 0:176 +fa34be1f0e5acf60 1:128 +fa550eee15ab8dbd 0:16 +fa93581b00c1576b 0:16 +fbbca370c047d9c2 1:272 +fbf05c11229fdf6a 1:208 +fc0a3ccd26413bfb 1:224 +fcec8020419e9cff 1:336 +fcff4f3726d8ef37 0:128 +fd383172b39b0301 1:128 +fdfdd27bd84b793e 0:16 diff --git a/dm/games/0100E44016C22000/dmsh_chain.h b/dm/games/0100E44016C22000/dmsh_chain.h new file mode 100644 index 0000000..e37539b --- /dev/null +++ b/dm/games/0100E44016C22000/dmsh_chain.h @@ -0,0 +1,2 @@ +// Generated file (dm/gfx/tools/dmsh_chain.py --header, game 0100E44016C22000): the B shader library translation chain version this source tree expects (default options); the host loads only /b-/ +#define DMSH_CHAIN "59674bb2e85b" diff --git a/dm/games/0100E44016C22000/game.tsv b/dm/games/0100E44016C22000/game.tsv new file mode 100644 index 0000000..c86e04e --- /dev/null +++ b/dm/games/0100E44016C22000/game.tsv @@ -0,0 +1,42 @@ +# Game profile of Patrick's Parabox (Switch, update 1.0.1 = v65536). Plays on the Mac +# Format: see dm/games/README.md +# Unity 2020.3.30f1 (IL2CPP), SDK 13.3.7: the shaders are Unity's built-in Shader objects in Data/Resources (unity default resources, unity_builtin_extra), which carry no type trees and no bundle +# lends one; unityfs.py has Unity 2020.3's Shader layout (KNOWN_TREES, the tree of Fire Emblem Engage's bundles). The game's only font, Jost, falls back to the shared fonts for Japanese, Korean +# and Chinese, which Unity hands to FreeType as TTFs (hle_sdk16.c font_skip) +# Controller only (stick or D-pad to move, A to confirm): it stays docked (1920x1080) with the default 2D pad layout + +# ---- Identity ---- +title_id 0100E44016C22000 +program_id 0100E44016C22000 + +# ---- App ---- +# 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) +name Patrick's Parabox +ipa PatricksParabox.ipa +app_category public.app-category.puzzle-games + +# ---- Versions ---- +build v65536 1.0.1 main=86171cbde77fb44989fbc97905ffc8f4 subsdk0=525feff80957be306b46b74636256582 sdk=9c73fb73f529fedc9ffefa28246711cc +package v65536 +shader_versions v65536 + +# ---- Files ---- +# load order as on Horizon: main, subsdk*, sdk (subsdk0 = NintendoSDK_movie) +modules main subsdk0 sdk +romfs_marker Data/globalgamemanagers +zip_store .assets:.bank:.dat:.json:.ress:.metallib + +# ---- Memory ---- +# The NPDM declares 16 MB of system resource, so IsVirtualAddressMemoryEnabled is true: nninitStartup (main+0x1cd010) hands application pool − used memory to StandardAllocator as virtual address memory +# and never calls SetMemoryHeapSize. The node area cut for this sdk build (patch_nso.py) shrinks the AddressRegionManager's node area to 62 MB, as for Ace Attorney Investigations Collection and +# Brain Memory Training Academy, whose layout this is: a 1 GB pool and the 5 GB block (256 MB in front + 4.375 GB alias region + 256 MB stack region + 128 MB heap region) +sys_resource 0x1000000 +mem_reserve 0x140000000 +mem_alias 0x118000000 +mem_stack 0x10000000 +app_pool 0x40000000 + +# ---- Shader split (shader_split.py; Unity Shader objects, read by unityfs.py) ---- +# engine built-ins (Resources/: unity default resources, unity_builtin_extra) go to engine, the player's serialized files to data +shader_groups /Resources/=engine /Data/=data +shader_note Patrick's Parabox shaders diff --git a/dm/games/0100E44016C22000/pso_manifest.tsv b/dm/games/0100E44016C22000/pso_manifest.tsv new file mode 100644 index 0000000..aaeb402 --- /dev/null +++ b/dm/games/0100E44016C22000/pso_manifest.tsv @@ -0,0 +1,12 @@ +# Prewarm seed list (shipped in the app, next to shader_map.tsv). Rows: Sshader keystage / Rrender pipeline key (pso_skey hex) / Ccompute shader key. +# Recorded on the Mac with prewarm off: boot, the language menu, the title, the hub, Intro 1 solved, Intro 2 with undo, reset and the menu (the game draws with three shader pairs in four pipelines) +S 71f40fc6564d17f0_b 0 +S 061c2997bc075e9a_b 1 +S 2238281fcd903961_b 0 +S 696fc4ca4c3ab7a7_b 1 +S 0454a3d2658fd56b_b 0 +S 8778dd1f96a9ca43_b 1 +R 373166343066633635363464313766305f62000000000000303631633239393762633037356539615f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004600000000000000000000000000000000000000000000000000000000000000040100000401000001000000ff000000ffffffff000000002818048204000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022000000250c00001610000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000180000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 323233383238316663643930333936315f62000000000000363936666334636134633361623761375f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004600000000000000000000000000000000000000000000000000000000000000040100000401000001000000ff000000ffffffff000000002818048604000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022000000250c00001610000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000180000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 373166343066633635363464313766305f62000000000000303631633239393762633037356539615f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004600000000000000000000000000000000000000000000000000000000000000040100000401000001000000ff000000ffffffff0000000028180482040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000220000002e1800002228000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000580000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +R 303435346133643236353866643536625f62000000000000383737386464316639366139636134335f6200000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004600000000000000000000000000000000000000000000000000000000000000040100000401000001000000ff000000ffffffff0000000010180486040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000220000002504001016000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 diff --git a/dm/games/0100E44016C22000/shader_facts.tsv b/dm/games/0100E44016C22000/shader_facts.tsv new file mode 100644 index 0000000..a1bb67b --- /dev/null +++ b/dm/games/0100E44016C22000/shader_facts.tsv @@ -0,0 +1,2 @@ +# Answer table for translation queries (generated by dm/gfx/tools/shader_split.py, do not edit): key fact JSON. This game has no PC version to pair with: only the thread group / shared memory of compute shaders (taken from the control section); other queries get the translator defaults +552bbc8ffc2459e4 {"local":[4,4,4],"shared":0} diff --git a/dm/games/0100E44016C22000/shader_map.tsv b/dm/games/0100E44016C22000/shader_map.tsv new file mode 100644 index 0000000..4bcde99 --- /dev/null +++ b/dm/games/0100E44016C22000/shader_map.tsv @@ -0,0 +1,489 @@ +# kind: evidence Patrick's Parabox shaders (Unity Shader / GLSLC in RomFS + main) → control section + code area keys (dm/gfx/tools/shader_split.py) +# column 5 records where each key first appears; this game has no PC version to pair with +package index stage dm_ctl_sha16 source +ps_engine.bin 0 pixel 9d35249d16ea8cfe /Data/Resources/unity default resources#GUI/Text Shader#var19.0 +vs_engine.bin 0 vertex d292d10e75f043c4 /Data/Resources/unity default resources#GUI/Text Shader#var19.0 +vs_engine.bin 1 vertex 2d1b3f3d711cef38 /Data/Resources/unity default resources#GUI/Text Shader#var19.1 +ps_engine.bin 1 pixel 6c399c8609f698ca /Data/Resources/unity default resources#GUI/Text Shader#var19.1 +vs_engine.bin 2 vertex 1f49444eb070222b /Data/Resources/unity default resources#GUI/Text Shader#var19.2 +ps_engine.bin 2 pixel 8a4df70a216d00ec /Data/Resources/unity default resources#GUI/Text Shader#var19.2 +vs_engine.bin 3 vertex 6556c131671b2ab4 /Data/Resources/unity default resources#GUI/Text Shader#var19.3 +ps_engine.bin 3 pixel 8be338953a88640d /Data/Resources/unity default resources#GUI/Text Shader#var19.3 +ps_engine.bin 4 pixel 3d216981f8303530 /Data/Resources/unity default resources#Hidden/FrameDebuggerRenderTargetDisplay#var19.0 +vs_engine.bin 4 vertex e942dc8fc945f383 /Data/Resources/unity default resources#Hidden/FrameDebuggerRenderTargetDisplay#var19.0 +ps_engine.bin 5 pixel 0c2e31bd3a74d664 /Data/Resources/unity default resources#Hidden/FrameDebuggerRenderTargetDisplay#var19.1 +vs_engine.bin 5 vertex fd383172b39b0301 /Data/Resources/unity default resources#Hidden/FrameDebuggerRenderTargetDisplay#var19.1 +ps_engine.bin 6 pixel 65adf94335678c81 /Data/Resources/unity default resources#Hidden/FrameDebuggerRenderTargetDisplay#var19.2 +vs_engine.bin 6 vertex eed6de9d98b6b7fb /Data/Resources/unity default resources#Hidden/FrameDebuggerRenderTargetDisplay#var19.2 +vs_engine.bin 7 vertex 44b82f659a8279b2 /Data/Resources/unity default resources#Hidden/Internal-Colored#var19.0 +ps_engine.bin 7 pixel 66d073a2b47ec252 /Data/Resources/unity default resources#Hidden/Internal-Colored#var19.0 +vs_engine.bin 8 vertex 7fec7ba415989235 /Data/Resources/unity default resources#Hidden/Internal-Colored#var19.1 +ps_engine.bin 8 pixel 8f2c1c74aaabf3a4 /Data/Resources/unity default resources#Hidden/Internal-Colored#var19.1 +vs_engine.bin 9 vertex aba45e6c24c1719e /Data/Resources/unity default resources#Hidden/Internal-Colored#var19.2 +ps_engine.bin 9 pixel c0250cdbc59e1533 /Data/Resources/unity default resources#Hidden/Internal-Colored#var19.2 +ps_engine.bin 10 pixel 635e833c64a9409b /Data/Resources/unity default resources#Hidden/Internal-Colored#var19.3 +vs_engine.bin 10 vertex 6c12767b9f91c778 /Data/Resources/unity default resources#Hidden/Internal-Colored#var19.3 +ps_engine.bin 11 pixel 1a28811241f23fa0 /Data/Resources/unity default resources#Hidden/Internal-Loading#var19.0 +vs_engine.bin 11 vertex 99c0b83f5566025e /Data/Resources/unity default resources#Hidden/Internal-Loading#var19.0 +vs_engine.bin 12 vertex 3b9259f246fd8177 /Data/Resources/unity default resources#Hidden/Internal-Loading#var19.1 +ps_engine.bin 12 pixel a5471f8318af9793 /Data/Resources/unity default resources#Hidden/Internal-Loading#var19.1 +vs_engine.bin 13 vertex 2e14bb2e1fc9bb47 /Data/Resources/unity default resources#Hidden/Internal-Loading#var19.2 +ps_engine.bin 13 pixel 48c5a6bb1466a515 /Data/Resources/unity default resources#Hidden/Internal-Loading#var19.2 +vs_engine.bin 14 vertex 820f62d3eb811d75 /Data/Resources/unity default resources#Hidden/Internal-Loading#var19.3 +ps_engine.bin 14 pixel ae3a745d48792d32 /Data/Resources/unity default resources#Hidden/Internal-Loading#var19.3 +ps_engine.bin 15 pixel 85a793c989fecf10 /Data/Resources/unity default resources#Hidden/InternalClear#var19.0 +vs_engine.bin 15 vertex a9d75708385e65ac /Data/Resources/unity default resources#Hidden/InternalClear#var19.0 +vs_engine.bin 16 vertex 79bed8fd7dddc190 /Data/Resources/unity default resources#Hidden/InternalClear#var19.1 +ps_engine.bin 16 pixel a2a9a3b597ff3160 /Data/Resources/unity default resources#Hidden/InternalClear#var19.1 +vs_engine.bin 17 vertex 1c0d7fa6f7368bd3 /Data/Resources/unity default resources#Hidden/InternalClear#var19.10 +ps_engine.bin 17 pixel ef6b59c44062ab3e /Data/Resources/unity default resources#Hidden/InternalClear#var19.10 +ps_engine.bin 18 pixel 1c2ff09f94b2e097 /Data/Resources/unity default resources#Hidden/InternalClear#var19.11 +vs_engine.bin 18 vertex a9a2aac70fce0505 /Data/Resources/unity default resources#Hidden/InternalClear#var19.11 +vs_engine.bin 19 vertex 4326dbe869ffbb43 /Data/Resources/unity default resources#Hidden/InternalClear#var19.12 +ps_engine.bin 19 pixel 690110f53535d3f4 /Data/Resources/unity default resources#Hidden/InternalClear#var19.12 +vs_engine.bin 20 vertex 3b8d8c63a04b13ff /Data/Resources/unity default resources#Hidden/InternalClear#var19.13 +ps_engine.bin 20 pixel 6bb2c32ff0e3a7f0 /Data/Resources/unity default resources#Hidden/InternalClear#var19.13 +ps_engine.bin 21 pixel 14d8af7c1892ef9e /Data/Resources/unity default resources#Hidden/InternalClear#var19.14 +vs_engine.bin 21 vertex cf37aedcf237eda7 /Data/Resources/unity default resources#Hidden/InternalClear#var19.14 +ps_engine.bin 22 pixel 422dbe3ebb55095a /Data/Resources/unity default resources#Hidden/InternalClear#var19.15 +vs_engine.bin 22 vertex d0d34347bb40a903 /Data/Resources/unity default resources#Hidden/InternalClear#var19.15 +vs_engine.bin 23 vertex 035894b5106cf3ed /Data/Resources/unity default resources#Hidden/InternalClear#var19.16 +ps_engine.bin 23 pixel d0772924cca9026d /Data/Resources/unity default resources#Hidden/InternalClear#var19.16 +vs_engine.bin 24 vertex 9ff8b3cc29b36e9a /Data/Resources/unity default resources#Hidden/InternalClear#var19.17 +ps_engine.bin 24 pixel f325fdb7a00213bb /Data/Resources/unity default resources#Hidden/InternalClear#var19.17 +ps_engine.bin 25 pixel 1a557c30ff661c82 /Data/Resources/unity default resources#Hidden/InternalClear#var19.18 +vs_engine.bin 25 vertex a79608f6984963a9 /Data/Resources/unity default resources#Hidden/InternalClear#var19.18 +vs_engine.bin 26 vertex 1fc399a55a876215 /Data/Resources/unity default resources#Hidden/InternalClear#var19.19 +ps_engine.bin 26 pixel 8dfd7917a41f7d1f /Data/Resources/unity default resources#Hidden/InternalClear#var19.19 +vs_engine.bin 27 vertex 12216c2c1ad65862 /Data/Resources/unity default resources#Hidden/InternalClear#var19.2 +ps_engine.bin 27 pixel 6d6190449188c57a /Data/Resources/unity default resources#Hidden/InternalClear#var19.2 +ps_engine.bin 28 pixel b71d5b7d9f3424f2 /Data/Resources/unity default resources#Hidden/InternalClear#var19.20 +vs_engine.bin 28 vertex e8fa6efcc545d3b3 /Data/Resources/unity default resources#Hidden/InternalClear#var19.20 +vs_engine.bin 29 vertex 430d0acce4542399 /Data/Resources/unity default resources#Hidden/InternalClear#var19.21 +ps_engine.bin 29 pixel b9ff87f4f609b849 /Data/Resources/unity default resources#Hidden/InternalClear#var19.21 +ps_engine.bin 30 pixel 07bd34ff49c50199 /Data/Resources/unity default resources#Hidden/InternalClear#var19.22 +vs_engine.bin 30 vertex f48b979b468e9d54 /Data/Resources/unity default resources#Hidden/InternalClear#var19.22 +ps_engine.bin 31 pixel 41ce8f2e6d7c669b /Data/Resources/unity default resources#Hidden/InternalClear#var19.23 +vs_engine.bin 31 vertex 7462b18d6d3f6acd /Data/Resources/unity default resources#Hidden/InternalClear#var19.23 +ps_engine.bin 32 pixel 446854668ff259c4 /Data/Resources/unity default resources#Hidden/InternalClear#var19.24 +vs_engine.bin 32 vertex 9baec0226376d6ac /Data/Resources/unity default resources#Hidden/InternalClear#var19.24 +ps_engine.bin 33 pixel 79f1cf52cd27b63c /Data/Resources/unity default resources#Hidden/InternalClear#var19.25 +vs_engine.bin 33 vertex f0589e1589a7d436 /Data/Resources/unity default resources#Hidden/InternalClear#var19.25 +vs_engine.bin 34 vertex 1dd63d696de56011 /Data/Resources/unity default resources#Hidden/InternalClear#var19.26 +ps_engine.bin 34 pixel f2abd15b2dc5f12b /Data/Resources/unity default resources#Hidden/InternalClear#var19.26 +ps_engine.bin 35 pixel 65860f69bedbf434 /Data/Resources/unity default resources#Hidden/InternalClear#var19.27 +vs_engine.bin 35 vertex 77682234d04061e8 /Data/Resources/unity default resources#Hidden/InternalClear#var19.27 +vs_engine.bin 36 vertex 8e7cc7a6c62ca116 /Data/Resources/unity default resources#Hidden/InternalClear#var19.28 +ps_engine.bin 36 pixel eb0ebddbb916b461 /Data/Resources/unity default resources#Hidden/InternalClear#var19.28 +ps_engine.bin 37 pixel 0372bcc4d3d0a328 /Data/Resources/unity default resources#Hidden/InternalClear#var19.29 +vs_engine.bin 37 vertex b9340926ee8317b6 /Data/Resources/unity default resources#Hidden/InternalClear#var19.29 +ps_engine.bin 38 pixel 7e48c46d34ff85e8 /Data/Resources/unity default resources#Hidden/InternalClear#var19.3 +vs_engine.bin 38 vertex e86f63dd7aa96777 /Data/Resources/unity default resources#Hidden/InternalClear#var19.3 +ps_engine.bin 39 pixel d5c2d89800ba6b4d /Data/Resources/unity default resources#Hidden/InternalClear#var19.30 +vs_engine.bin 39 vertex e21bd2828f9ca0b5 /Data/Resources/unity default resources#Hidden/InternalClear#var19.30 +ps_engine.bin 40 pixel 82e022715fb3be05 /Data/Resources/unity default resources#Hidden/InternalClear#var19.31 +vs_engine.bin 40 vertex 8a4d4e241b7aa60a /Data/Resources/unity default resources#Hidden/InternalClear#var19.31 +vs_engine.bin 41 vertex 31dd28ab16c9b094 /Data/Resources/unity default resources#Hidden/InternalClear#var19.4 +ps_engine.bin 41 pixel 4c65efd79b288ea3 /Data/Resources/unity default resources#Hidden/InternalClear#var19.4 +ps_engine.bin 42 pixel 37e89d30727a528e /Data/Resources/unity default resources#Hidden/InternalClear#var19.5 +vs_engine.bin 42 vertex f5b2a2496f585b69 /Data/Resources/unity default resources#Hidden/InternalClear#var19.5 +vs_engine.bin 43 vertex 5a100b1157cfe052 /Data/Resources/unity default resources#Hidden/InternalClear#var19.6 +ps_engine.bin 43 pixel f4a9b126a1f28a46 /Data/Resources/unity default resources#Hidden/InternalClear#var19.6 +ps_engine.bin 44 pixel 3c3f040cc5c04cf8 /Data/Resources/unity default resources#Hidden/InternalClear#var19.7 +vs_engine.bin 44 vertex 8c08ab9ffe0754cf /Data/Resources/unity default resources#Hidden/InternalClear#var19.7 +ps_engine.bin 45 pixel 84f8a78c71f49680 /Data/Resources/unity default resources#Hidden/InternalClear#var19.8 +vs_engine.bin 45 vertex f4f77b6434a02ada /Data/Resources/unity default resources#Hidden/InternalClear#var19.8 +vs_engine.bin 46 vertex 1f1f6ce60520176e /Data/Resources/unity default resources#Hidden/InternalClear#var19.9 +ps_engine.bin 46 pixel afca8dff9b333c1b /Data/Resources/unity default resources#Hidden/InternalClear#var19.9 +ps_engine.bin 47 pixel 1eb83f9aed5ad26e /Data/Resources/unity default resources#Hidden/InternalErrorShader#var19.0 +vs_engine.bin 47 vertex 76452803be815e62 /Data/Resources/unity default resources#Hidden/InternalErrorShader#var19.0 +vs_engine.bin 48 vertex 64aca428385e81d8 /Data/Resources/unity default resources#Hidden/InternalErrorShader#var19.1 +ps_engine.bin 48 pixel e204b19fd86a2723 /Data/Resources/unity default resources#Hidden/InternalErrorShader#var19.1 +ps_engine.bin 49 pixel 5c60f4e7f30bf6e5 /Data/Resources/unity default resources#Hidden/InternalErrorShader#var19.2 +vs_engine.bin 49 vertex 7f99e57c7b37af0a /Data/Resources/unity default resources#Hidden/InternalErrorShader#var19.2 +ps_engine.bin 50 pixel c43192ba698e2bba /Data/Resources/unity default resources#Hidden/InternalErrorShader#var19.3 +vs_engine.bin 50 vertex eec3d1acf0835ab9 /Data/Resources/unity default resources#Hidden/InternalErrorShader#var19.3 +vs_engine.bin 51 vertex 7cbad1dbebcdefed /Data/Resources/unity_builtin_extra#Hidden/BlitCopy#var19.0 +ps_engine.bin 51 pixel f66cab3d319d7101 /Data/Resources/unity_builtin_extra#Hidden/BlitCopy#var19.0 +vs_engine.bin 52 vertex 1d627f037640066a /Data/Resources/unity_builtin_extra#Hidden/BlitCopyDepth#var19.0 +ps_engine.bin 52 pixel 30e2faa2d1af10d0 /Data/Resources/unity_builtin_extra#Hidden/BlitCopyDepth#var19.0 +ps_engine.bin 53 pixel 065c182e971f45c1 /Data/Resources/unity_builtin_extra#Hidden/BlitCopyHDRTonemap#var19.0 +vs_engine.bin 53 vertex 60fbe25cb56a7712 /Data/Resources/unity_builtin_extra#Hidden/BlitCopyHDRTonemap#var19.0 +vs_engine.bin 54 vertex 30c26fb6e1165cfd /Data/Resources/unity_builtin_extra#Hidden/BlitCopyWithDepth#var19.0 +ps_engine.bin 54 pixel 78dd986b37afdef7 /Data/Resources/unity_builtin_extra#Hidden/BlitCopyWithDepth#var19.0 +ps_engine.bin 55 pixel 2fda15a6b7969a86 /Data/Resources/unity_builtin_extra#Hidden/BlitToDepth#var19.0 +vs_engine.bin 55 vertex ef760d9ec12296c2 /Data/Resources/unity_builtin_extra#Hidden/BlitToDepth#var19.0 +ps_engine.bin 56 pixel 7a734b9a5971a10c /Data/Resources/unity_builtin_extra#Hidden/BlitToDepth_MSAA#var19.0 +vs_engine.bin 56 vertex c9a3f8cf0733b97c /Data/Resources/unity_builtin_extra#Hidden/BlitToDepth_MSAA#var19.0 +vs_engine.bin 57 vertex 3ef2cd371bd1d7d4 /Data/Resources/unity_builtin_extra#Hidden/Compositing#var19.0 +ps_engine.bin 57 pixel fa93581b00c1576b /Data/Resources/unity_builtin_extra#Hidden/Compositing#var19.0 +vs_engine.bin 58 vertex c62d1fc4921c1377 /Data/Resources/unity_builtin_extra#Hidden/ConvertTexture#var19.0 +ps_engine.bin 58 pixel e5a69346ec2d7365 /Data/Resources/unity_builtin_extra#Hidden/ConvertTexture#var19.0 +ps_engine.bin 59 pixel ad7d9e76bcbf821a /Data/Resources/unity_builtin_extra#Hidden/CubeBlend#var19.0 +vs_engine.bin 59 vertex fa34be1f0e5acf60 /Data/Resources/unity_builtin_extra#Hidden/CubeBlend#var19.0 +ps_engine.bin 60 pixel 83c296d84fda5b2d /Data/Resources/unity_builtin_extra#Hidden/CubeBlend#var19.1 +vs_engine.bin 60 vertex 9da548fbdfa199d0 /Data/Resources/unity_builtin_extra#Hidden/CubeBlend#var19.1 +vs_engine.bin 61 vertex d4f7794f6af8599a /Data/Resources/unity_builtin_extra#Hidden/CubeBlur#var19.0 +ps_engine.bin 61 pixel fdfdd27bd84b793e /Data/Resources/unity_builtin_extra#Hidden/CubeBlur#var19.0 +vs_engine.bin 62 vertex 253365b47bc23cef /Data/Resources/unity_builtin_extra#Hidden/CubeBlur#var19.1 +ps_engine.bin 62 pixel 8f3c7e83d2839765 /Data/Resources/unity_builtin_extra#Hidden/CubeBlur#var19.1 +ps_engine.bin 63 pixel 0c00c5964de0cf09 /Data/Resources/unity_builtin_extra#Hidden/CubeCopy#var19.0 +vs_engine.bin 63 vertex 54f6e6159418ddb6 /Data/Resources/unity_builtin_extra#Hidden/CubeCopy#var19.0 +ps_engine.bin 64 pixel 5719c76aea0dea70 /Data/Resources/unity_builtin_extra#Hidden/CubeCopy#var19.1 +vs_engine.bin 64 vertex a9ed6a198208176d /Data/Resources/unity_builtin_extra#Hidden/CubeCopy#var19.1 +ps_engine.bin 65 pixel 19d4f6967f979e57 /Data/Resources/unity_builtin_extra#Hidden/Internal-CombineDepthNormals#var19.0 +vs_engine.bin 65 vertex 7e8817c64eb7ba4e /Data/Resources/unity_builtin_extra#Hidden/Internal-CombineDepthNormals#var19.0 +vs_engine.bin 66 vertex 64b1773d20d6bfce /Data/Resources/unity_builtin_extra#Hidden/Internal-CubemapToEquirect#var19.0 +ps_engine.bin 66 pixel 9ead2d48448a22e8 /Data/Resources/unity_builtin_extra#Hidden/Internal-CubemapToEquirect#var19.0 +vs_engine.bin 67 vertex 5d9007df01d0dae1 /Data/Resources/unity_builtin_extra#Hidden/Internal-DeferredReflections#var19.0 +ps_engine.bin 67 pixel f5b8272553b981fe /Data/Resources/unity_builtin_extra#Hidden/Internal-DeferredReflections#var19.0 +vs_engine.bin 68 vertex 20b025826301b00f /Data/Resources/unity_builtin_extra#Hidden/Internal-DeferredReflections#var19.1 +ps_engine.bin 68 pixel aa8857b603a43017 /Data/Resources/unity_builtin_extra#Hidden/Internal-DeferredReflections#var19.1 +vs_engine.bin 69 vertex 1abc381c7d51a1d0 /Data/Resources/unity_builtin_extra#Hidden/Internal-DeferredReflections#var19.2 +ps_engine.bin 69 pixel a70ba8561bbaecba /Data/Resources/unity_builtin_extra#Hidden/Internal-DeferredReflections#var19.2 +ps_engine.bin 70 pixel 5d1c5b2a2e82cfaa /Data/Resources/unity_builtin_extra#Hidden/Internal-DeferredShading#var19.0 +vs_engine.bin 70 vertex 720133bda2941918 /Data/Resources/unity_builtin_extra#Hidden/Internal-DeferredShading#var19.0 +ps_engine.bin 71 pixel 028401d54d1da1c6 /Data/Resources/unity_builtin_extra#Hidden/Internal-DeferredShading#var19.1 +vs_engine.bin 71 vertex 8fb8f8045fb30559 /Data/Resources/unity_builtin_extra#Hidden/Internal-DeferredShading#var19.1 +ps_engine.bin 72 pixel 4e7a069f2ffbcb3a /Data/Resources/unity_builtin_extra#Hidden/Internal-DeferredShading#var19.10 +vs_engine.bin 72 vertex ad72b6483d438634 /Data/Resources/unity_builtin_extra#Hidden/Internal-DeferredShading#var19.10 +ps_engine.bin 73 pixel 2762b390c0cca2f2 /Data/Resources/unity_builtin_extra#Hidden/Internal-DeferredShading#var19.11 +vs_engine.bin 73 vertex ed7b750d32cc7171 /Data/Resources/unity_builtin_extra#Hidden/Internal-DeferredShading#var19.11 +vs_engine.bin 74 vertex 4608c5baaeff20b8 /Data/Resources/unity_builtin_extra#Hidden/Internal-DeferredShading#var19.12 +ps_engine.bin 74 pixel 9c5f8353fe610f5c /Data/Resources/unity_builtin_extra#Hidden/Internal-DeferredShading#var19.12 +vs_engine.bin 75 vertex 3b88d6408daa4c5c /Data/Resources/unity_builtin_extra#Hidden/Internal-DeferredShading#var19.13 +ps_engine.bin 75 pixel 4f04284668cda745 /Data/Resources/unity_builtin_extra#Hidden/Internal-DeferredShading#var19.13 +ps_engine.bin 76 pixel 02bec2a78674d1ef /Data/Resources/unity_builtin_extra#Hidden/Internal-DeferredShading#var19.14 +vs_engine.bin 76 vertex 63f7419f7d499a2d /Data/Resources/unity_builtin_extra#Hidden/Internal-DeferredShading#var19.14 +ps_engine.bin 77 pixel 547ee4eefb71ad11 /Data/Resources/unity_builtin_extra#Hidden/Internal-DeferredShading#var19.15 +vs_engine.bin 77 vertex c629dc1d5960c09e /Data/Resources/unity_builtin_extra#Hidden/Internal-DeferredShading#var19.15 +vs_engine.bin 78 vertex bbcf09def079f900 /Data/Resources/unity_builtin_extra#Hidden/Internal-DeferredShading#var19.16 +ps_engine.bin 78 pixel e9ad4a49b7553103 /Data/Resources/unity_builtin_extra#Hidden/Internal-DeferredShading#var19.16 +vs_engine.bin 79 vertex 4c00795c04d586b8 /Data/Resources/unity_builtin_extra#Hidden/Internal-DeferredShading#var19.17 +ps_engine.bin 79 pixel 4c627b41d9d0fa15 /Data/Resources/unity_builtin_extra#Hidden/Internal-DeferredShading#var19.17 +ps_engine.bin 80 pixel 7ec1742913d9eafb /Data/Resources/unity_builtin_extra#Hidden/Internal-DeferredShading#var19.18 +vs_engine.bin 80 vertex beb10cfa9b095a45 /Data/Resources/unity_builtin_extra#Hidden/Internal-DeferredShading#var19.18 +vs_engine.bin 81 vertex 103806f0287d8e82 /Data/Resources/unity_builtin_extra#Hidden/Internal-DeferredShading#var19.19 +ps_engine.bin 81 pixel 146888d011c11397 /Data/Resources/unity_builtin_extra#Hidden/Internal-DeferredShading#var19.19 +ps_engine.bin 82 pixel bcc9a0ea73904bf2 /Data/Resources/unity_builtin_extra#Hidden/Internal-DeferredShading#var19.2 +vs_engine.bin 82 vertex df55cfb6cfecb5c2 /Data/Resources/unity_builtin_extra#Hidden/Internal-DeferredShading#var19.2 +vs_engine.bin 83 vertex 0c8f1ab91d1f17fc /Data/Resources/unity_builtin_extra#Hidden/Internal-DeferredShading#var19.20 +ps_engine.bin 83 pixel 263d647497125956 /Data/Resources/unity_builtin_extra#Hidden/Internal-DeferredShading#var19.20 +vs_engine.bin 84 vertex 01fd2a158880c46c /Data/Resources/unity_builtin_extra#Hidden/Internal-DeferredShading#var19.21 +ps_engine.bin 84 pixel 1c242554b4b193b2 /Data/Resources/unity_builtin_extra#Hidden/Internal-DeferredShading#var19.21 +vs_engine.bin 85 vertex 36449adfc03e9e5b /Data/Resources/unity_builtin_extra#Hidden/Internal-DeferredShading#var19.22 +ps_engine.bin 85 pixel e61c9c7aa47fa032 /Data/Resources/unity_builtin_extra#Hidden/Internal-DeferredShading#var19.22 +ps_engine.bin 86 pixel d3304425b480594f /Data/Resources/unity_builtin_extra#Hidden/Internal-DeferredShading#var19.23 +vs_engine.bin 86 vertex d619b83106aefb18 /Data/Resources/unity_builtin_extra#Hidden/Internal-DeferredShading#var19.23 +ps_engine.bin 87 pixel 58319adbd982e2d8 /Data/Resources/unity_builtin_extra#Hidden/Internal-DeferredShading#var19.24 +vs_engine.bin 87 vertex 6725ccddb7de8597 /Data/Resources/unity_builtin_extra#Hidden/Internal-DeferredShading#var19.24 +ps_engine.bin 88 pixel 4c87f534b74003b7 /Data/Resources/unity_builtin_extra#Hidden/Internal-DeferredShading#var19.25 +vs_engine.bin 88 vertex ef19d135ba41f429 /Data/Resources/unity_builtin_extra#Hidden/Internal-DeferredShading#var19.25 +vs_engine.bin 89 vertex 08dc3102cfd5e8a6 /Data/Resources/unity_builtin_extra#Hidden/Internal-DeferredShading#var19.26 +ps_engine.bin 89 pixel 5b249956f2b5bc31 /Data/Resources/unity_builtin_extra#Hidden/Internal-DeferredShading#var19.26 +vs_engine.bin 90 vertex 3828da8b076a5964 /Data/Resources/unity_builtin_extra#Hidden/Internal-DeferredShading#var19.3 +ps_engine.bin 90 pixel ded118752fec7cc6 /Data/Resources/unity_builtin_extra#Hidden/Internal-DeferredShading#var19.3 +ps_engine.bin 91 pixel 0e3bb972b87289ac /Data/Resources/unity_builtin_extra#Hidden/Internal-DeferredShading#var19.4 +vs_engine.bin 91 vertex e6aa2533dace377b /Data/Resources/unity_builtin_extra#Hidden/Internal-DeferredShading#var19.4 +ps_engine.bin 92 pixel e4b076b7820d6765 /Data/Resources/unity_builtin_extra#Hidden/Internal-DeferredShading#var19.5 +vs_engine.bin 92 vertex fc0a3ccd26413bfb /Data/Resources/unity_builtin_extra#Hidden/Internal-DeferredShading#var19.5 +ps_engine.bin 93 pixel 672dff69fcab818a /Data/Resources/unity_builtin_extra#Hidden/Internal-DeferredShading#var19.6 +vs_engine.bin 93 vertex e8212e8594b661eb /Data/Resources/unity_builtin_extra#Hidden/Internal-DeferredShading#var19.6 +vs_engine.bin 94 vertex 23591ece28f910db /Data/Resources/unity_builtin_extra#Hidden/Internal-DeferredShading#var19.7 +ps_engine.bin 94 pixel 5bf448b017c1e13e /Data/Resources/unity_builtin_extra#Hidden/Internal-DeferredShading#var19.7 +ps_engine.bin 95 pixel 0922f9587e4d3469 /Data/Resources/unity_builtin_extra#Hidden/Internal-DeferredShading#var19.8 +vs_engine.bin 95 vertex d50534e953b635ab /Data/Resources/unity_builtin_extra#Hidden/Internal-DeferredShading#var19.8 +ps_engine.bin 96 pixel 818975b7b29beac3 /Data/Resources/unity_builtin_extra#Hidden/Internal-DeferredShading#var19.9 +vs_engine.bin 96 vertex a0f6da96e19cc89d /Data/Resources/unity_builtin_extra#Hidden/Internal-DeferredShading#var19.9 +vs_engine.bin 97 vertex 850dd3b7557336ac /Data/Resources/unity_builtin_extra#Hidden/Internal-DepthNormalsTexture#var19.0 +ps_engine.bin 97 pixel fb6bb8a90b21b95a /Data/Resources/unity_builtin_extra#Hidden/Internal-DepthNormalsTexture#var19.0 +vs_engine.bin 98 vertex 254a103276ca365a /Data/Resources/unity_builtin_extra#Hidden/Internal-DepthNormalsTexture#var19.1 +ps_engine.bin 98 pixel 52b405a534888e0b /Data/Resources/unity_builtin_extra#Hidden/Internal-DepthNormalsTexture#var19.1 +ps_engine.bin 99 pixel c7240d9bec8a19ba /Data/Resources/unity_builtin_extra#Hidden/Internal-DepthNormalsTexture#var19.2 +vs_engine.bin 99 vertex f2b69d8b0a04d919 /Data/Resources/unity_builtin_extra#Hidden/Internal-DepthNormalsTexture#var19.2 +ps_engine.bin 100 pixel 63b9b40e6a0bd085 /Data/Resources/unity_builtin_extra#Hidden/Internal-DepthNormalsTexture#var19.3 +vs_engine.bin 100 vertex 82016d9869592493 /Data/Resources/unity_builtin_extra#Hidden/Internal-DepthNormalsTexture#var19.3 +ps_engine.bin 101 pixel 35f74bd2d1498efa /Data/Resources/unity_builtin_extra#Hidden/Internal-DepthNormalsTexture#var19.4 +vs_engine.bin 101 vertex 7ea13e9a0d6ae55a /Data/Resources/unity_builtin_extra#Hidden/Internal-DepthNormalsTexture#var19.4 +vs_engine.bin 102 vertex 0b5b6d79e979b005 /Data/Resources/unity_builtin_extra#Hidden/Internal-DepthNormalsTexture#var19.5 +ps_engine.bin 102 pixel a57c4c2cd426e0a2 /Data/Resources/unity_builtin_extra#Hidden/Internal-DepthNormalsTexture#var19.5 +ps_engine.bin 103 pixel 38573b29e4bf9640 /Data/Resources/unity_builtin_extra#Hidden/Internal-DepthNormalsTexture#var19.6 +vs_engine.bin 103 vertex b4c6cb40157e7e7a /Data/Resources/unity_builtin_extra#Hidden/Internal-DepthNormalsTexture#var19.6 +ps_engine.bin 104 pixel 0cf5cdef4d27166a /Data/Resources/unity_builtin_extra#Hidden/Internal-DepthNormalsTexture#var19.7 +vs_engine.bin 104 vertex 5a36a7f010d54404 /Data/Resources/unity_builtin_extra#Hidden/Internal-DepthNormalsTexture#var19.7 +vs_engine.bin 105 vertex 1981166796292a76 /Data/Resources/unity_builtin_extra#Hidden/Internal-DepthNormalsTexture#var19.8 +ps_engine.bin 105 pixel c097cd5d5d2eb88b /Data/Resources/unity_builtin_extra#Hidden/Internal-DepthNormalsTexture#var19.8 +ps_engine.bin 106 pixel b1579037482f84d2 /Data/Resources/unity_builtin_extra#Hidden/Internal-DepthNormalsTexture#var19.9 +vs_engine.bin 106 vertex c203d14fd51cca25 /Data/Resources/unity_builtin_extra#Hidden/Internal-DepthNormalsTexture#var19.9 +ps_engine.bin 107 pixel 4a137d29c05fb59c /Data/Resources/unity_builtin_extra#Hidden/Internal-Flare#var19.0 +vs_engine.bin 107 vertex a5853f3aae29c22e /Data/Resources/unity_builtin_extra#Hidden/Internal-Flare#var19.0 +vs_engine.bin 108 vertex 94504b7583cc4cb8 /Data/Resources/unity_builtin_extra#Hidden/Internal-GUIRoundedRect#var19.0 +ps_engine.bin 108 pixel e4e8b048727661ff /Data/Resources/unity_builtin_extra#Hidden/Internal-GUIRoundedRect#var19.0 +ps_engine.bin 109 pixel 12099bbd3bb84f3e /Data/Resources/unity_builtin_extra#Hidden/Internal-GUIRoundedRect#var19.1 +vs_engine.bin 109 vertex 8a0c9551358dc234 /Data/Resources/unity_builtin_extra#Hidden/Internal-GUIRoundedRect#var19.1 +vs_engine.bin 110 vertex cfb16341fc83d918 /Data/Resources/unity_builtin_extra#Hidden/Internal-GUIRoundedRectWithColorPerBorder#var19.0 +ps_engine.bin 110 pixel fb1663ff9214483c /Data/Resources/unity_builtin_extra#Hidden/Internal-GUIRoundedRectWithColorPerBorder#var19.0 +vs_engine.bin 111 vertex 2c70157eea350c83 /Data/Resources/unity_builtin_extra#Hidden/Internal-GUIRoundedRectWithColorPerBorder#var19.1 +ps_engine.bin 111 pixel 445f4f1a8ab72c87 /Data/Resources/unity_builtin_extra#Hidden/Internal-GUIRoundedRectWithColorPerBorder#var19.1 +ps_engine.bin 112 pixel 061c2997bc075e9a /Data/Resources/unity_builtin_extra#Hidden/Internal-GUITexture#var19.0 +vs_engine.bin 112 vertex 71f40fc6564d17f0 /Data/Resources/unity_builtin_extra#Hidden/Internal-GUITexture#var19.0 +ps_engine.bin 113 pixel 1cdd0fdd2117bfd1 /Data/Resources/unity_builtin_extra#Hidden/Internal-GUITexture#var19.1 +vs_engine.bin 113 vertex be6c641cff370911 /Data/Resources/unity_builtin_extra#Hidden/Internal-GUITexture#var19.1 +vs_engine.bin 114 vertex 3666d87ffee9554c /Data/Resources/unity_builtin_extra#Hidden/Internal-GUITextureBlit#var19.0 +ps_engine.bin 114 pixel d1765451ae8474c7 /Data/Resources/unity_builtin_extra#Hidden/Internal-GUITextureBlit#var19.0 +ps_engine.bin 115 pixel a763572eb327193b /Data/Resources/unity_builtin_extra#Hidden/Internal-GUITextureBlit#var19.1 +vs_engine.bin 115 vertex d8eea154dcc04b47 /Data/Resources/unity_builtin_extra#Hidden/Internal-GUITextureBlit#var19.1 +ps_engine.bin 116 pixel 1c58396df9868b41 /Data/Resources/unity_builtin_extra#Hidden/Internal-GUITextureClip#var19.0 +vs_engine.bin 116 vertex 22f9d5ca0b87ae27 /Data/Resources/unity_builtin_extra#Hidden/Internal-GUITextureClip#var19.0 +ps_engine.bin 117 pixel 78946f118ed7e65b /Data/Resources/unity_builtin_extra#Hidden/Internal-GUITextureClip#var19.1 +vs_engine.bin 117 vertex 95607a04ae0fe777 /Data/Resources/unity_builtin_extra#Hidden/Internal-GUITextureClip#var19.1 +vs_engine.bin 118 vertex 2238281fcd903961 /Data/Resources/unity_builtin_extra#Hidden/Internal-GUITextureClipText#var19.0 +ps_engine.bin 118 pixel 696fc4ca4c3ab7a7 /Data/Resources/unity_builtin_extra#Hidden/Internal-GUITextureClipText#var19.0 +ps_engine.bin 119 pixel 1b22e911d03762da /Data/Resources/unity_builtin_extra#Hidden/Internal-GUITextureClipText#var19.1 +vs_engine.bin 119 vertex 212fe6ce984594a6 /Data/Resources/unity_builtin_extra#Hidden/Internal-GUITextureClipText#var19.1 +ps_engine.bin 120 pixel cf1c41f1b79da1aa /Data/Resources/unity_builtin_extra#Hidden/Internal-Halo#var19.0 +vs_engine.bin 120 vertex de06d6c38ac2cfc2 /Data/Resources/unity_builtin_extra#Hidden/Internal-Halo#var19.0 +ps_engine.bin 121 pixel 68ac2c5409d20d3b /Data/Resources/unity_builtin_extra#Hidden/Internal-MotionVectors#var19.0 +vs_engine.bin 121 vertex d4ea6a856021a728 /Data/Resources/unity_builtin_extra#Hidden/Internal-MotionVectors#var19.0 +ps_engine.bin 122 pixel 21f320aa3e0030e5 /Data/Resources/unity_builtin_extra#Hidden/Internal-MotionVectors#var19.1 +vs_engine.bin 122 vertex b55911c9e62633fb /Data/Resources/unity_builtin_extra#Hidden/Internal-MotionVectors#var19.1 +vs_engine.bin 123 vertex 4960a262b6e24914 /Data/Resources/unity_builtin_extra#Hidden/Internal-MotionVectors#var19.2 +ps_engine.bin 123 pixel c8ef8fef61043381 /Data/Resources/unity_builtin_extra#Hidden/Internal-MotionVectors#var19.2 +ps_engine.bin 124 pixel 9ac569567a5f4eaa /Data/Resources/unity_builtin_extra#Hidden/Internal-ODSWorldTexture#var19.0 +vs_engine.bin 124 vertex fcff4f3726d8ef37 /Data/Resources/unity_builtin_extra#Hidden/Internal-ODSWorldTexture#var19.0 +vs_engine.bin 125 vertex 007b5324a6b09547 /Data/Resources/unity_builtin_extra#Hidden/Internal-ODSWorldTexture#var19.1 +ps_engine.bin 125 pixel 7a3164fd32a19ef8 /Data/Resources/unity_builtin_extra#Hidden/Internal-ODSWorldTexture#var19.1 +vs_engine.bin 126 vertex 3718295bc534e823 /Data/Resources/unity_builtin_extra#Hidden/Internal-ODSWorldTexture#var19.2 +ps_engine.bin 126 pixel e0f569b016c22fe2 /Data/Resources/unity_builtin_extra#Hidden/Internal-ODSWorldTexture#var19.2 +ps_engine.bin 127 pixel 763dbaf40c8bf151 /Data/Resources/unity_builtin_extra#Hidden/Internal-ODSWorldTexture#var19.3 +vs_engine.bin 127 vertex edf3af767f761286 /Data/Resources/unity_builtin_extra#Hidden/Internal-ODSWorldTexture#var19.3 +vs_engine.bin 128 vertex 08f55ea70dd1a7b1 /Data/Resources/unity_builtin_extra#Hidden/Internal-ODSWorldTexture#var19.4 +ps_engine.bin 128 pixel 78834e3564288697 /Data/Resources/unity_builtin_extra#Hidden/Internal-ODSWorldTexture#var19.4 +vs_engine.bin 129 vertex 6de9932e2c5de332 /Data/Resources/unity_builtin_extra#Hidden/Internal-ODSWorldTexture#var19.5 +ps_engine.bin 129 pixel 7a9b6636a6d82836 /Data/Resources/unity_builtin_extra#Hidden/Internal-ODSWorldTexture#var19.5 +ps_engine.bin 130 pixel 2f8bac40925cf9f9 /Data/Resources/unity_builtin_extra#Hidden/Internal-ODSWorldTexture#var19.6 +vs_engine.bin 130 vertex ee79b649974876e1 /Data/Resources/unity_builtin_extra#Hidden/Internal-ODSWorldTexture#var19.6 +vs_engine.bin 131 vertex 201cb8bbacbd7fb6 /Data/Resources/unity_builtin_extra#Hidden/Internal-ODSWorldTexture#var19.7 +ps_engine.bin 131 pixel 3f764ae932dffc54 /Data/Resources/unity_builtin_extra#Hidden/Internal-ODSWorldTexture#var19.7 +ps_engine.bin 132 pixel 16aba97d8accd368 /Data/Resources/unity_builtin_extra#Hidden/Internal-ODSWorldTexture#var19.8 +vs_engine.bin 132 vertex d9b426d5ceeae08b /Data/Resources/unity_builtin_extra#Hidden/Internal-ODSWorldTexture#var19.8 +vs_engine.bin 133 vertex 49941b99bfe9089c /Data/Resources/unity_builtin_extra#Hidden/Internal-ODSWorldTexture#var19.9 +ps_engine.bin 133 pixel e6e192be4eafd0e2 /Data/Resources/unity_builtin_extra#Hidden/Internal-ODSWorldTexture#var19.9 +ps_engine.bin 134 pixel 051453afa2700cdc /Data/Resources/unity_builtin_extra#Hidden/Internal-PrePassLighting#var19.0 +vs_engine.bin 134 vertex 71be74524c418730 /Data/Resources/unity_builtin_extra#Hidden/Internal-PrePassLighting#var19.0 +vs_engine.bin 135 vertex 4bcfc6506597598a /Data/Resources/unity_builtin_extra#Hidden/Internal-PrePassLighting#var19.1 +ps_engine.bin 135 pixel 538b03ec322601ef /Data/Resources/unity_builtin_extra#Hidden/Internal-PrePassLighting#var19.1 +ps_engine.bin 136 pixel 35ece51bb0b7aa05 /Data/Resources/unity_builtin_extra#Hidden/Internal-PrePassLighting#var19.10 +vs_engine.bin 136 vertex 9b49bfb318caa317 /Data/Resources/unity_builtin_extra#Hidden/Internal-PrePassLighting#var19.10 +vs_engine.bin 137 vertex 4328bd7a54647831 /Data/Resources/unity_builtin_extra#Hidden/Internal-PrePassLighting#var19.11 +ps_engine.bin 137 pixel a77214284b543a3d /Data/Resources/unity_builtin_extra#Hidden/Internal-PrePassLighting#var19.11 +vs_engine.bin 138 vertex 6110ad0911b1d041 /Data/Resources/unity_builtin_extra#Hidden/Internal-PrePassLighting#var19.12 +ps_engine.bin 138 pixel c7c82cccf2674227 /Data/Resources/unity_builtin_extra#Hidden/Internal-PrePassLighting#var19.12 +ps_engine.bin 139 pixel 20e0baf64f67d500 /Data/Resources/unity_builtin_extra#Hidden/Internal-PrePassLighting#var19.13 +vs_engine.bin 139 vertex e552fbd474213e47 /Data/Resources/unity_builtin_extra#Hidden/Internal-PrePassLighting#var19.13 +vs_engine.bin 140 vertex 2ea3e2b04a7693b2 /Data/Resources/unity_builtin_extra#Hidden/Internal-PrePassLighting#var19.14 +ps_engine.bin 140 pixel 4e8caa87a3ecc5b4 /Data/Resources/unity_builtin_extra#Hidden/Internal-PrePassLighting#var19.14 +vs_engine.bin 141 vertex 1b641b486f4abb1f /Data/Resources/unity_builtin_extra#Hidden/Internal-PrePassLighting#var19.15 +ps_engine.bin 141 pixel 9b0f5347f1e6d392 /Data/Resources/unity_builtin_extra#Hidden/Internal-PrePassLighting#var19.15 +vs_engine.bin 142 vertex 76f72c003a44a51c /Data/Resources/unity_builtin_extra#Hidden/Internal-PrePassLighting#var19.16 +ps_engine.bin 142 pixel 9464138a02165965 /Data/Resources/unity_builtin_extra#Hidden/Internal-PrePassLighting#var19.16 +vs_engine.bin 143 vertex 33f51f36ef977fb8 /Data/Resources/unity_builtin_extra#Hidden/Internal-PrePassLighting#var19.17 +ps_engine.bin 143 pixel e14a3e13850c22b4 /Data/Resources/unity_builtin_extra#Hidden/Internal-PrePassLighting#var19.17 +vs_engine.bin 144 vertex 5e9399c6470a2353 /Data/Resources/unity_builtin_extra#Hidden/Internal-PrePassLighting#var19.18 +ps_engine.bin 144 pixel b7c1a0fd7e74af09 /Data/Resources/unity_builtin_extra#Hidden/Internal-PrePassLighting#var19.18 +vs_engine.bin 145 vertex 29e8b6c3c27263b1 /Data/Resources/unity_builtin_extra#Hidden/Internal-PrePassLighting#var19.19 +ps_engine.bin 145 pixel a05896a336fd2430 /Data/Resources/unity_builtin_extra#Hidden/Internal-PrePassLighting#var19.19 +ps_engine.bin 146 pixel a7ec99e9f2d6fe52 /Data/Resources/unity_builtin_extra#Hidden/Internal-PrePassLighting#var19.2 +vs_engine.bin 146 vertex e0e6a430bf54b117 /Data/Resources/unity_builtin_extra#Hidden/Internal-PrePassLighting#var19.2 +ps_engine.bin 147 pixel 4e8a8c1276a73092 /Data/Resources/unity_builtin_extra#Hidden/Internal-PrePassLighting#var19.20 +vs_engine.bin 147 vertex dfecd32fe505066e /Data/Resources/unity_builtin_extra#Hidden/Internal-PrePassLighting#var19.20 +vs_engine.bin 148 vertex 61e17c4d0a5a2105 /Data/Resources/unity_builtin_extra#Hidden/Internal-PrePassLighting#var19.21 +ps_engine.bin 148 pixel 8b5480013a696a13 /Data/Resources/unity_builtin_extra#Hidden/Internal-PrePassLighting#var19.21 +vs_engine.bin 149 vertex 5ea50d77ecbcbdf1 /Data/Resources/unity_builtin_extra#Hidden/Internal-PrePassLighting#var19.22 +ps_engine.bin 149 pixel c42651553e9b4977 /Data/Resources/unity_builtin_extra#Hidden/Internal-PrePassLighting#var19.22 +vs_engine.bin 150 vertex 448c5333ac729300 /Data/Resources/unity_builtin_extra#Hidden/Internal-PrePassLighting#var19.23 +ps_engine.bin 150 pixel a5bae1156cbae44f /Data/Resources/unity_builtin_extra#Hidden/Internal-PrePassLighting#var19.23 +vs_engine.bin 151 vertex 2a647aa26fc99cf8 /Data/Resources/unity_builtin_extra#Hidden/Internal-PrePassLighting#var19.24 +ps_engine.bin 151 pixel 608c6acd64d675ce /Data/Resources/unity_builtin_extra#Hidden/Internal-PrePassLighting#var19.24 +ps_engine.bin 152 pixel 65d7472ab008889d /Data/Resources/unity_builtin_extra#Hidden/Internal-PrePassLighting#var19.25 +vs_engine.bin 152 vertex 73b28c641d419aec /Data/Resources/unity_builtin_extra#Hidden/Internal-PrePassLighting#var19.25 +vs_engine.bin 153 vertex 63dab7ccf5608439 /Data/Resources/unity_builtin_extra#Hidden/Internal-PrePassLighting#var19.3 +ps_engine.bin 153 pixel 7597820a9c775fee /Data/Resources/unity_builtin_extra#Hidden/Internal-PrePassLighting#var19.3 +vs_engine.bin 154 vertex 1c1746f5c6fe9026 /Data/Resources/unity_builtin_extra#Hidden/Internal-PrePassLighting#var19.4 +ps_engine.bin 154 pixel e12f2744a4904755 /Data/Resources/unity_builtin_extra#Hidden/Internal-PrePassLighting#var19.4 +ps_engine.bin 155 pixel 2d54d683ffec1179 /Data/Resources/unity_builtin_extra#Hidden/Internal-PrePassLighting#var19.5 +vs_engine.bin 155 vertex 94fce7a21a5f086a /Data/Resources/unity_builtin_extra#Hidden/Internal-PrePassLighting#var19.5 +ps_engine.bin 156 pixel 2feb52b9b07c6bb4 /Data/Resources/unity_builtin_extra#Hidden/Internal-PrePassLighting#var19.6 +vs_engine.bin 156 vertex 576e73f8b29f1d9d /Data/Resources/unity_builtin_extra#Hidden/Internal-PrePassLighting#var19.6 +ps_engine.bin 157 pixel d0bb6465b6d2ff7c /Data/Resources/unity_builtin_extra#Hidden/Internal-PrePassLighting#var19.7 +vs_engine.bin 157 vertex f883f51011f77b2d /Data/Resources/unity_builtin_extra#Hidden/Internal-PrePassLighting#var19.7 +ps_engine.bin 158 pixel 637aa064cea3a05c /Data/Resources/unity_builtin_extra#Hidden/Internal-PrePassLighting#var19.8 +vs_engine.bin 158 vertex e301decfd89e9c01 /Data/Resources/unity_builtin_extra#Hidden/Internal-PrePassLighting#var19.8 +vs_engine.bin 159 vertex 7d09833cfad48650 /Data/Resources/unity_builtin_extra#Hidden/Internal-PrePassLighting#var19.9 +ps_engine.bin 159 pixel c8170f0120011ba6 /Data/Resources/unity_builtin_extra#Hidden/Internal-PrePassLighting#var19.9 +ps_engine.bin 160 pixel 32235f83ccde1464 /Data/Resources/unity_builtin_extra#Hidden/Internal-ScreenSpaceShadows#var19.0 +vs_engine.bin 160 vertex 76f48e2d5c70cb13 /Data/Resources/unity_builtin_extra#Hidden/Internal-ScreenSpaceShadows#var19.0 +ps_engine.bin 161 pixel 8d1b91c8b1bac900 /Data/Resources/unity_builtin_extra#Hidden/Internal-ScreenSpaceShadows#var19.1 +vs_engine.bin 161 vertex db134d4fe7001380 /Data/Resources/unity_builtin_extra#Hidden/Internal-ScreenSpaceShadows#var19.1 +vs_engine.bin 162 vertex a1b889ebd904003e /Data/Resources/unity_builtin_extra#Hidden/Internal-ScreenSpaceShadows#var19.10 +ps_engine.bin 162 pixel ae7524bcc0d357f6 /Data/Resources/unity_builtin_extra#Hidden/Internal-ScreenSpaceShadows#var19.10 +ps_engine.bin 163 pixel 1c045a3a60e93e0b /Data/Resources/unity_builtin_extra#Hidden/Internal-ScreenSpaceShadows#var19.11 +vs_engine.bin 163 vertex bd48d38db2c06e84 /Data/Resources/unity_builtin_extra#Hidden/Internal-ScreenSpaceShadows#var19.11 +vs_engine.bin 164 vertex 8cc9281727f83e2b /Data/Resources/unity_builtin_extra#Hidden/Internal-ScreenSpaceShadows#var19.12 +ps_engine.bin 164 pixel 9e39ccd9150477e1 /Data/Resources/unity_builtin_extra#Hidden/Internal-ScreenSpaceShadows#var19.12 +vs_engine.bin 165 vertex 2834d0f201c46f22 /Data/Resources/unity_builtin_extra#Hidden/Internal-ScreenSpaceShadows#var19.13 +ps_engine.bin 165 pixel c212018ea30733f6 /Data/Resources/unity_builtin_extra#Hidden/Internal-ScreenSpaceShadows#var19.13 +vs_engine.bin 166 vertex 5869f7f587c67fd5 /Data/Resources/unity_builtin_extra#Hidden/Internal-ScreenSpaceShadows#var19.14 +ps_engine.bin 166 pixel db5a4562057f1022 /Data/Resources/unity_builtin_extra#Hidden/Internal-ScreenSpaceShadows#var19.14 +vs_engine.bin 167 vertex 5685d1e2f0f730ad /Data/Resources/unity_builtin_extra#Hidden/Internal-ScreenSpaceShadows#var19.15 +ps_engine.bin 167 pixel f6c30c8ec16eac71 /Data/Resources/unity_builtin_extra#Hidden/Internal-ScreenSpaceShadows#var19.15 +ps_engine.bin 168 pixel 02d285985f4de0ab /Data/Resources/unity_builtin_extra#Hidden/Internal-ScreenSpaceShadows#var19.2 +vs_engine.bin 168 vertex 1cbc84f8bec27e8b /Data/Resources/unity_builtin_extra#Hidden/Internal-ScreenSpaceShadows#var19.2 +vs_engine.bin 169 vertex 68ca89ea7bf8e08c /Data/Resources/unity_builtin_extra#Hidden/Internal-ScreenSpaceShadows#var19.3 +ps_engine.bin 169 pixel 6974cb506cdf808a /Data/Resources/unity_builtin_extra#Hidden/Internal-ScreenSpaceShadows#var19.3 +vs_engine.bin 170 vertex 3b5c436e26d15f0d /Data/Resources/unity_builtin_extra#Hidden/Internal-ScreenSpaceShadows#var19.4 +ps_engine.bin 170 pixel 3e2e4abbe70118d9 /Data/Resources/unity_builtin_extra#Hidden/Internal-ScreenSpaceShadows#var19.4 +ps_engine.bin 171 pixel c500036faad1f981 /Data/Resources/unity_builtin_extra#Hidden/Internal-ScreenSpaceShadows#var19.5 +vs_engine.bin 171 vertex d785ab013883475b /Data/Resources/unity_builtin_extra#Hidden/Internal-ScreenSpaceShadows#var19.5 +ps_engine.bin 172 pixel 850aa723ed1418a8 /Data/Resources/unity_builtin_extra#Hidden/Internal-ScreenSpaceShadows#var19.6 +vs_engine.bin 172 vertex 9101e6d447e5d619 /Data/Resources/unity_builtin_extra#Hidden/Internal-ScreenSpaceShadows#var19.6 +ps_engine.bin 173 pixel 2f0ecae82daaa2a7 /Data/Resources/unity_builtin_extra#Hidden/Internal-ScreenSpaceShadows#var19.7 +vs_engine.bin 173 vertex fbf05c11229fdf6a /Data/Resources/unity_builtin_extra#Hidden/Internal-ScreenSpaceShadows#var19.7 +ps_engine.bin 174 pixel 512b38e0e6936c1b /Data/Resources/unity_builtin_extra#Hidden/Internal-ScreenSpaceShadows#var19.8 +vs_engine.bin 174 vertex 6c2eea4841001a97 /Data/Resources/unity_builtin_extra#Hidden/Internal-ScreenSpaceShadows#var19.8 +ps_engine.bin 175 pixel 037438dae11cad1e /Data/Resources/unity_builtin_extra#Hidden/Internal-ScreenSpaceShadows#var19.9 +vs_engine.bin 175 vertex 08ede48328583fff /Data/Resources/unity_builtin_extra#Hidden/Internal-ScreenSpaceShadows#var19.9 +vs_engine.bin 176 vertex e67d1b52492a3afc /Data/Resources/unity_builtin_extra#Hidden/Internal-StencilWrite#var19.0 +ps_engine.bin 176 pixel f031a495d4fba304 /Data/Resources/unity_builtin_extra#Hidden/Internal-StencilWrite#var19.0 +vs_engine.bin 177 vertex 80f8c47784f926dd /Data/Resources/unity_builtin_extra#Hidden/Internal-UIRAtlasBlitCopy#var19.0 +ps_engine.bin 177 pixel f62bd69cb37e6c03 /Data/Resources/unity_builtin_extra#Hidden/Internal-UIRAtlasBlitCopy#var19.0 +ps_engine.bin 178 pixel 815f1e765259d6e4 /Data/Resources/unity_builtin_extra#Hidden/Internal-UIRDefault#var19.0 +vs_engine.bin 178 vertex 911febe0a0f8b259 /Data/Resources/unity_builtin_extra#Hidden/Internal-UIRDefault#var19.0 +vs_engine.bin 179 vertex 18c7703bcfc3f257 /Data/Resources/unity_builtin_extra#Hidden/Internal-UIRDefault#var19.1 +ps_engine.bin 179 pixel f4146374a450cbd0 /Data/Resources/unity_builtin_extra#Hidden/Internal-UIRDefault#var19.1 +ps_engine.bin 180 pixel 9a1d5e59897b998f /Data/Resources/unity_builtin_extra#Hidden/Internal-UIRDefaultWorld#var19.0 +vs_engine.bin 180 vertex 9ca2ef07adeea226 /Data/Resources/unity_builtin_extra#Hidden/Internal-UIRDefaultWorld#var19.0 +ps_engine.bin 181 pixel 9d9e9e51881c75fe /Data/Resources/unity_builtin_extra#Hidden/Internal-UIRDefaultWorld#var19.1 +vs_engine.bin 181 vertex d31e250e81c84f92 /Data/Resources/unity_builtin_extra#Hidden/Internal-UIRDefaultWorld#var19.1 +vs_engine.bin 182 vertex 866bad01c08030a6 /Data/Resources/unity_builtin_extra#Hidden/TextCore/Distance Field SSD#var19.0 +ps_engine.bin 182 pixel c2a48646a78719f4 /Data/Resources/unity_builtin_extra#Hidden/TextCore/Distance Field SSD#var19.0 +gs_engine.bin 0 geometry 1d91df811900de55 /Data/Resources/unity_builtin_extra#Hidden/VR/BlitFromTex2DToTexArraySlice#var19.0 +ps_engine.bin 183 pixel 9f1dd6ec03f14ce0 /Data/Resources/unity_builtin_extra#Hidden/VR/BlitFromTex2DToTexArraySlice#var19.0 +vs_engine.bin 183 vertex cfbf314a59b3acde /Data/Resources/unity_builtin_extra#Hidden/VR/BlitFromTex2DToTexArraySlice#var19.0 +ps_engine.bin 184 pixel 3561765c9625666c /Data/Resources/unity_builtin_extra#Hidden/VR/BlitTexArraySlice#var19.0 +vs_engine.bin 184 vertex eef6a5b4e774239e /Data/Resources/unity_builtin_extra#Hidden/VR/BlitTexArraySlice#var19.0 +vs_engine.bin 185 vertex 9af2907c7a167e26 /Data/Resources/unity_builtin_extra#Hidden/VideoComposite#var19.0 +ps_engine.bin 185 pixel fa550eee15ab8dbd /Data/Resources/unity_builtin_extra#Hidden/VideoComposite#var19.0 +vs_engine.bin 186 vertex 1dc05ad5665d8a4c /Data/Resources/unity_builtin_extra#Hidden/VideoDecode#var19.0 +ps_engine.bin 186 pixel 680037d61ba7adb5 /Data/Resources/unity_builtin_extra#Hidden/VideoDecode#var19.0 +vs_engine.bin 187 vertex 469436582c1329fb /Data/Resources/unity_builtin_extra#Hidden/VideoDecode#var19.1 +ps_engine.bin 187 pixel 6e35b2be04f4fe15 /Data/Resources/unity_builtin_extra#Hidden/VideoDecode#var19.1 +ps_engine.bin 188 pixel 2fb48df626ee523c /Data/Resources/unity_builtin_extra#Hidden/VideoDecode#var19.10 +vs_engine.bin 188 vertex a6c10e9640b06a6c /Data/Resources/unity_builtin_extra#Hidden/VideoDecode#var19.10 +ps_engine.bin 189 pixel 4bced4110f1ed670 /Data/Resources/unity_builtin_extra#Hidden/VideoDecode#var19.11 +vs_engine.bin 189 vertex edda55fc6eda677f /Data/Resources/unity_builtin_extra#Hidden/VideoDecode#var19.11 +ps_engine.bin 190 pixel 93333fd887651db4 /Data/Resources/unity_builtin_extra#Hidden/VideoDecode#var19.12 +vs_engine.bin 190 vertex d66d09ce180d7fbc /Data/Resources/unity_builtin_extra#Hidden/VideoDecode#var19.12 +vs_engine.bin 191 vertex 74fbb2966adbeccc /Data/Resources/unity_builtin_extra#Hidden/VideoDecode#var19.13 +ps_engine.bin 191 pixel ee103989c0d593eb /Data/Resources/unity_builtin_extra#Hidden/VideoDecode#var19.13 +ps_engine.bin 192 pixel 3ad290b642ae241b /Data/Resources/unity_builtin_extra#Hidden/VideoDecode#var19.14 +vs_engine.bin 192 vertex ab521b9ddc509678 /Data/Resources/unity_builtin_extra#Hidden/VideoDecode#var19.14 +ps_engine.bin 193 pixel 5a824eb21c405dff /Data/Resources/unity_builtin_extra#Hidden/VideoDecode#var19.2 +vs_engine.bin 193 vertex 8aeaca2a4758a2bd /Data/Resources/unity_builtin_extra#Hidden/VideoDecode#var19.2 +vs_engine.bin 194 vertex 8aaae08479567db8 /Data/Resources/unity_builtin_extra#Hidden/VideoDecode#var19.3 +ps_engine.bin 194 pixel cfbcb6d0962f530c /Data/Resources/unity_builtin_extra#Hidden/VideoDecode#var19.3 +vs_engine.bin 195 vertex 1352e7349aa5bd6c /Data/Resources/unity_builtin_extra#Hidden/VideoDecode#var19.4 +ps_engine.bin 195 pixel 3fc78425cad3dac7 /Data/Resources/unity_builtin_extra#Hidden/VideoDecode#var19.4 +ps_engine.bin 196 pixel 662ad8e921704376 /Data/Resources/unity_builtin_extra#Hidden/VideoDecode#var19.5 +vs_engine.bin 196 vertex f25f0fbc66707175 /Data/Resources/unity_builtin_extra#Hidden/VideoDecode#var19.5 +vs_engine.bin 197 vertex 3734b4abd25c2229 /Data/Resources/unity_builtin_extra#Hidden/VideoDecode#var19.6 +ps_engine.bin 197 pixel 845566c7e555d1ef /Data/Resources/unity_builtin_extra#Hidden/VideoDecode#var19.6 +ps_engine.bin 198 pixel 1f6725206c396aa8 /Data/Resources/unity_builtin_extra#Hidden/VideoDecode#var19.7 +vs_engine.bin 198 vertex f25230c0c352503f /Data/Resources/unity_builtin_extra#Hidden/VideoDecode#var19.7 +vs_engine.bin 199 vertex a431b756a46553f0 /Data/Resources/unity_builtin_extra#Hidden/VideoDecode#var19.8 +ps_engine.bin 199 pixel c9c5a58a9bf96b89 /Data/Resources/unity_builtin_extra#Hidden/VideoDecode#var19.8 +ps_engine.bin 200 pixel 1466d3eaf8a2ec61 /Data/Resources/unity_builtin_extra#Hidden/VideoDecode#var19.9 +vs_engine.bin 200 vertex 5e1d0a1bf9c0d9bf /Data/Resources/unity_builtin_extra#Hidden/VideoDecode#var19.9 +vs_engine.bin 201 vertex 3e8c5183ded746c5 /Data/Resources/unity_builtin_extra#Legacy Shaders/Diffuse#var19.0 +ps_engine.bin 201 pixel 5472dc7f2cecbc9d /Data/Resources/unity_builtin_extra#Legacy Shaders/Diffuse#var19.0 +ps_engine.bin 202 pixel 0d28f332ae8b6794 /Data/Resources/unity_builtin_extra#Legacy Shaders/Diffuse#var19.1 +vs_engine.bin 202 vertex 53ece5df50060618 /Data/Resources/unity_builtin_extra#Legacy Shaders/Diffuse#var19.1 +ps_engine.bin 203 pixel b14e61477cda386a /Data/Resources/unity_builtin_extra#Legacy Shaders/Diffuse#var19.10 +vs_engine.bin 203 vertex fbbca370c047d9c2 /Data/Resources/unity_builtin_extra#Legacy Shaders/Diffuse#var19.10 +vs_engine.bin 204 vertex 0c58a9807559beed /Data/Resources/unity_builtin_extra#Legacy Shaders/Diffuse#var19.11 +ps_engine.bin 204 pixel 454720065ef1da4e /Data/Resources/unity_builtin_extra#Legacy Shaders/Diffuse#var19.11 +ps_engine.bin 205 pixel 064388a1ea548fdd /Data/Resources/unity_builtin_extra#Legacy Shaders/Diffuse#var19.12 +vs_engine.bin 205 vertex e645149e89fdf09b /Data/Resources/unity_builtin_extra#Legacy Shaders/Diffuse#var19.12 +vs_engine.bin 206 vertex 67933675ff36accf /Data/Resources/unity_builtin_extra#Legacy Shaders/Diffuse#var19.13 +ps_engine.bin 206 pixel f278baac9b0ba459 /Data/Resources/unity_builtin_extra#Legacy Shaders/Diffuse#var19.13 +ps_engine.bin 207 pixel 189bccb4c9e62dc2 /Data/Resources/unity_builtin_extra#Legacy Shaders/Diffuse#var19.14 +vs_engine.bin 207 vertex fcec8020419e9cff /Data/Resources/unity_builtin_extra#Legacy Shaders/Diffuse#var19.14 +ps_engine.bin 208 pixel c4329d61294e9670 /Data/Resources/unity_builtin_extra#Legacy Shaders/Diffuse#var19.15 +vs_engine.bin 208 vertex e2a55b293701e7a7 /Data/Resources/unity_builtin_extra#Legacy Shaders/Diffuse#var19.15 +vs_engine.bin 209 vertex cd375a4b47398de0 /Data/Resources/unity_builtin_extra#Legacy Shaders/Diffuse#var19.16 +ps_engine.bin 209 pixel d0ea30176b383ef3 /Data/Resources/unity_builtin_extra#Legacy Shaders/Diffuse#var19.16 +ps_engine.bin 210 pixel 3ba237ef74f5656a /Data/Resources/unity_builtin_extra#Legacy Shaders/Diffuse#var19.17 +vs_engine.bin 210 vertex 6ca9d4e07ce005ab /Data/Resources/unity_builtin_extra#Legacy Shaders/Diffuse#var19.17 +ps_engine.bin 211 pixel 2e8626643d800da2 /Data/Resources/unity_builtin_extra#Legacy Shaders/Diffuse#var19.18 +vs_engine.bin 211 vertex 9c09edbd5ec2f13f /Data/Resources/unity_builtin_extra#Legacy Shaders/Diffuse#var19.18 +vs_engine.bin 212 vertex 605081002963558b /Data/Resources/unity_builtin_extra#Legacy Shaders/Diffuse#var19.19 +ps_engine.bin 212 pixel 642b4363780b1ad3 /Data/Resources/unity_builtin_extra#Legacy Shaders/Diffuse#var19.19 +vs_engine.bin 213 vertex 1c4051f65f9e8cfb /Data/Resources/unity_builtin_extra#Legacy Shaders/Diffuse#var19.2 +ps_engine.bin 213 pixel 59d05f6d419a5cf8 /Data/Resources/unity_builtin_extra#Legacy Shaders/Diffuse#var19.2 +ps_engine.bin 214 pixel 45dbe097320bcba1 /Data/Resources/unity_builtin_extra#Legacy Shaders/Diffuse#var19.20 +vs_engine.bin 214 vertex 82feb52b3d67a05c /Data/Resources/unity_builtin_extra#Legacy Shaders/Diffuse#var19.20 +ps_engine.bin 215 pixel 05b24d65460208c3 /Data/Resources/unity_builtin_extra#Legacy Shaders/Diffuse#var19.21 +vs_engine.bin 215 vertex 11db94d170361780 /Data/Resources/unity_builtin_extra#Legacy Shaders/Diffuse#var19.21 +ps_engine.bin 216 pixel 00398cc3ae952e94 /Data/Resources/unity_builtin_extra#Legacy Shaders/Diffuse#var19.3 +vs_engine.bin 216 vertex 7e1f73c27f2c8898 /Data/Resources/unity_builtin_extra#Legacy Shaders/Diffuse#var19.3 +vs_engine.bin 217 vertex caeebcde9f565580 /Data/Resources/unity_builtin_extra#Legacy Shaders/Diffuse#var19.4 +ps_engine.bin 217 pixel e2738fdfb7e4404f /Data/Resources/unity_builtin_extra#Legacy Shaders/Diffuse#var19.4 +ps_engine.bin 218 pixel 3108af9f8e703d14 /Data/Resources/unity_builtin_extra#Legacy Shaders/Diffuse#var19.5 +vs_engine.bin 218 vertex 457e078032e176f4 /Data/Resources/unity_builtin_extra#Legacy Shaders/Diffuse#var19.5 +vs_engine.bin 219 vertex 8999be1ce52a7e0f /Data/Resources/unity_builtin_extra#Legacy Shaders/Diffuse#var19.6 +ps_engine.bin 219 pixel b1523e1715ed1ffe /Data/Resources/unity_builtin_extra#Legacy Shaders/Diffuse#var19.6 +ps_engine.bin 220 pixel 18d233c8ce2063e4 /Data/Resources/unity_builtin_extra#Legacy Shaders/Diffuse#var19.7 +vs_engine.bin 220 vertex f7115215ff18628f /Data/Resources/unity_builtin_extra#Legacy Shaders/Diffuse#var19.7 +vs_engine.bin 221 vertex 4f01106667b2dd73 /Data/Resources/unity_builtin_extra#Legacy Shaders/Diffuse#var19.8 +ps_engine.bin 221 pixel ab22b38a18960270 /Data/Resources/unity_builtin_extra#Legacy Shaders/Diffuse#var19.8 +vs_engine.bin 222 vertex 517e627e2500b040 /Data/Resources/unity_builtin_extra#Legacy Shaders/Diffuse#var19.9 +ps_engine.bin 222 pixel f9945dd7b0d801aa /Data/Resources/unity_builtin_extra#Legacy Shaders/Diffuse#var19.9 +vs_engine.bin 223 vertex 06d89d3411b54fbe /Data/Resources/unity_builtin_extra#Legacy Shaders/VertexLit#var19.0 +ps_engine.bin 223 pixel c889f184fea2c353 /Data/Resources/unity_builtin_extra#Legacy Shaders/VertexLit#var19.0 +ps_engine.bin 224 pixel 63cc8c645af7aa8d /Data/Resources/unity_builtin_extra#Legacy Shaders/VertexLit#var19.1 +vs_engine.bin 224 vertex b7270b53c6383d15 /Data/Resources/unity_builtin_extra#Legacy Shaders/VertexLit#var19.1 +vs_engine.bin 225 vertex e0329d0f5c75ee92 /Data/Resources/unity_builtin_extra#Legacy Shaders/VertexLit#var19.2 +ps_engine.bin 225 pixel fe2c1c0f2f48660d /Data/Resources/unity_builtin_extra#Legacy Shaders/VertexLit#var19.2 +vs_engine.bin 226 vertex 271314fb1fb20d8b /Data/Resources/unity_builtin_extra#Legacy Shaders/VertexLit#var19.3 +ps_engine.bin 226 pixel c76c0d6e7f9b2d5e /Data/Resources/unity_builtin_extra#Legacy Shaders/VertexLit#var19.3 +vs_engine.bin 227 vertex 6b8277ce8b82084b /Data/Resources/unity_builtin_extra#Legacy Shaders/VertexLit#var19.4 +ps_engine.bin 227 pixel c5c81888ef8e13c2 /Data/Resources/unity_builtin_extra#Legacy Shaders/VertexLit#var19.4 +vs_engine.bin 228 vertex 1e6f6dfcb83ff0b8 /Data/Resources/unity_builtin_extra#Legacy Shaders/VertexLit#var19.5 +ps_engine.bin 228 pixel 8fbf0ebd0ddcd8e7 /Data/Resources/unity_builtin_extra#Legacy Shaders/VertexLit#var19.5 +vs_engine.bin 229 vertex 0454a3d2658fd56b /Data/Resources/unity_builtin_extra#Sprites/Default#var19.0 +ps_engine.bin 229 pixel 8778dd1f96a9ca43 /Data/Resources/unity_builtin_extra#Sprites/Default#var19.0 +ps_engine.bin 230 pixel 7efa98da3dc879c3 /Data/Resources/unity_builtin_extra#Sprites/Default#var19.1 +vs_engine.bin 230 vertex d0f8e76b3c06c1ae /Data/Resources/unity_builtin_extra#Sprites/Default#var19.1 +vs_engine.bin 231 vertex 4dc791f1e1e7e723 /Data/Resources/unity_builtin_extra#Sprites/Mask#var19.0 +ps_engine.bin 231 pixel a9ffc432f9a5221b /Data/Resources/unity_builtin_extra#Sprites/Mask#var19.0 +ps_engine.bin 232 pixel 83b13152e7ee094c /Data/Resources/unity_builtin_extra#Sprites/Mask#var19.1 +vs_engine.bin 232 vertex 9683a2919e4392f8 /Data/Resources/unity_builtin_extra#Sprites/Mask#var19.1 +ps_engine.bin 233 pixel 7b2ec731b8f6b1bb /Data/Resources/unity_builtin_extra#UI/Default#var19.0 +vs_engine.bin 233 vertex 9004c489232b63c6 /Data/Resources/unity_builtin_extra#UI/Default#var19.0 +ps_engine.bin 234 pixel 16ad2805653f294e /Data/Resources/unity_builtin_extra#UI/Default#var19.1 +vs_engine.bin 234 vertex 79ad22033eeca459 /Data/Resources/unity_builtin_extra#UI/Default#var19.1 +ps_engine.bin 235 pixel 12831359e24a7f36 /Data/Resources/unity_builtin_extra#UI/Default#var19.2 +vs_engine.bin 235 vertex 42befc9e1176ae86 /Data/Resources/unity_builtin_extra#UI/Default#var19.2 +ps_engine.bin 236 pixel 0651176a5536a3cb /Data/Resources/unity_builtin_extra#UI/Default#var19.3 +vs_engine.bin 236 vertex 86d2af23efeb93c3 /Data/Resources/unity_builtin_extra#UI/Default#var19.3 +vs_main.bin 0 vertex 24e4cd391d993137 main#GLSLC@0x225ac10 +vs_main.bin 1 vertex d19b47f9ea5c3cfe main#GLSLC@0x225b7d0 +ps_main.bin 0 pixel 17b082dfef30eba9 main#GLSLC@0x225c490 +ps_main.bin 1 pixel 889465df59838dc0 main#GLSLC@0x225d150 +ps_main.bin 2 pixel e46f75eec323df1d main#GLSLC@0x225df10 +ps_main.bin 3 pixel a23dda46c07f800d main#GLSLC@0x225edd0 +ps_main.bin 4 pixel bf76784f461275c7 main#GLSLC@0x225fa90 +ps_main.bin 5 pixel abcdb66b44f1313d main#GLSLC@0x2260850 +vs_main.bin 2 vertex f3a2af4f812f7366 main#GLSLC@0x2261710 +ps_main.bin 6 pixel 987c069874bbe974 main#GLSLC@0x22622d0 +cs_main.bin 0 compute 552bbc8ffc2459e4 main#GLSLC@0x2262e90 diff --git a/dm/games/0100E44016C22000/shader_map.tsv.conflicts.tsv b/dm/games/0100E44016C22000/shader_map.tsv.conflicts.tsv new file mode 100644 index 0000000..35c1b4d --- /dev/null +++ b/dm/games/0100E44016C22000/shader_map.tsv.conflicts.tsv @@ -0,0 +1,2 @@ +# kind: evidence control-section key conflict rulings: empty +dm_ctl_sha16 chosen_pc class candidates records diff --git a/dm/games/0100E44016C22000/shader_pairs.tsv b/dm/games/0100E44016C22000/shader_pairs.tsv new file mode 100644 index 0000000..d69ffb2 --- /dev/null +++ b/dm/games/0100E44016C22000/shader_pairs.tsv @@ -0,0 +1,244 @@ +# kind: evidence vertex / pixel shader pairs within BNSH variations (generated by dm/gfx/tools/shader_split.py, do not edit): vertex key pixel key +007b5324a6b09547 7a3164fd32a19ef8 +01fd2a158880c46c 1c242554b4b193b2 +035894b5106cf3ed d0772924cca9026d +0454a3d2658fd56b 8778dd1f96a9ca43 +06d89d3411b54fbe c889f184fea2c353 +08dc3102cfd5e8a6 5b249956f2b5bc31 +08ede48328583fff 037438dae11cad1e +08f55ea70dd1a7b1 78834e3564288697 +0b5b6d79e979b005 a57c4c2cd426e0a2 +0c58a9807559beed 454720065ef1da4e +0c8f1ab91d1f17fc 263d647497125956 +103806f0287d8e82 146888d011c11397 +11db94d170361780 05b24d65460208c3 +12216c2c1ad65862 6d6190449188c57a +1352e7349aa5bd6c 3fc78425cad3dac7 +18c7703bcfc3f257 f4146374a450cbd0 +1981166796292a76 c097cd5d5d2eb88b +1abc381c7d51a1d0 a70ba8561bbaecba +1b641b486f4abb1f 9b0f5347f1e6d392 +1c0d7fa6f7368bd3 ef6b59c44062ab3e +1c1746f5c6fe9026 e12f2744a4904755 +1c4051f65f9e8cfb 59d05f6d419a5cf8 +1cbc84f8bec27e8b 02d285985f4de0ab +1d627f037640066a 30e2faa2d1af10d0 +1dc05ad5665d8a4c 680037d61ba7adb5 +1dd63d696de56011 f2abd15b2dc5f12b +1e6f6dfcb83ff0b8 8fbf0ebd0ddcd8e7 +1f1f6ce60520176e afca8dff9b333c1b +1f49444eb070222b 8a4df70a216d00ec +1fc399a55a876215 8dfd7917a41f7d1f +201cb8bbacbd7fb6 3f764ae932dffc54 +20b025826301b00f aa8857b603a43017 +212fe6ce984594a6 1b22e911d03762da +2238281fcd903961 696fc4ca4c3ab7a7 +22f9d5ca0b87ae27 1c58396df9868b41 +23591ece28f910db 5bf448b017c1e13e +24e4cd391d993137 00398cc3ae952e94 +24e4cd391d993137 815f1e765259d6e4 +253365b47bc23cef 8f3c7e83d2839765 +254a103276ca365a 52b405a534888e0b +271314fb1fb20d8b c76c0d6e7f9b2d5e +2834d0f201c46f22 c212018ea30733f6 +29e8b6c3c27263b1 a05896a336fd2430 +2a647aa26fc99cf8 608c6acd64d675ce +2c70157eea350c83 445f4f1a8ab72c87 +2d1b3f3d711cef38 6c399c8609f698ca +2e14bb2e1fc9bb47 48c5a6bb1466a515 +2ea3e2b04a7693b2 4e8caa87a3ecc5b4 +30c26fb6e1165cfd 78dd986b37afdef7 +31dd28ab16c9b094 4c65efd79b288ea3 +33f51f36ef977fb8 e14a3e13850c22b4 +36449adfc03e9e5b e61c9c7aa47fa032 +3666d87ffee9554c d1765451ae8474c7 +3718295bc534e823 e0f569b016c22fe2 +3734b4abd25c2229 845566c7e555d1ef +3828da8b076a5964 ded118752fec7cc6 +3b5c436e26d15f0d 3e2e4abbe70118d9 +3b88d6408daa4c5c 4f04284668cda745 +3b8d8c63a04b13ff 6bb2c32ff0e3a7f0 +3b9259f246fd8177 a5471f8318af9793 +3e8c5183ded746c5 5472dc7f2cecbc9d +3ef2cd371bd1d7d4 fa93581b00c1576b +42befc9e1176ae86 12831359e24a7f36 +430d0acce4542399 b9ff87f4f609b849 +4326dbe869ffbb43 690110f53535d3f4 +4328bd7a54647831 a77214284b543a3d +448c5333ac729300 a5bae1156cbae44f +44b82f659a8279b2 66d073a2b47ec252 +457e078032e176f4 3108af9f8e703d14 +4608c5baaeff20b8 9c5f8353fe610f5c +469436582c1329fb 6e35b2be04f4fe15 +4960a262b6e24914 c8ef8fef61043381 +49941b99bfe9089c e6e192be4eafd0e2 +4bcfc6506597598a 538b03ec322601ef +4c00795c04d586b8 4c627b41d9d0fa15 +4dc791f1e1e7e723 a9ffc432f9a5221b +4f01106667b2dd73 ab22b38a18960270 +517e627e2500b040 f9945dd7b0d801aa +53ece5df50060618 0d28f332ae8b6794 +54f6e6159418ddb6 0c00c5964de0cf09 +5685d1e2f0f730ad f6c30c8ec16eac71 +576e73f8b29f1d9d 2feb52b9b07c6bb4 +5869f7f587c67fd5 db5a4562057f1022 +5a100b1157cfe052 f4a9b126a1f28a46 +5a36a7f010d54404 0cf5cdef4d27166a +5d9007df01d0dae1 f5b8272553b981fe +5e1d0a1bf9c0d9bf 1466d3eaf8a2ec61 +5e9399c6470a2353 b7c1a0fd7e74af09 +5ea50d77ecbcbdf1 c42651553e9b4977 +605081002963558b 642b4363780b1ad3 +60fbe25cb56a7712 065c182e971f45c1 +6110ad0911b1d041 c7c82cccf2674227 +61e17c4d0a5a2105 8b5480013a696a13 +63dab7ccf5608439 7597820a9c775fee +63f7419f7d499a2d 02bec2a78674d1ef +64aca428385e81d8 e204b19fd86a2723 +64b1773d20d6bfce 9ead2d48448a22e8 +6556c131671b2ab4 8be338953a88640d +6725ccddb7de8597 58319adbd982e2d8 +67933675ff36accf f278baac9b0ba459 +68ca89ea7bf8e08c 6974cb506cdf808a +6b8277ce8b82084b c5c81888ef8e13c2 +6c12767b9f91c778 635e833c64a9409b +6c2eea4841001a97 512b38e0e6936c1b +6ca9d4e07ce005ab 3ba237ef74f5656a +6de9932e2c5de332 7a9b6636a6d82836 +71be74524c418730 051453afa2700cdc +71f40fc6564d17f0 061c2997bc075e9a +720133bda2941918 5d1c5b2a2e82cfaa +73b28c641d419aec 65d7472ab008889d +7462b18d6d3f6acd 41ce8f2e6d7c669b +74fbb2966adbeccc ee103989c0d593eb +76452803be815e62 1eb83f9aed5ad26e +76f48e2d5c70cb13 32235f83ccde1464 +76f72c003a44a51c 9464138a02165965 +77682234d04061e8 65860f69bedbf434 +79ad22033eeca459 16ad2805653f294e +79bed8fd7dddc190 a2a9a3b597ff3160 +7cbad1dbebcdefed f66cab3d319d7101 +7d09833cfad48650 c8170f0120011ba6 +7e1f73c27f2c8898 00398cc3ae952e94 +7e8817c64eb7ba4e 19d4f6967f979e57 +7ea13e9a0d6ae55a 35f74bd2d1498efa +7f99e57c7b37af0a 5c60f4e7f30bf6e5 +7fec7ba415989235 8f2c1c74aaabf3a4 +80f8c47784f926dd f62bd69cb37e6c03 +82016d9869592493 63b9b40e6a0bd085 +820f62d3eb811d75 ae3a745d48792d32 +82feb52b3d67a05c 45dbe097320bcba1 +850dd3b7557336ac fb6bb8a90b21b95a +866bad01c08030a6 c2a48646a78719f4 +86d2af23efeb93c3 0651176a5536a3cb +8999be1ce52a7e0f b1523e1715ed1ffe +8a0c9551358dc234 12099bbd3bb84f3e +8a4d4e241b7aa60a 82e022715fb3be05 +8aaae08479567db8 cfbcb6d0962f530c +8aeaca2a4758a2bd 5a824eb21c405dff +8c08ab9ffe0754cf 3c3f040cc5c04cf8 +8cc9281727f83e2b 9e39ccd9150477e1 +8e7cc7a6c62ca116 eb0ebddbb916b461 +8fb8f8045fb30559 028401d54d1da1c6 +9004c489232b63c6 7b2ec731b8f6b1bb +9101e6d447e5d619 850aa723ed1418a8 +911febe0a0f8b259 815f1e765259d6e4 +94504b7583cc4cb8 e4e8b048727661ff +94fce7a21a5f086a 2d54d683ffec1179 +95607a04ae0fe777 78946f118ed7e65b +9683a2919e4392f8 83b13152e7ee094c +99c0b83f5566025e 1a28811241f23fa0 +9af2907c7a167e26 fa550eee15ab8dbd +9b49bfb318caa317 35ece51bb0b7aa05 +9baec0226376d6ac 446854668ff259c4 +9c09edbd5ec2f13f 2e8626643d800da2 +9ca2ef07adeea226 9a1d5e59897b998f +9da548fbdfa199d0 83c296d84fda5b2d +9ff8b3cc29b36e9a f325fdb7a00213bb +a0f6da96e19cc89d 818975b7b29beac3 +a1b889ebd904003e ae7524bcc0d357f6 +a431b756a46553f0 c9c5a58a9bf96b89 +a5853f3aae29c22e 4a137d29c05fb59c +a6c10e9640b06a6c 2fb48df626ee523c +a79608f6984963a9 1a557c30ff661c82 +a9a2aac70fce0505 1c2ff09f94b2e097 +a9d75708385e65ac 85a793c989fecf10 +a9ed6a198208176d 5719c76aea0dea70 +ab521b9ddc509678 3ad290b642ae241b +aba45e6c24c1719e c0250cdbc59e1533 +ad72b6483d438634 4e7a069f2ffbcb3a +b4c6cb40157e7e7a 38573b29e4bf9640 +b55911c9e62633fb 21f320aa3e0030e5 +b7270b53c6383d15 63cc8c645af7aa8d +b9340926ee8317b6 0372bcc4d3d0a328 +bbcf09def079f900 e9ad4a49b7553103 +bd48d38db2c06e84 1c045a3a60e93e0b +be6c641cff370911 1cdd0fdd2117bfd1 +beb10cfa9b095a45 7ec1742913d9eafb +c203d14fd51cca25 b1579037482f84d2 +c629dc1d5960c09e 547ee4eefb71ad11 +c62d1fc4921c1377 e5a69346ec2d7365 +c9a3f8cf0733b97c 7a734b9a5971a10c +caeebcde9f565580 e2738fdfb7e4404f +cd375a4b47398de0 d0ea30176b383ef3 +cf37aedcf237eda7 14d8af7c1892ef9e +cfb16341fc83d918 fb1663ff9214483c +cfbf314a59b3acde 9f1dd6ec03f14ce0 +d0d34347bb40a903 422dbe3ebb55095a +d0f8e76b3c06c1ae 7efa98da3dc879c3 +d19b47f9ea5c3cfe 00398cc3ae952e94 +d19b47f9ea5c3cfe 815f1e765259d6e4 +d292d10e75f043c4 9d35249d16ea8cfe +d31e250e81c84f92 9d9e9e51881c75fe +d4ea6a856021a728 68ac2c5409d20d3b +d4f7794f6af8599a fdfdd27bd84b793e +d50534e953b635ab 0922f9587e4d3469 +d619b83106aefb18 d3304425b480594f +d66d09ce180d7fbc 93333fd887651db4 +d785ab013883475b c500036faad1f981 +d8eea154dcc04b47 a763572eb327193b +d9b426d5ceeae08b 16aba97d8accd368 +db134d4fe7001380 8d1b91c8b1bac900 +de06d6c38ac2cfc2 cf1c41f1b79da1aa +df55cfb6cfecb5c2 bcc9a0ea73904bf2 +dfecd32fe505066e 4e8a8c1276a73092 +e0329d0f5c75ee92 fe2c1c0f2f48660d +e0e6a430bf54b117 a7ec99e9f2d6fe52 +e21bd2828f9ca0b5 d5c2d89800ba6b4d +e2a55b293701e7a7 c4329d61294e9670 +e301decfd89e9c01 637aa064cea3a05c +e552fbd474213e47 20e0baf64f67d500 +e645149e89fdf09b 064388a1ea548fdd +e67d1b52492a3afc f031a495d4fba304 +e6aa2533dace377b 0e3bb972b87289ac +e8212e8594b661eb 672dff69fcab818a +e86f63dd7aa96777 7e48c46d34ff85e8 +e8fa6efcc545d3b3 b71d5b7d9f3424f2 +e942dc8fc945f383 3d216981f8303530 +ed7b750d32cc7171 2762b390c0cca2f2 +edda55fc6eda677f 4bced4110f1ed670 +edf3af767f761286 763dbaf40c8bf151 +ee79b649974876e1 2f8bac40925cf9f9 +eec3d1acf0835ab9 c43192ba698e2bba +eed6de9d98b6b7fb 65adf94335678c81 +eef6a5b4e774239e 3561765c9625666c +ef19d135ba41f429 4c87f534b74003b7 +ef760d9ec12296c2 2fda15a6b7969a86 +f0589e1589a7d436 79f1cf52cd27b63c +f25230c0c352503f 1f6725206c396aa8 +f25f0fbc66707175 662ad8e921704376 +f2b69d8b0a04d919 c7240d9bec8a19ba +f3a2af4f812f7366 00398cc3ae952e94 +f3a2af4f812f7366 815f1e765259d6e4 +f48b979b468e9d54 07bd34ff49c50199 +f4f77b6434a02ada 84f8a78c71f49680 +f5b2a2496f585b69 37e89d30727a528e +f7115215ff18628f 18d233c8ce2063e4 +f883f51011f77b2d d0bb6465b6d2ff7c +fa34be1f0e5acf60 ad7d9e76bcbf821a +fbbca370c047d9c2 b14e61477cda386a +fbf05c11229fdf6a 2f0ecae82daaa2a7 +fc0a3ccd26413bfb e4b076b7820d6765 +fcec8020419e9cff 189bccb4c9e62dc2 +fcff4f3726d8ef37 9ac569567a5f4eaa +fd383172b39b0301 0c2e31bd3a74d664 diff --git a/dm/games/README.md b/dm/games/README.md index 648bdd4..6fbc40e 100644 --- a/dm/games/README.md +++ b/dm/games/README.md @@ -49,7 +49,7 @@ None of them has a default game: without one they stop and list the profiles. To | `fps_hold` | `on` (the default): with `fps_target`, three late frames in a row raise the hold above the cap's vsyncs (30 or 20 fps), and steady frames that fit try the lower hold again. `off`: frames are never held longer than the cap's vsyncs; each is shown as soon as it is ready. For a game whose updates do not wait for the presents and step by the cap whatever the hold (Age of Calamity): there the hold only paces the screen. `DM_FPS_HOLD=on` / `off` overrides it, also from `Documents/env.txt` | | `core_preempt` | `on` / `off` (the default): approximate Horizon's per-core preemption. When an SVC wakes a higher-priority thread pinned to the caller's core, the caller waits (at most 5 ms) until such threads block again (`hle_thread.c`). Metroid Dread's movie player relies on it; Mario's loading gets slower with it (first frame 0.6 → 2.9 s), so it is off unless a game needs it. `DM_PREEMPT=0` / `1` overrides | | `alloc_big_align` | `on` / `off` (the default): `nn::mem::StandardAllocator::Allocate` aligns blocks of 64 KB or more to 64 KB (`hle_os.c`). Vanillaware's engine (13 Sentinels: Aegis Rim, Unicorn Overlord) takes a memory pool's storage from malloc and cuts ring heaps out of it at 64 KB alignment relative to the pool's GPU address. On the Switch that address is big-page aligned; the host's is the CPU address, only 4 KB aligned, so the last ring heap does not fit and keeps base 0, and the game writes through a null pointer (13 Sentinels entering its first battle, Unicorn Overlord past the title screen) | -| `shared_font` | Optional, decided by the SDK version without it (the host reads it from the `sdk` module, `loader.c` `dm_sdk_major`): what the shared-font address points at. `bfttf` (SDK 11 and later) = the 8-byte BFTTF header (with the "already decoded" marker) followed by the TTF, which Mario passes to `ScalableFontEngineHelper::Decode`; `ttf` = the TTF itself, which SDK 10 and older games hand straight to `ScalableFontEngine::LoadFont` (Super Mario 3D World + Bowser's Fury: with the header the engine fails with error 403 and the game crashes looking up a glyph; Odyssey, Link's Awakening, Age of Calamity and Three Houses alike). No profile sets it | +| `shared_font` | Optional, decided by the game files without it (the SDK version the host reads from the `sdk` module, `loader.c` `dm_sdk_major`, and `main`'s imports, `dm_main_imports`): what the shared-font address points at. `bfttf` (SDK 11 and later, when `main` imports `ScalableFontEngineHelper::Decode`) = the 8-byte BFTTF header (with the "already decoded" marker) followed by the TTF, which Mario passes to `Decode`; `ttf` = the TTF itself, which SDK 10 and older games hand straight to `ScalableFontEngine::LoadFont` (Super Mario 3D World + Bowser's Fury: with the header the engine fails with error 403 and the game crashes looking up a glyph; Odyssey, Link's Awakening, Age of Calamity and Three Houses alike) and Unity's player to FreeType (Patrick's Parabox: with the header its Japanese, Korean and Chinese text drew nothing). No profile sets it | | `device_api` | Optional, decided by the SDK version without it: the NVN API version `major.minor` that `nvnDeviceGetInteger` reports, 55.15 for SDK 11 and later (what Mario requires) and 53.313 for SDK 10 and older (`hle_nvn.c` `nvn_api`). Games check it and skip creating their device on a mismatch: Super Mario 3D World + Bowser's Fury (SDK 10) requires major 53 and minor ≥ 313. No profile sets it. `DM_NVN_API` overrides. Not part of the shader chain version (only `shader_*` keys are) | | `op_mode` | The operation mode the game sees at start: `console` (the default, docked) or `handheld`. Super Mario Galaxy and Captain Toad: Treasure Tracker use `handheld`: docked, their pointer is the Joy-Con gyro, which the host does not have; handheld, it is the touch screen, which the iPhone front end feeds with the touches no gamepad control takes (in the 3D layout, outside the right third of the screen, which is the right stick; `DmGamepad.m`). Handheld also renders at 720p. `DM_OPMODE=0` / `1` overrides, also from `Documents/env.txt` | | `perf_mode` | `follow` (the default): the performance mode follows the operation mode (Boost docked, Normal handheld); `boost`: Boost whatever the operation mode (`hle_oe.c`), a combination a Switch 1 never reports, so a profile choice. Rhythm Heaven Groove plays handheld with Boost: docked means a TV to the game, which then asks for a latency calibration, and only Boost gives its 1920x1080 draw size (handheld Normal draws 1280x720) | diff --git a/dm/gfx/tools/unityfs.py b/dm/gfx/tools/unityfs.py index 921f63b..ccdcfe3 100644 --- a/dm/gfx/tools/unityfs.py +++ b/dm/gfx/tools/unityfs.py @@ -109,11 +109,12 @@ def _read(r, n): class NoTree(ValueError): """the serialized file has no type tree and no tree of the same class and hash to borrow""" -# Type trees written out for players whose serialized files carry none and that ship no bundle to borrow one from (Brain Memory Training Academy, Unity 2022.3.5f1: only Data/*.assets). +# Type trees written out for players whose serialized files carry none and that ship no bundle to borrow one from (Brain Memory Training Academy, Unity 2022.3.5f1: only Data/*.assets; +# Patrick's Parabox, Unity 2020.3.30f1: only the built-in shaders in Data/Resources). # {(class ID, type hash): (root type, layout)}. The layout is one struct per line, "Name: type field; type field; …", in serialization order. A type is a primitive, a struct of the layout, # string, vector, map; a trailing ~ = the container's Array is not aligned after it, ! = the field itself is aligned after it (the 0x4000 flags). -# The Unity 2022.3 Shader matches, node for node with those flags, the type tree in Ace Attorney Investigations Collection's bundles (Unity 2022.3.17f1), whose hash is the same -SHADER_2022_3 = ''' +# The structs up to SerializedProgramParameters are the same in both layouts below +_SHADER_COMMON = ''' SerializedTextureProperty: string m_DefaultName; int m_TexDim SerializedProperty: string m_Name; string m_Description; vector m_Attributes; int m_Type; unsigned int m_Flags; float m_DefValue[0]; float m_DefValue[1]; float m_DefValue[2]; float m_DefValue[3]; SerializedTextureProperty m_DefTexture SerializedProperties: vector m_Props @@ -135,7 +136,9 @@ ConstantBuffer: int m_NameIndex; vector m_MatrixParams; ve UAVParameter: int m_NameIndex; int m_Index; int m_OriginalIndex SamplerParameter: unsigned int sampler; int bindPoint SerializedProgramParameters: vector m_VectorParams; vector m_MatrixParams; vector m_TextureParams; vector m_BufferParams; vector m_ConstantBuffers; vector m_ConstantBufferBindings; vector m_UAVParams; vector m_Samplers -SerializedSubProgram: unsigned int m_BlobIndex; ParserBindChannels m_Channels; vector m_KeywordIndices; SInt8 m_ShaderHardwareTier; SInt8! m_GpuProgramType; SerializedProgramParameters m_Parameters; SInt64 m_ShaderRequirements +''' +# The Unity 2022.3 Shader matches, node for node with those flags, the type tree in Ace Attorney Investigations Collection's bundles (Unity 2022.3.17f1), whose hash is the same +SHADER_2022_3 = _SHADER_COMMON + '''SerializedSubProgram: unsigned int m_BlobIndex; ParserBindChannels m_Channels; vector m_KeywordIndices; SInt8 m_ShaderHardwareTier; SInt8! m_GpuProgramType; SerializedProgramParameters m_Parameters; SInt64 m_ShaderRequirements SerializedPlayerSubProgram: unsigned int m_BlobIndex; vector m_KeywordIndices; SInt64 m_ShaderRequirements; SInt8! m_GpuProgramType SerializedProgram: vector m_SubPrograms; vector> m_PlayerSubPrograms; vector> m_ParameterBlobIndices; SerializedProgramParameters m_CommonParameters; vector m_SerializedKeywordStateMask SerializedPass: vector m_EditorDataHash; vector m_Platforms; map~ m_NameIndices; int m_Type; SerializedShaderState m_State; unsigned int m_ProgramMask; SerializedProgram progVertex; SerializedProgram progFragment; SerializedProgram progGeometry; SerializedProgram progHull; SerializedProgram progDomain; SerializedProgram progRayTracing; bool m_HasInstancingVariant; bool! m_HasProceduralInstancingVariant; string m_UseName; string m_Name; string m_TextureName; SerializedTagMap m_Tags @@ -147,7 +150,20 @@ PPtr: int m_FileID; SInt64 m_PathID PPtr: int m_FileID; SInt64 m_PathID Shader: string m_Name; SerializedShader m_ParsedForm; vector platforms; vector> offsets; vector> compressedLengths; vector> decompressedLengths; vector compressedBlob; vector stageCounts; vector> m_Dependencies; map)>~ m_NonModifiableTextures; bool! m_ShaderIsBaked ''' -KNOWN_TREES = {(CLASS_SHADER, bytes.fromhex('ea424a5fc1e48db62144df956f9e1005')): ('Shader', SHADER_2022_3)} +# The Unity 2020.3 Shader (Patrick's Parabox, Unity 2020.3.30f1: only Data/*.assets, its shaders the built-in ones in Data/Resources) matches the type tree in Fire Emblem Engage's bundles +# (Unity 2020.3.18f1), whose hash is the same: global and local keyword indices per subprogram, every subprogram in m_SubPrograms, no parameter blobs, keyword names or stage counts +SHADER_2020_3 = _SHADER_COMMON + '''SerializedSubProgram: unsigned int m_BlobIndex; ParserBindChannels m_Channels; vector m_GlobalKeywordIndices; vector m_LocalKeywordIndices; SInt8 m_ShaderHardwareTier; SInt8! m_GpuProgramType; SerializedProgramParameters m_Parameters; int m_ShaderRequirements +SerializedProgram: vector m_SubPrograms; SerializedProgramParameters m_CommonParameters +SerializedPass: vector m_EditorDataHash; vector m_Platforms; vector m_LocalKeywordMask; vector m_GlobalKeywordMask; map~ m_NameIndices; int m_Type; SerializedShaderState m_State; unsigned int m_ProgramMask; SerializedProgram progVertex; SerializedProgram progFragment; SerializedProgram progGeometry; SerializedProgram progHull; SerializedProgram progDomain; SerializedProgram progRayTracing; bool m_HasInstancingVariant; bool! m_HasProceduralInstancingVariant; string m_UseName; string m_Name; string m_TextureName; SerializedTagMap m_Tags +SerializedSubShader: vector m_Passes; SerializedTagMap m_Tags; int m_LOD +SerializedShaderDependency: string from; string to +SerializedShader: SerializedProperties m_PropInfo; vector m_SubShaders; string m_Name; string m_CustomEditorName; string m_FallbackName; vector m_Dependencies; bool! m_DisableNoSubshadersMessage +PPtr: int m_FileID; SInt64 m_PathID +PPtr: int m_FileID; SInt64 m_PathID +Shader: string m_Name; SerializedShader m_ParsedForm; vector platforms; vector> offsets; vector> compressedLengths; vector> decompressedLengths; vector compressedBlob; vector> m_Dependencies; map)>~ m_NonModifiableTextures; bool! m_ShaderIsBaked +''' +KNOWN_TREES = {(CLASS_SHADER, bytes.fromhex('ea424a5fc1e48db62144df956f9e1005')): ('Shader', SHADER_2022_3), + (CLASS_SHADER, bytes.fromhex('a30e3dcf6c6d25153d6f64e5e41caf4e')): ('Shader', SHADER_2020_3)} def _split_top(s, sep): # s split at sep outside <> and () out, depth, cur = [], 0, '' diff --git a/dm/host/dm.h b/dm/host/dm.h index 9c1bf29..1305a85 100644 --- a/dm/host/dm.h +++ b/dm/host/dm.h @@ -54,6 +54,7 @@ void run_module_inits(void); void *module_sym(module_t *m, const char *name); int dm_sdk_major(void); // SDK major version from the sdk module's version string (loader.c); 0 = unknown #define DM_SDK_OLD(major) ((major) > 0 && (major) <= 10) // SDK 10 and older: NVN API 53, the shared-font address points at the TTF itself +int dm_main_imports(const char *prefix); // main imports a symbol whose name starts with prefix (loader.c) void *guest_sym(const char *name); module_t *module_of(const void *p); // Gate dispatch: rewritten svc / timer reads come in through the common entry, ret_addr = the return point of that gate block, regs points to the saved x0..x30 diff --git a/dm/host/hle_audio.c b/dm/host/hle_audio.c index 9047040..907bbc7 100644 --- a/dm/host/hle_audio.c +++ b/dm/host/hle_audio.c @@ -360,6 +360,8 @@ static Result ai_open(const char *name, void *lr) { } HLE_FORCE("_ZN2nn5audio11OpenAudioInEPNS0_7AudioInEPNS_2os11SystemEventEPKcRKNS0_16AudioInParameterE", "connect to the audin service; no microphone on the host: fails", Result, h_ai_Open, void *g, void *ev, const char *name, const void *param) { (void)g; (void)ev; (void)param; return ai_open(name, __builtin_return_address(0)); } +HLE_FORCE("_ZN2nn5audio11OpenAudioInEPNS0_7AudioInEPKcRKNS0_16AudioInParameterE", "connect to the audin service (no buffer event: Patrick's Parabox imports this one); no microphone on the host: fails", + Result, h_ai_OpenNoEv, void *g, const char *name, const void *param) { (void)g; (void)param; return ai_open(name, __builtin_return_address(0)); } HLE_FORCE("_ZN2nn5audio18OpenDefaultAudioInEPNS0_7AudioInEPNS_2os11SystemEventERKNS0_16AudioInParameterE", "connect to the audin service (default device); no microphone on the host: fails", Result, h_ai_OpenDef, void *g, void *ev, const void *param) { (void)g; (void)ev; (void)param; return ai_open(NULL, __builtin_return_address(0)); } HLE_FORCE("_ZN2nn5audio12StartAudioInEPNS0_7AudioInE", "start recording; never opened on the host: fails", Result, h_ai_Start, void *g) { (void)g; return RES_FAIL; } diff --git a/dm/host/hle_sdk16.c b/dm/host/hle_sdk16.c index 079430e..944681d 100644 --- a/dm/host/hle_sdk16.c +++ b/dm/host/hle_sdk16.c @@ -55,10 +55,10 @@ HLE_FORCE("_ZN2nn4time39AsyncEnsureNetworkClockAvailabilityTask9GetResultEv", "n // all other types share one = DM_SHARED_FONT or $DM_FONT_DIR/standard.ttf, then macOS's Arial Unicode (that path does not exist on iOS; the App ships dm/font/). // If the extension font cannot be opened it falls back to the standard font (button icons draw as "?", everything else works). // The game's own text uses the fonts in its RomFS; shared fonts are only used in a few places such as system names and button icons. -// Format: the original shared memory holds BFTTF - an 8-byte header + a TTF obfuscated by per-word XOR; after getting the address the game calls nn::fontll::ScalableFontEngineHelper::Decode(address, size) +// Format: each font is BFTTF - an 8-byte header + the TTF (obfuscated by per-word XOR in the system archive). Wonder calls nn::fontll::ScalableFontEngineHelper::Decode(address, size) on the address // (SMBW sdk +0x3093c0), which deobfuscates in place and returns address + 8. Decode first checks the first word: if it is already the "decoded" marker (little-endian 0x18029a7f) it returns address + 8 without touching the data. // So the host provides the "decoded" marker + the TTF as is; the second word holds the obfuscated length as in the original (key 0x49621806: stored as bswap(length ^ key)). A raw TTF would be XORed into garbage as if it were ciphertext, -// and the font engine then crashes on a wild pointer (SMBW main +0x107dbc0). +// and the font engine then crashes on a wild pointer (SMBW main +0x107dbc0). Games that read the address as a TTF get it past the header (font_skip below). typedef struct { uint8_t *p; size_t n; } font_t; static font_t font_map(const char *p) { font_t f = {0}; int fd = open(p, O_RDONLY); struct stat st; @@ -93,16 +93,21 @@ static font_t font_get(int type) { pthread_mutex_unlock(&mu); return f; } -// SDK 10 and older (dm_sdk_major; the profile's shared_font overrides): the address points straight at the TTF (past the 8-byte header) and the size excludes the header. Super Mario 3D World + Bowser's Fury -// (SDK 10) records shared fonts as type 0 (main+0x975658), calls no Decode and hands the address as is to ScalableFontEngine::LoadFont; with the header LoadFont fails with error 403 and SetFont with 301, every lookup -// of the "?" glyph then misses, and main+0x6c73c0 crashes on a null pointer. Odyssey (7), Link's Awakening (8), Age of Calamity (9) and Three Houses (6) take it the same way; SDK 11 and later pass the header to Decode +// The address points straight at the TTF (past the 8-byte header) and the size excludes the header, except for a game on SDK 11 or later whose main imports ScalableFontEngineHelper::Decode +// (dm_sdk_major, dm_main_imports; the profile's shared_font overrides). Super Mario 3D World + Bowser's Fury (SDK 10) records shared fonts as type 0 (main+0x975658), calls no Decode and hands the address +// as is to ScalableFontEngine::LoadFont; with the header LoadFont fails with error 403 and SetFont with 301, every lookup of the "?" glyph then misses, and main+0x6c73c0 crashes on a null pointer. +// Odyssey (7), Link's Awakening (8), Age of Calamity (9) and Three Houses (6) take it the same way. Unity's player hands the address and size of every type straight to FreeType's FT_New_Memory_Face +// (Patrick's Parabox, SDK 13, Unity 2020.3: main+0x2390b0 maps its OS font names Switch_Font_STD … Switch_Font_NIN_Extended to types 0-5, then main+0x23b2e0), as libnx homebrew does with the same pl offsets; +// with the header every face failed, so text the game's own font lacks (the Japanese, Korean and Chinese names in its language menu) drew nothing. Its main imports no Decode, as none of the Unity games' +// does (Engage, Ace Attorney Investigations Collection, Brain Memory Training Academy); Wonder, Breath of the Wild, Tears of the Kingdom and Pokémon Legends: Z-A import it and pass the header to it static size_t font_skip(void) { static int skip = -1; if (skip < 0) { #ifdef DM_GAME_SHARED_FONT_TTF skip = DM_GAME_SHARED_FONT_TTF ? 8 : 0; LOG("shared font: %s (game profile shared_font)", skip ? "the TTF itself" : "BFTTF header + TTF"); #else - int m = dm_sdk_major(); skip = DM_SDK_OLD(m) ? 8 : 0; LOG("shared font: %s (SDK %d)", skip ? "the TTF itself" : "BFTTF header + TTF", m); + int m = dm_sdk_major(), dec = dm_main_imports("_ZN2nn6fontll24ScalableFontEngineHelper6Decode"); skip = DM_SDK_OLD(m) || !dec ? 8 : 0; + LOG("shared font: %s (SDK %d, main %s ScalableFontEngineHelper::Decode)", skip ? "the TTF itself" : "BFTTF header + TTF", m, dec ? "imports" : "does not import"); #endif } return (size_t)skip; diff --git a/dm/host/loader.c b/dm/host/loader.c index b0d3ab6..bb00865 100644 --- a/dm/host/loader.c +++ b/dm/host/loader.c @@ -106,6 +106,16 @@ module_t *module_of(const void *p) { return NULL; } +// Whether main imports a symbol whose name starts with prefix (an undefined dynamic symbol: one main calls but another module defines), for behaviour that follows what the game uses +int dm_main_imports(const char *prefix) { + size_t n = strlen(prefix); + for (int i = 0; i < g_nmod; i++) if (!strcmp(g_mod[i].name, "main")) { + module_t *m = &g_mod[i]; + for (unsigned k = 1; k < m->nsym; k++) if (!m->symtab[k].st_shndx && !strncmp(m->strtab + m->symtab[k].st_name, prefix, n)) return 1; + } + return 0; +} + // SDK major version, from the version string the SDK's libraries keep in the sdk module's read-only data ("NintendoSDK_nnSdk-10_4_0"; SDK 12 spells it NintendoSdk_). // Behaviour that follows the SDK version is decided by it (the NVN API version, the shared-font layout), not by the game profile. 0 = no sdk module or no version string int dm_sdk_major(void) { diff --git a/dm/tools/patch_nso.py b/dm/tools/patch_nso.py index 2611e7f..1d81e16 100644 --- a/dm/tools/patch_nso.py +++ b/dm/tools/patch_nso.py @@ -114,6 +114,13 @@ CUTS = { (0x134778, '08fca752', '087ca052', 'AddressRegionManager constructor: node area limit mov w8,#0x3fe00000 → mov w8,#0x3e00000'), (0x13480c, '09fca752', '097ca052', 'AddressRegionManager constructor: length of the node area registered as an occupied region mov w9,#0x3fe00000 → mov w9,#0x3e00000'), ], + # Patrick's Parabox 1.0.1 (v65536) sdk (SDK 13.3.7, Unity 2020.3.30f1): the same node area cut. nninitStartup (main+0x1cd010) calls StandardAllocator::Initialize(nullptr, pool − used) with virtual + # address memory, which aborted at its CentralHeap::Init (sdk+0x324dec). The constructor is at sdk+0x37c3a0 (limit = alias start + 0x3fe00000 at +0x28, a unit heap of 0x30-byte nodes, the area then + # registered as occupied at +0x37c44c) + '9c73fb73f529fedc9ffefa28246711cc': [ + (0x37c3b0, '08fca752', '087ca052', 'AddressRegionManager constructor: node area limit mov w8,#0x3fe00000 → mov w8,#0x3e00000'), + (0x37c44c, '09fca752', '097ca052', 'AddressRegionManager constructor: length of the node area registered as an occupied region mov w9,#0x3fe00000 → mov w9,#0x3e00000'), + ], # Pokémon Legends: Z-A 2.0.2 (v393216) sdk (SDK 19.3.11): the same node area cut. The constructor is at sdk+0x1423ec (limit = alias start + 0x3fe00000 at +0x28, a unit heap of 0x30-byte # nodes, the area then registered as occupied at +0x142468). With main's allocator region below, the guest block fits the 5 GB proven on a phone 'df7a3960c74c3a4803f826c587153252': [ diff --git a/docs/agents/03-bringup.md b/docs/agents/03-bringup.md index 4e804e2..a1d5f01 100644 --- a/docs/agents/03-bringup.md +++ b/docs/agents/03-bringup.md @@ -58,6 +58,7 @@ Each entry: symptom → root cause → fix (where the fix lives). Check these fi - **Sizing the reservation for a title that uses virtual address memory (Engage)** → such a title may never call `SetHeapSize`: everything comes from `MapPhysicalMemory` in the alias region. The `[mem]` log lines report the alias high-water mark (one line per 256 MB), the total actually mapped (page bitmap) and every heap growth. What fills the alias region first is address space, not memory: StandardAllocator reserves the whole free pool (pool − 64 MB, 1 GB aligned) but Engage commits only 0.58 GB of it, and Unity's own regions commit 0.97 GB. So Engage's profile reports a 2.5 GB pool (`app_pool`) and uses a 4.375 GB alias region in a 5 GB block (reserved address space peaks at 3.47 GB of 4.31 GB). iOS without the extended-virtual-addressing entitlement allows a single 6 GB reservation, but Metal needs address space too; 5 GB is the total proven on a phone. To measure commits, probe `VammManager::AllocateMemoryPages` / `FreeMemoryPages` (x1 address, x2 size) and split them by region. - **`StandardAllocator::Initialize` aborts in `nninitStartup` on SDK 17, then the alias region fills in minutes** (Ace Attorney Investigations Collection, Unity 2022.3, SDK 17.5.3) → the same node area as Engage's SDK: `CentralHeap::Init(nullptr, pool − used)` got no 1 GB-aligned region for 3.14 GB after the 1 GB node area. The constructor is at `sdk+0x139458` on that build and takes the same cut. With Engage's 2.5 GB pool the game then ran, but probes on `VammManager::AllocateAddressRegion`'s success path (`sdk+0x1395a8`: x21 size, x22 address) and `FreeAddressRegion` (`sdk+0x139df0`) showed StandardAllocator's 2.44 GB reservation beside Unity's pools (1.06 GB live, from `main+0x40f1d4`) ending 4.37 GB into the 4.375 GB alias region after 140 s, while the `MapPhysicalMemory` log showed StandardAllocator committing 0.19 GB. The profile reports a 1 GB pool, a little less than the 1.02 GB the game maps at its peak (the host does not enforce the pool, and only `nninitStartup` reads it); ten minutes then peak at +2.85 GB of address space, against +3.91 GB with a 1.5 GB pool. - **The same abort on SDK 16.2.4** (Brain Memory Training Academy, Unity 2022.3.5f1: `nn::diag` abort at `sdk+0x126490`, `StandardAllocator::Initialize`, called from `nninitStartup` at `main+0x73adcc`; the NSP script's heap check reports "the host stopped before nnMain") → `nninitStartup` is Ace Attorney's, `Initialize(nullptr, pool − used)` with virtual address memory and no `SetMemoryHeapSize`. The `sdk` build is Unicorn Overlord's, whose NPDM declares no system resource, so it never needed the cut; the constructor (`AddressRegionManagerC2`, `sdk+0x134768`) takes it at `+0x134778` / `+0x13480c`. With Ace Attorney's 1 GB pool and 5 GB block the game boots to its title in 5 s with no red line; StandardAllocator ends at +1.0 GB, and five minutes of level loads take the alias high-water mark to +2.25 GB with at most 0.5 GB mapped. +- **The same abort on SDK 13.3.7** (Patrick's Parabox, Unity 2020.3.30f1: `StandardAllocator::Initialize` at `sdk+0x324dec`, called from `nninitStartup` at `main+0x1cd080`) → the same `nninitStartup` and the same cut, on this build's constructor (`sdk+0x37c3a0`: `+0x37c3b0` / `+0x37c44c`). With Ace Attorney's 1 GB pool and 5 GB block (in place of the provisional profile's hardware pool) it boots to its title with no red line, and the alias region is mapped up to +1.5 GB with 0.27 GB in use. To find the constructor on a new `sdk` build, search its text for the two `mov w8 / w9, #0x3fe00000` words (`08fca752`, `09fca752`); `sdis.py --fn` names the function `AddressRegionManagerC2Emm` from its dynamic symbols. - **`nn::diag` abort from `StandardAllocator::Initialize` long after `nninitStartup`, right after the first Vulkan query pool** (Super Mario Galaxy 2, SDK 18.3.5: `sdk+0x12dad0` ← `main+0x62c52c`) → the movie player initializes its own allocator with virtual address memory, `Initialize(nullptr, 384 MB)` (`main+0x62c280`); Galaxy, on the same SDK, allocates that block from its main allocator first. The guessed 256 MB alias region holds no region after the 1 GB node area. The same node area cut for that `sdk` build (`sdk+0x13be4c` / `+0x13bee0`) and a 512 MB alias region: the region is 32 MB aligned, so it starts 64 MB in. - **`nn::diag` abort at `sdk+0x12dad0` in `nninitStartup`, called from `main+0x756310`** (Absolum, .NET NativeAOT on SDK 18.3.2) → malloc's `StandardAllocator::Initialize(nullptr, 0xa00000000)`: 40 GB of address space (`main+0x28bff4`). To see what such a game really needs, boot it once on the Mac with a 64 GB alias region (`mem_reserve 0x1030000000`, `mem_alias 0x1008000000`) and probe `VammManager::AllocateAddressRegion`'s success path (`sdk+0x13bf8c`: x21 size, x22 address) with `DM_SVC=1`'s map log. Absolum's regions: malloc's (2.19 GB used into the first level, 1.75 GB of it FNA3D's GPU heap, allocated whole at `FNA3D_CreateDevice`), the .NET GC's region range (3.75 GB) and a few small ones. The GC sizes its range as 5 × its hard limit (768 MB = 75% of the 1 GB its `GetPhysicalMemoryLimit`, `main+0x28bffc`, reports), and it reads `DOTNET_GCRegionRange` through `getenv` first. The host now answers `getenv` from the profile key `game_env` (`hle_os.c`; every other name goes to the SDK's own `getenv`, an empty environment), which sets 1.5 GB. The GC then uses its range from both ends, 756 MB from the start and 748 MB from the end, where it used only the first 1.14 GB of 3.75. A cut on `main` gives malloc 2.5 GB. One more thing kept it from fitting: SDK 18's `AllocateAddressRegion` aligns a region of 1 GB or more to 1 GB in absolute address (`sdk+0x13c03c`; 32 MB from 32 MB up). The two large regions, with a 4 KB one between them, lost up to 1 GB each to alignment, depending on where `mmap` put the guest block. A cut on that build aligns them to 32 MB as well, beside the node-area cut. The regions then end 4.13 GB into the 4.375 GB alias region of Engage's 5 GB block. - **Large resources silently skipped, later a null deref where the resource is used** → the game reserves "virtual address memory" (Mario: 1.75 GB in `HeapDef.byml`) and maps it into the alias region with `MapPhysicalMemory` on demand; the alias region left after the node area was too small. Also visible as `SetHeapSize` asking for much less than the pool. → repartition the guest block (`hle_svc.c` `mem_init`): Mario uses alias 2.875 GB, stacks 256 MB, heap 1.625 GB (it asks for 1.47 GB), 5 GB in total. Measure before sizing (`DM_SVC=1`: the `SetHeapSize` request and the highest `MapPhysicalMemory` address). On iOS without the extended-virtual-addressing entitlement a single 6 GB reservation succeeds and 7 GB fails, but Metal and the rest of the process need address space too; 5 GB is the total proven on a phone (D2R). @@ -190,7 +191,8 @@ Each entry: symptom → root cause → fix (where the fix lives). Check these fi - **The process dies when an activity starts, 2 runs in 5, with no `CRASH` line** (the run ends with exit 137, SIGKILL; `~/Library/Logs/DiagnosticReports/dmhost-*.ips` has `EXC_BREAKPOINT` in `_os_unfair_lock_corruption_abort` ← `pthread_mutex_destroy` ← `md_free`, the movie decoder's destructor) → each activity's preview is an H.264 movie (`movie/Movie/*.mp4`) the game loops with Flush and Start, from four threads at once (`DM_MOVIE_TRACE=1` logs every decoder call with its thread). Its event thread acquired an input index while the control thread's Flush waited for the packet being decoded; the flush then returned that index to the free list, it was handed out a second time, two packets shared one buffer (VideoToolbox -12909 on the overwritten one, in exactly the runs that died) and a fifth pending packet wrote past `pend[]` into the decoder's `npend` and `dmu`. A send now claims an index a flush returned, and `pend[]` cannot overflow. Handing such an index out last was not enough (with three hosts running at once one run still sent an index twice): an index the client held across a flush is now withheld for 250 ms unless the client sends it first, and an acquire refused only for that announces input when the first one comes back, so a client that abandons its indices, as MediaCodec's rules expect, loses none (`hle_movie.c`). The previews also flashed black at the end of every loop: the game reads the buffers of the end-of-stream output (no picture) and of an output it acquired before the flush, and the host painted its texture black for both. A flush now keeps each slot's last picture, and in native-texture mode an output with no picture leaves the texture as it was, as the SDK's GPU consumer has nothing to draw. - **Code inherited from another title calls fixed addresses** → harmless on the build it was written for, silent memory corruption on any other. d2r-mobile's 3D render scale read a renderer pointer at `main+0x31e0848` and called `main+0x8582f0`; in Mario v0 that is the middle of a static initializer and only did nothing because the pointer happened to read 0. Such code checks `module_t.build_id` now (written into `fixups.tsv` by the rewriter) and stays off on other builds. - **Device / subsystem setup returns quietly and the next stage never starts** → a version or capability check failed (NVN API version, a feature query) → compare what the game queries with what the host answers. -- **Font engine runs on garbage** → the system shared font must look like BFTTF: the SDK calls `ScalableFontEngineHelper::Decode(ptr, size)`, which XOR-decodes in place unless the first word is the "already decoded" marker (LE `0x18029a7f`) → serve `marker + bswap(size ^ 0x49621806) + TTF` (`hle_sdk16.c`). +- **Font engine runs on garbage** → the system shared font must look like BFTTF: the SDK calls `ScalableFontEngineHelper::Decode(ptr, size)`, which XOR-decodes in place unless the first word is the "already decoded" marker (LE `0x18029a7f`) → serve `marker + bswap(size ^ 0x49621806) + TTF` (`hle_sdk16.c`). That is the address only for a game on SDK 11 or later whose `main` imports `Decode` (Wonder, Breath of the Wild, Tears of the Kingdom, Pokémon Legends: Z-A); every other game gets the TTF itself (next entry). +- **Japanese, Korean or Chinese text draws nothing in a Unity game, Latin text is fine** (Patrick's Parabox, SDK 13: its language menu showed three blank lines) → the game's one font (Jost, a Unity dynamic font) falls back to the OS fonts for those glyphs, and Unity's Switch player loads them from the shared fonts: `main+0x2390b0` maps the names `Switch_Font_STD`, `Switch_Font_CN_Simplified`, `Switch_Font_CN_Extended`, `Switch_Font_CN_Traditional`, `Switch_Font_KR` and `Switch_Font_NIN_Extended` to types 0–5 and hands `GetSharedFontAddress` / `GetSharedFontSize` straight to FreeType's `FT_New_Memory_Face` (`main+0x23b2e0`), as libnx homebrew does with the same pl offsets. The host gave every SDK 11+ game the 8-byte BFTTF header in front, so every face failed to open. The SDK's `GetSharedFontAddress` is the shared memory base plus the pl service's offset, with no adjustment, and that offset points past the header (yuzu's pl service: "font offset and size do not account for the header"); Captain Toad (SDK 8) records its shared fonts as plain TTFs and calls `Decode` only for its BFTTF formats. So the address is the TTF unless the game is on SDK 11 or later and its `main` imports `nn::fontll::ScalableFontEngineHelper::Decode` (`font_skip` in `hle_sdk16.c`, `dm_main_imports` in `loader.c`). Of the games on hand, the ones that call `GetSharedFontAddress` without importing `Decode` are all Unity players (Engage, Ace Attorney Investigations Collection, Brain Memory Training Academy, Patrick's Parabox). To see which fonts a Unity game asks for, probe its name mapper's entry (`DM_PROBE=main:2390b0` on Patrick's Parabox 1.0.1; the function is the one `main` caller of `GetSharedFontLoadState`). - **File-not-found noise** → games probe many optional paths (debug parameters, other-language voice files); with `DM_FS=1` these show as `fs … not found`. Only a missing file followed by a failure matters. - **A buffer is created with a null pool right after a scene change** → NVN *virtual* memory pools (flag 0x200) have no storage until `nvnMemoryPoolMapVirtual` maps physical pool pages in; if the host returns failure, the game treats the pool as unusable. Mario maps its single 128 MB virtual pool onto one physical pool in one request, so the host aliases it (`hle_nvn.c`). True sparse mappings are still unimplemented. diff --git a/docs/agents/04-graphics.md b/docs/agents/04-graphics.md index 9db6b21..1be7caa 100644 --- a/docs/agents/04-graphics.md +++ b/docs/agents/04-graphics.md @@ -11,7 +11,7 @@ Do not stop at the obvious archive. In Mario the main `bfsha` held 4,888 of the - **BNSH** (`BNSH\0\0\0\0` + `grsc` block at +0x60): inside `bfsha`, particle effects (`esetb`, VFXB), UI layouts (`blarc`), and `main` itself. Variation table at +0x80 (count at +0x7c); binary program at variation +0x10; six stage pointers from program +0x08 (vs, hs, ds, gs, ps, cs); stage code descriptor: control ptr +0x08, code ptr +0x10, code size +0x18, control size +0x1c. All pointers relative to the BNSH start. - **Unity Shader objects** (Engage): Unity 2020.3 keeps each shader's compiled programs in its `Shader` object (class 48), in UnityFS bundles (`StreamingAssets/aa`) and in the player's own serialized files (`data.unity3d`, `Resources/unity default resources`). `dm/gfx/tools/unityfs.py` reads them: UnityFS blocks (LZ4 / LZMA), the serialized file, the object through its type tree, then `compressedBlob` per platform (LZ4 segments; each segment starts with a u32 count and 12-byte `{offset, length, segment}` entries). The player's files have no type trees; they borrow the bundles' `Shader` tree with the same type hash (same Unity build, same layout). Type-tree strings with the high bit set index Unity's common string table, which `unityfs.common_strings` reads from the game's own `main` (`AABB\0AnimationClip\0…`). On Switch every subprogram is one whole NVN program: its code is a 0x60-byte header of four `i32 ×6` arrays indexed by NVN stage (0 vertex, 1 fragment, 2 geometry, 3 tess control, 4 tess evaluation, 5 compute): an unused / scratch size, the block offset from +0x60 (−1 = no stage), the control size and the code size. Each block is the control section followed by the code area. The vertex and fragment stages of one program form a pair. Engage: 209 `Shader` objects in 188 bundles plus the engine files, 9,269 stage shaders (4,634 vertex / pixel pairs and one geometry shader), no compute shaders. - **Unity 2022 Shader objects** (Ace Attorney Investigations Collection, Unity 2022.3.17f1): the program code keeps the 0x60-byte stage header, but two things changed. From Unity 2022 the blob also holds each program's parameter tables as entries of their own (the parsed form's `m_ParameterBlobIndices`; their bytes start `PGlobals`), and the player's programs are listed in `m_PlayerSubPrograms[tier][].m_BlobIndex` (`m_SubPrograms` is empty); `unity_code_blobs` keeps only those. UnityPy's type trees for 2020.3 (Engage) and 2021.3 have neither field, so those read every entry as before. Subprogram version 202012090 (from Unity 2021.2) also has no local keyword list, so `unityfs.subprogram` reads no second keyword array (with one it read the code length as a keyword count). The player's serialized files have no type trees and the Addressables bundles hold no `Shader`, except the `unitybuiltinshaders` bundle, whose tree has the same hash and is borrowed in the second pass. 4,951 stage shaders: 2,475 vertex / pixel pairs (4,294 in the player's files, 517 built-ins, 140 in bundles) and one geometry shader, which Metal cannot express (its build fails). armyja's issue #17 proposed UnityPy and a reader of its own; neither was needed. -- **A Unity player with no bundle to borrow a tree from** (Brain Memory Training Academy, Unity 2022.3.5f1: only `Data/*.assets`, `level*` and the two engine files in `Data/Resources`, none with type trees) → the split stopped with "no bundle has a Shader type tree of the same hash to borrow". The `Shader` type hash there (`ea424a5f…`) is the one in Ace Attorney Investigations Collection's bundles (2022.3.17f1): the same layout. `unityfs.py` now carries that layout written out (`KNOWN_TREES`: about 30 structs, `tree_from_layout` builds the tree a file with type trees would have) and the split's second pass gives it to the stripped files when no bundle lent a tree of that hash (only there: taken in the first pass, Ace Attorney's player files came before its `unitybuiltinshaders` bundle and the built-ins' source column and package indices moved, while with the second pass its tables come out byte-identical). Checked against Ace Attorney's own tree: the same 2,324 nodes with the same alignment flags, and its 40 bundle `Shader` objects decode identically with either. 496 stage shaders: 439 engine built-ins, 46 of the game's, 11 of the player's in `main`, and the built-in VR blit's geometry shader, which does not build. A Unity version whose `Shader` hash is not in the table still stops with the same message; read its tree from any bundle of that Unity version and add it. +- **A Unity player with no bundle to borrow a tree from** (Brain Memory Training Academy, Unity 2022.3.5f1: only `Data/*.assets`, `level*` and the two engine files in `Data/Resources`, none with type trees) → the split stopped with "no bundle has a Shader type tree of the same hash to borrow". The `Shader` type hash there (`ea424a5f…`) is the one in Ace Attorney Investigations Collection's bundles (2022.3.17f1): the same layout. `unityfs.py` now carries that layout written out (`KNOWN_TREES`: about 30 structs, `tree_from_layout` builds the tree a file with type trees would have) and the split's second pass gives it to the stripped files when no bundle lent a tree of that hash (only there: taken in the first pass, Ace Attorney's player files came before its `unitybuiltinshaders` bundle and the built-ins' source column and package indices moved, while with the second pass its tables come out byte-identical). Checked against Ace Attorney's own tree: the same 2,324 nodes with the same alignment flags, and its 40 bundle `Shader` objects decode identically with either. 496 stage shaders: 439 engine built-ins, 46 of the game's, 11 of the player's in `main`, and the built-in VR blit's geometry shader, which does not build. A Unity version whose `Shader` hash is not in the table still stops with the same message; read its tree from any bundle of that Unity version and add it. Patrick's Parabox (Unity 2020.3.30f1, built-in shaders only, no bundles) stopped there with hash `a30e3dcf…`, which one 18 KB shader bundle of Fire Emblem Engage (2020.3.18f1) carries; its tree is now in the table too (`SHADER_2020_3`: per subprogram global and local keyword indices, every subprogram in `m_SubPrograms`, no parameter blobs, keyword names or stage counts), equal to Engage's node for node (2,179 nodes, the alignment flags included), and each of the game's 48 `Shader` objects reads to its exact end. The structs both layouts share are written once (`_SHADER_COMMON`), and the 2022.3 layout comes out byte-identical. To take one file out of an NSP without extracting the RomFS, filter `nx_extract`'s `Copy` by path. - **MSHD** (Metroid Dread, MercurySteam's engine: `system/shd/*.bshdat`, the only place its shaders live; nothing in `main` or the `.pkg` packs): each stage is a control section, whose length is at control +0x20, sometimes followed by a small compiler-option table (`fastmath true`), then the code area at the next code header. Every file holds vertex / pixel stages in alternating order (1, 2 or 4 programs) and is paired two by two. The control section carries NV assembly text after its first 0x880 bytes, and the SASS disassembly follows each code area, so the binding layout can be read straight from the files (`TEX` / `TEXS` handle immediates). 478 files, 1,342 stages, 1,010 unique keys (359 vertex, 651 pixel), 659 pairs. - **GLSLC outputs in `main`** (13 Sentinels, Vanillaware's engine: no shader file in RomFS, whose six CRI CPK archives hold textures, scripts, CRI audio and USM movies): 838 GLSLC compiler outputs sit in `main`'s read-only segment, each referenced from a `{pointer, size, 0}` table in `.data`. An output starts with the magic `0x19866891`, its total size is at +0x44, and it holds exactly one control section with the code area right after it (control +0x20 = control length); a debug section with the NV assembly and the GLSL source follows. Engage's `main` also has 11 of them (Unity's own), and `shader_split.py` reads them in every game's `main`, accepting only outputs that pass the control / code / length check. The stage comes from SPH word 0, as for BAHS. Loose RomFS files no other reader takes are searched the same way: FINAL FANTASY TACTICS - The Ivalice Chronicles keeps 257 whole outputs in its technique files (`*.tec`, below), Absolum 163 in `shaders.nx.bin`; in the other profiles' files only Metroid Dread's MSHD files hold any, which `mshd_shaders` reads. - **G2S in RDB archives** (Hyrule Warriors: Age of Calamity, Koei Tecmo's KTGL): each material's shaders are a G2S container (`_S2G3000`, type KTID `0x7bcd279f`; 23,108 entries in `asset/system.rdb.bin*`, 2.3 GB inflated) of GLSLC outputs, as in 13 Sentinels' `main`, inside zlib-chunked IDRK entries ([01](01-extract.md)); one `_DOK0000` container (type `0x20a6a0bb`, the engine's system resources) holds 151 more bare GLSLC outputs, 21 of them drawn in the first battle. `shader_split.py` maps the RDB files and inflates only entries that start with those two magics (`idrk_shaders`), and the 117 outputs in `main` as in every game. Many outputs carry 0x850-byte control sections and the compute ones have no code header, so `glslc_shaders` accepts controls from 0x760 bytes and takes the stage of headerless code from the thread group size at control +0x748. 40,726 shaders (37,043 pixel, 3,440 vertex, 241 compute, 2 geometry), Mario's texture handle layout (`0x20 + 8 × slot`); pairs come from the single-stage cover (`separable_pairs`). The older KTGL of Three Houses packs the same G2S containers differently (next item). diff --git a/docs/development.md b/docs/development.md index cadaf96..9a0ee8e 100644 --- a/docs/development.md +++ b/docs/development.md @@ -414,6 +414,15 @@ The game's own work and its frame rate stay as they are; the host avoids work of - **Memory:** no system resource; the game sets a 3.14 GB heap (pool − used) in the 4 GB layout. It creates 1.5 GB of NVN memory pools in its first 25 s (384 + 256 MB CPU-uncached, a 320 MB physical pool for sparse mappings, 192 + 64 MB of render targets), so about 1.3 GB is resident at the title and 1.5 GB in the first activity. Over 15 minutes of activities it rose to 1.86 GB in steps as each new activity loaded (pools 217 → 292, textures 444 → 1,173), flat in between. - **Mac input:** from a fresh save, `DM_KEYS="f1900:A,f2400:A*9/150,f3800:Right*14/150,f3875:A*14/150,f6000:A*4/150,f6900:Down*5/60,f7250:A,f7500:A*17/150,f10050:A"` enrolls a student (birthday 01/01/2000, the default appearance, no online features) and starts Whack Match from Practice at about frame 10,050 (`/run/enroll.sh`). In handheld mode `Tx` taps work too: `f1900:T0.5x0.88` taps Start on the title. +**Patrick's Parabox (`0100E44016C22000`)** +- **Status:** brought up on the Mac: the first-boot language menu (all ten languages drawn), the title, the hub, Intro 1 solved and Intro 2 with undo, reset and the menu, at 60 fps with music and saves (progress kept across a restart); no red line, about 0.42–0.48 GB resident, flat over four minutes. +- **Engine:** Unity 2020.3.30f1 IL2CPP with FMOD on SDK 13.3.7, update 1.0.1 (v65536); `subsdk0` is the movie module, which the game never uses. +- **Shaders:** 486, all Unity built-ins (`Data/Resources/unity default resources`, `unity_builtin_extra`) plus the player's 11 GLSLC outputs in `main`. There are no bundles, so `unityfs.py` has Unity 2020.3's `Shader` layout written out (`KNOWN_TREES`: the type tree of Engage's bundles, the same hash). The built-in VR blit's geometry shader does not build ([04](agents/04-graphics.md)). The whole game draws with three shader pairs. +- **Fonts:** its only font, Jost, falls back to the shared fonts for Japanese, Korean and Chinese text, which Unity's player opens with FreeType straight from `GetSharedFontAddress`; the host gives a game that imports no `ScalableFontEngineHelper::Decode` the TTF itself ([03](agents/03-bringup.md)). +- **Memory:** the NPDM declares 16 MB of system resource (`sys_resource`), so virtual address memory as in Ace Attorney Investigations Collection and Brain Memory Training Academy: `nninitStartup` gives StandardAllocator pool − used, which needs the node area cut on this `sdk` build (`patch_nso.py`); their 1 GB pool and 5 GB block. The alias region is mapped up to +1.5 GB with 0.27 GB in use. +- **Input:** controller only (stick or D-pad to move, A redo, B undo, X reset, + menu): it stays docked at 1920x1080 with the 2D pad layout. +- **Mac input:** a fresh save solves Intro 1 with `DM_KEYS="f700:A,f1000:A,f1300:A,f1600:A,f2400:Right,f2450:Down,f2500:Down,f2550:Down,f2600:Down,f3000:Up*3/30,f3090:Right*3/30,f3180:Down*2/30,f3240:Up*3/30,f3330:Left*4/30"` (English, the title, into Intro 1 from the hub at about frame 2,700, solved and on to Intro 2 at about frame 3,500). + ## Tools (`dm/tools`) | Tool | What it does |