From b9a14e2acd2085d90074e8903b879b15f85e4776 Mon Sep 17 00:00:00 2001 From: Abdessamad Derraz <3028866+Abdess@users.noreply.github.com> Date: Mon, 9 Nov 2026 08:01:17 +0100 Subject: [PATCH] feat: profile the xenia-edge system files --- emulators/xenia-edge.yml | 155 +++++++++++++++++++++++++++------------ 1 file changed, 108 insertions(+), 47 deletions(-) diff --git a/emulators/xenia-edge.yml b/emulators/xenia-edge.yml index c5dfb67b6..6620e16b2 100644 --- a/emulators/xenia-edge.yml +++ b/emulators/xenia-edge.yml @@ -6,9 +6,9 @@ source: libretro: "https://git.libretro.com/libretro/xenia-edge-libretro" upstream: "https://github.com/has207/xenia-edge" source_commit: - standalone: "71804222514022ce80b757ca79c4ddb2dcf4a06c" - libretro: "f23c14c717ef274516f29c9b5e97d6a9db28643d" -profiled_date: "2026-10-27" + standalone: "c519cb405d3247a5d92e7b520d6c72705efa62f5" + libretro: "9637f45c480c711de0dd8a041d1ba754192ec73b" +profiled_date: "2026-11-09" core_version: standalone: "7180422" libretro: "8dc77b0" @@ -32,15 +32,15 @@ systems: data_root: windows: path: "%USERPROFILE%/Documents/Xenia" - source_ref: "src/xenia/app/xenia_main.cc:533-547, src/xenia/base/filesystem_win.cc:52-61" + source_ref: "src/xenia/app/xenia_main.cc:538-552, src/xenia/base/filesystem_win.cc:52-61" note: "portable.txt beside the executable, the portable flag or the storage_root setting replaces it" macos: path: "$XDG_DATA_HOME/Xenia, else ~/.local/share/Xenia" - source_ref: "src/xenia/app/xenia_main.cc:533-547, src/xenia/base/filesystem_posix.cc:81-107" + source_ref: "src/xenia/app/xenia_main.cc:538-552, src/xenia/base/filesystem_posix.cc:81-107" note: "portable.txt beside the executable, the portable flag or the storage_root setting replaces it" linux: path: "$XDG_DATA_HOME/Xenia, else ~/.local/share/Xenia" - source_ref: "src/xenia/app/xenia_main.cc:533-547, src/xenia/base/filesystem_posix.cc:81-107" + source_ref: "src/xenia/app/xenia_main.cc:538-552, src/xenia/base/filesystem_posix.cc:81-107" note: "portable.txt beside the executable, the portable flag or the storage_root setting replaces it" notes: | @@ -56,61 +56,78 @@ notes: | mirrored as WizzardSK/xenia-libretro on GitHub. It carries the xenia-edge tree merged from edge at 8dc77b09, the release named in upstream.version and reported as library_version (libretro/CMakeLists.txt:74-78, - libretro/libretro.cpp:1906-1909). The core is one shared library linked from + libretro/libretro.cpp:2027-2030). The core is one shared library linked from the emulator's static libraries, without the wxWidgets app - (libretro/CMakeLists.txt:1-13, 104-130), and the top-level CMakeLists.txt + (libretro/CMakeLists.txt:1-13, 104-129), and the top-level CMakeLists.txt defines XENIA_LIBRETRO for every target of the tree. Everything it keeps is under /Xenia-Edge: storage root, content, cache, xenia.log, and xbl_profilename.txt, which it creates with "Player" and reads to name the - profile it creates (libretro/libretro.cpp:1476-1503, 1526-1546). The frame + profile it creates (libretro/libretro.cpp:1496-1523, 1615-1648). The frame rate unlock list is compiled into the core and written there when missing (libretro/CMakeLists.txt:15-33, libretro/libretro_gamedb.cc:36-51), and the bundled patches of the running title are written to Xenia-Edge/patches with their core option state before Xenia reads that folder at boot - (libretro/libretro.cpp:791-798). Apart from XeFu under Xenia-Edge/xefu, it + (libretro/libretro.cpp:794-801). Apart from XeFu under Xenia-Edge/xefu, it reads no firmware, font or runtime from disk. Vulkan comes from the frontend's instance (libretro/libretro_vk_presenter.cc:42-62), Direct3D 12 runs on the system runtime with the D3D12Core.dll check of d3d12_provider.cc compiled out under XENIA_LIBRETRO, and the download prompts for missing runtimes are stubbed out (libretro/libretro_headless_stubs.cc:22-27). The Windows build embeds bin/x64/dxil.dll of the DXC release as a resource - (libretro/CMakeLists.txt:35-51, .ci/build-windows-cross.sh:61-80) and writes + (libretro/CMakeLists.txt:35-51, .ci/build-windows-cross.sh:66-85) and writes it to Xenia-Edge/D3D12/dxil.dll when the copy there differs in size, then points d3d12_runtime_path at that folder, where the D3D12 provider loads it - by full path (libretro/libretro.cpp:1437-1462, 1552-1559). + by full path (libretro/libretro.cpp:1457-1482, 1654-1661). - An Xbox 360 title reads no system file. xboxkrnl, xam and xbdm are C++ HLE modules - registered at startup (src/xenia/emulator.cc:414-423), the XEX2 retail and devkit AES - keys are constant arrays in the binary (src/xenia/cpu/xex_module.cc:66-71), and every + An Xbox 360 game reads no system file. xboxkrnl, xam and xbdm are C++ HLE modules + registered at startup (src/xenia/emulator.cc:437-446), the XEX2 retail and devkit AES + keys are constant arrays in the binary (src/xenia/cpu/xex_module.cc:64-69), and every XConfig setting is synthesised from cvars and constants by BuildSetting - rather than read from a flash image, the console MAC address being drawn at - random behind a fixed vendor prefix for each title - (src/xenia/kernel/xconfig.cc:94-256, 269-289). When the - launched title is itself a system title the kernel resolves xam.xex, then - $flash_xam.xex, through the guest filesystem under the \SystemRoot symlink - pointing at that title's own directory (src/xenia/emulator.cc:825-845). That is a - companion module inside the dump the user launched, not a host-side lookup. + rather than read from a flash image. The console MAC address is derived from + the signed-in profile or the machine id behind a fixed vendor prefix, and is + drawn at random only when neither exists + (src/xenia/kernel/xconfig.cc:99-270, 283-318). A launched folder that holds + its own xam.xex or $flash_xam.xex is that title's flash + (src/xenia/emulator.cc:865-874, 2512-2549). That is a companion module + inside the dump the user launched, not a host-side lookup. + + System files are optional. The installed flash, system extended and system + auxiliary partitions are read from system/flash, system/sysext and + system/sysaux under the storage root when those folders exist, and the flash + becomes \SystemRoot and media:, where titles find the system fonts + (src/xenia/emulator.h:98-102, src/xenia/emulator.cc:2657-2677, + src/xenia/emulator.cc:2512-2521). The libretro core mounts the same folders + under Xenia-Edge/system but has no installer. They hold dash.xex, which Start + Dashboard runs (src/xenia/app/emulator_window.cc:2027-2033), bootanim.xex, + played before it (src/xenia/emulator.cc:2551-2560), and the + xna_titlelauncher.xex every indie game runs through + (src/xenia/emulator.cc:1109-1157). The standalone's Tools > Install System + Files builds them from a USB system update zip, downloaded from Microsoft or + picked by the user, and fills a flash font the update only patches with one + built from the bundled fonts (src/xenia/app/emulator_window.cc:1251-1258, + src/xenia/ui/system_files_installer_wx.cc:111-131, + src/xenia/ui/system_files_installer_wx.cc:384-499). Original Xbox games, as an .xbe, a disc image whose root holds one or an Xbox Original package, start through XeFu, the console's own backward - compatibility emulator (src/xenia/emulator.cc:748-768). Its files come from + compatibility emulator (src/xenia/emulator.cc:794-821). Its files come from the Compatibility folder of an Xbox 360 hard drive and go in the xefu folder under the storage root, or the folder the xefu_path cvar names - (src/xenia/emulator.cc:151-165, 861-863). When xbox.xex is missing the + (src/xenia/emulator.cc:171-185, 897-899). When xbox.xex is missing the launch fails, the folder is created and the window names the missing file - (src/xenia/emulator.cc:886-899, src/xenia/app/emulator_window.cc:2013-2023). + (src/xenia/emulator.cc:1067-1080, src/xenia/app/emulator_window.cc:2226-2236). The fork's data ships inside the executable. assets/font, the Inter UI font and the M PLUS 1p Japanese font, and assets/icon are linked in by xe_embed_binary_assets and the 33 assets/locale catalogues are compiled to .mo at configure time and bundled, - with no .mo written next to the binary (src/xenia/ui/CMakeLists.txt:48-76). + with no .mo written next to the binary (src/xenia/ui/CMakeLists.txt:51-84). The UI font is read from that buffer with AddFontFromMemoryTTF (src/xenia/ui/imgui_drawer.cc:375-385), Japanese glyphs are merged from the M PLUS 1p buffer on every platform (src/xenia/ui/imgui_drawer.cc:481-498), and xe::EmbeddedBundle decodes the SDL controller - mappings (src/xenia/hid/sdl/sdl_input_driver.cc:237-254), the canary game patches - (src/xenia/patcher/patch_db.cc:318-324), the game-compatibility master.json - (src/xenia/app/game_compat_db.cc:47-58) and the x360db games.json (src/xenia/app/game_title_db.cc:50-60). + mappings (src/xenia/hid/sdl/sdl_input_driver.cc:237-254), the canary and edge game patches + (src/xenia/patcher/patch_db.cc:352-366), the game-compatibility master.json + (src/xenia/app/game_compat_db.cc:47-58) and the x360db games.json (src/xenia/app/game_title_db.cc:53-62). Three cvars accept a file and name none by default, so nothing is expected at a fixed path: custom_font_path falls back to the embedded Inter @@ -123,23 +140,23 @@ notes: | (src/xenia/ui/imgui_drawer.cc:396-479, 508-521). Everything under the storage root is written by the emulator or dropped in by - the user: xenia-edge.config.toml and per-game .config.toml (src/xenia/config.cc:46-49), - patches/*.patch.toml read on top of the embedded set (src/xenia/emulator.cc:409, - src/xenia/patcher/patch_db.cc:34-52, 60-75) and listed by the patches panel - beside the bundled ones (src/xenia/patcher/patch_db.cc:373-397), + the user: xenia-edge.config.toml and per-game .config.toml (src/xenia/config.cc:47-50), + patches/*.patch.toml read on top of the embedded set (src/xenia/emulator.cc:430, + src/xenia/patcher/patch_db.cc:39-57, 65) and listed by the patches panel + beside the bundled ones (src/xenia/patcher/patch_db.cc:423-444), plugins//plugins.toml behind allow_plugins, which defaults false (src/xenia/patcher/plugin_loader.cc:16-38, 58-73), content - (src/xenia/app/xenia_main.cc:572-575), scratch, cache0, cache1, cache and mu - (src/xenia/emulator.cc:1655-1723). portable.txt next to the executable + (src/xenia/app/xenia_main.cc:577-580), scratch, cache0, cache1, cache and mu + (src/xenia/emulator.cc:1935-2003). portable.txt next to the executable keeps the storage root there instead of the user folder - (src/xenia/app/xenia_main.cc:533-547). + (src/xenia/app/xenia_main.cc:538-552). On Windows the Direct3D 12 and Vulkan runtimes are not in the release zip, - which holds only the build output (.github/workflows/build.yml:392-402). The + which holds only the build output (.github/workflows/build.yml:394-404). The emulator looks for them in D3D12/ and Vulkan/ beside the executable and offers to download pinned archives from Microsoft and LunarG, gated by d3d12_install_missing_runtime, vulkan_install_missing_loader and - update_vc_runtime, all default true (src/xenia/ui/redist_installer_wx.cc:51-70). Each + update_vc_runtime, all default true (src/xenia/ui/redist_installer_wx.cc:49-68). Each archive is checked against a SHA-256 held in the source before its members are extracted, so the hash covers the archive and never the extracted DLL, which is why no hash is declared on the entries below. The Linux and macOS @@ -155,7 +172,7 @@ files: system: microsoft-xbox-360 required: true description: "DXIL signer and validator from DirectX Shader Compiler 1.9.2602.24" - source_ref: "src/xenia/ui/d3d12/d3d12_provider.cc:267-291, src/xenia/gpu/d3d12/pipeline_cache.cc:129-137, src/xenia/ui/redist_installer_wx.cc:79-87, 120-122, src/xenia/ui/redist_installer_wx.cc:174-182, src/xenia/ui/redist_installer_wx.cc:585-617" + source_ref: "src/xenia/ui/d3d12/d3d12_provider.cc:267-291, src/xenia/gpu/d3d12/pipeline_cache.cc:129-137, src/xenia/ui/redist_installer_wx.cc:77-85, 118-120, src/xenia/ui/redist_installer_wx.cc:172-180, src/xenia/ui/redist_installer_wx.cc:482-514" note: >- The only shader library the backend still needs. Loaded by full path from the D3D12 folder next to the executable, then by plain name from the @@ -163,8 +180,8 @@ files: D3D12/. D3D12 rejects an unsigned shader, so PipelineCache::Initialize stops when IsSignerAvailable() is false and asks for a recent dxil.dll in the D3D12 folder, and that failure propagates to "Failed to setup - graphics_system!" (src/xenia/emulator.cc:456-467). Windows defaults to - gpu = "d3d12" (src/xenia/emulator.cc:128) and the backend factory + graphics_system!" (src/xenia/emulator.cc:479-490). Windows defaults to + gpu = "d3d12" (src/xenia/emulator.cc:148) and the backend factory only falls back when D3D12GraphicsSystem::IsAvailable() is false, which tests the D3D12 API itself, not the redistributable. Taken from bin/x64/dxil.dll in dxc_2026_05_27.zip of DirectXShaderCompiler release @@ -180,7 +197,7 @@ files: system: microsoft-xbox-360 required: true description: "DirectX 12 Agility SDK 1.619.3 runtime" - source_ref: "src/xenia/ui/d3d12/d3d12_provider.cc:293-305, src/xenia/ui/windowed_app_main_win.cc:28-31, src/xenia/ui/redist_installer_wx.cc:88-94, 123-126, src/xenia/ui/redist_installer_wx.cc:627-672" + source_ref: "src/xenia/ui/d3d12/d3d12_provider.cc:293-305, src/xenia/ui/windowed_app_main_win.cc:28-31, src/xenia/ui/redist_installer_wx.cc:86-92, 121-124, src/xenia/ui/redist_installer_wx.cc:524-569" note: >- The binary exports D3D12SDKVersion 619 and D3D12SDKPath ".\D3D12\", so d3d12.dll loads it at the first device creation. The provider checks for @@ -197,7 +214,7 @@ files: system: microsoft-xbox-360 required: false description: "Direct3D 12 debug layer from Agility SDK 1.619.3" - source_ref: "src/xenia/ui/d3d12/d3d12_provider.cc:326-363, src/xenia/ui/redist_installer_wx.cc:127-134, src/xenia/ui/redist_installer_wx.cc:674-719" + source_ref: "src/xenia/ui/d3d12/d3d12_provider.cc:326-363, src/xenia/ui/redist_installer_wx.cc:125-132, src/xenia/ui/redist_installer_wx.cc:571-616" note: >- Reached only when d3d12_debug is set, which defaults false (src/xenia/ui/d3d12/d3d12_provider.cc:23). Fetching it re-extracts D3D12Core.dll alongside, @@ -212,7 +229,7 @@ files: system: microsoft-xbox-360 required: false description: "Khronos Vulkan loader 1.4.350.0 for the Vulkan backend on Windows" - source_ref: "src/xenia/ui/vulkan/vulkan_instance.cc:84-99, src/xenia/ui/redist_installer_wx.cc:96-106, 138-142, src/xenia/ui/redist_installer_wx.cc:721-761" + source_ref: "src/xenia/ui/vulkan/vulkan_instance.cc:84-99, src/xenia/ui/redist_installer_wx.cc:94-104, 136-140, src/xenia/ui/redist_installer_wx.cc:618-658" note: >- Read only when the Vulkan backend is selected, and the plain-name load that follows finds the copy GPU drivers install system-wide, so the folder @@ -230,7 +247,7 @@ files: required: false validation: [signature] description: "Microsoft Visual C++ 2015-2022 redistributable installer" - source_ref: "src/xenia/app/xenia_main.cc:555-559, src/xenia/ui/redist_installer_wx.cc:144-172, src/xenia/ui/redist_installer_wx.cc:373-403, src/xenia/ui/redist_installer_wx.cc:763-872" + source_ref: "src/xenia/app/xenia_main.cc:560-564, src/xenia/ui/redist_installer_wx.cc:142-170, src/xenia/ui/redist_installer_wx.cc:280-310, src/xenia/ui/redist_installer_wx.cc:660-769" note: >- Not loaded by the emulator. The runtime version is read from HKLM\SOFTWARE\Microsoft\VisualStudio\14.0\VC\Runtimes\x64, and when it is @@ -240,6 +257,50 @@ files: the binary actually links is vcruntime140 and msvcp140, resolved by the OS loader. vc_redist.arm64.exe on ARM64 builds. + # -- System files, dashboard and indie games -- + + - name: "SystemUpdate_17559_USB.zip" + mode: standalone + path: "system/download/SystemUpdate_17559_USB.zip" + system: microsoft-xbox-360 + required: false + size: 115992188 + sha256: "38885a3ab6b9854fb4fa31d5ddf21a4fddfd4cfb25e219060cfb0c2fb31f208f" + description: "Xbox 360 USB system update 17559" + source_ref: "src/xenia/ui/system_files_installer_wx.cc:47-63, src/xenia/ui/system_files_installer_wx.cc:341-382, src/xenia/ui/system_files_installer_wx.cc:384-499" + note: >- + Download && Install fetches it from download.microsoft.com and keeps it + only when its SHA-256 matches, and a file already there at this size is + reused. Select File installs any USB system update zip whose + system.manifest reads. The install writes system/flash, system/sysext and + an empty system/sysaux, replacing what is there. + + - name: "system/flash/" + type: directory + path: "Xenia-Edge/system/flash/" + standalone_path: "system/flash/" + system: microsoft-xbox-360 + required: false + description: "Flash partition of an installed system update: dash.xex, bootanim.xex, xam.xex and the system fonts" + source_ref: "src/xenia/emulator.cc:2657-2677, src/xenia/emulator.cc:2551-2560, src/xenia/app/emulator_window.cc:2027-2033" + note: >- + Mounted as \Device\Flash when the folder exists. Without it the + dashboard and the boot animation are unavailable and system titles fall + back to their own folder. + + - name: "system/sysext/" + type: directory + path: "Xenia-Edge/system/sysext/" + standalone_path: "system/sysext/" + system: microsoft-xbox-360 + required: false + description: "System extended partition of an installed system update, with system.manifest and xna_titlelauncher.xex" + source_ref: "src/xenia/emulator.cc:2657-2677, src/xenia/emulator.cc:1109-1157" + note: >- + Mounted as \Device\Harddisk0\SystemExtPartition when the folder exists. + Indie games run through the xna_titlelauncher.xex system.manifest locates + here and do not start without it. + # -- XeFu, original Xbox games -- - name: "xbox.xex" @@ -248,7 +309,7 @@ files: system: microsoft-xbox required: true description: "XeFu launcher from the Compatibility folder of an Xbox 360 hard drive" - source_ref: "src/xenia/emulator.cc:160-165, src/xenia/emulator.cc:886-899" + source_ref: "src/xenia/emulator.cc:180-185, src/xenia/emulator.cc:1067-1080" note: >- Every original Xbox game starts through it, and it picks the XeFu build for the game as the console does. Tested with is_regular_file only. The @@ -262,7 +323,7 @@ files: system: microsoft-xbox required: true description: "Compatibility folder of an Xbox 360 hard drive: xbox.xex, the xefu*.xex builds and xefutitle*.xex" - source_ref: "src/xenia/emulator.cc:2301-2310, src/xenia/emulator.cc:2336-2350, src/xenia/cpu/xex_module.cc:995-1019, src/xenia/cpu/xex_module.cc:1118-1143" + source_ref: "src/xenia/emulator.cc:2718-2727, src/xenia/emulator.cc:2757-2787, src/xenia/cpu/xex_module.cc:1035-1059, src/xenia/cpu/xex_module.cc:1162-1187" note: >- Mounted as \Device\Harddisk0\SystemPartition\Compatibility, where XeFu also writes its config.bin. xefu2019.xex and the xefu2021 builds import