From 0e6026dd9cfbe9d6629912d017146adca1f1ecd9 Mon Sep 17 00:00:00 2001
From: Abdessamad Derraz <3028866+Abdess@users.noreply.github.com>
Date: Fri, 23 Oct 2026 16:11:12 +0200
Subject: [PATCH] feat: document xefu files for xenia-edge
Edge e569a1a runs original Xbox games through XeFu (src/xenia/emulator.cc:748-768, 882-895): xbox.xex and the xefu*.xex builds from an Xbox 360 Compatibility folder, read from xefu/ under the storage root. config.bin at emulator.cc:2339 is written by XeFu there. The libretro tree f23c14c carries the same code. Refs recaled to e569a1a.
---
emulators/xenia-edge.yml | 94 +++++++++++++++++++++++++++++-----------
1 file changed, 68 insertions(+), 26 deletions(-)
diff --git a/emulators/xenia-edge.yml b/emulators/xenia-edge.yml
index 5a3057ee..257dde50 100644
--- a/emulators/xenia-edge.yml
+++ b/emulators/xenia-edge.yml
@@ -6,9 +6,9 @@ source:
libretro: "https://git.libretro.com/libretro/xenia-libretro"
upstream: "https://github.com/has207/xenia-edge"
source_commit:
- standalone: "fb1c5bf08b16dab5422136c44c593a9f516750f0"
- libretro: "552d508a563dec9a6d05042654de9f76f00e9ba5"
-profiled_date: "2026-10-17"
+ standalone: "e569a1aa15632e957fc2adc3bfc875de51f79eab"
+ libretro: "f23c14c717ef274516f29c9b5e97d6a9db28643d"
+profiled_date: "2026-10-23"
core_version:
standalone: "edge"
libretro: "8dc77b0"
@@ -18,6 +18,7 @@ cores:
- "xenia_edge"
systems:
- microsoft-xbox-360
+ - microsoft-xbox
notes: |
Xbox 360 emulator forked from Xenia Canary, with a wxWidgets front end, a
@@ -43,8 +44,8 @@ notes: |
(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). It reads no firmware, font or runtime from
- disk. Vulkan comes from the frontend's instance
+ (libretro/libretro.cpp:791-798). 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
@@ -55,46 +56,55 @@ notes: |
points d3d12_runtime_path at that folder, where the D3D12 provider loads it
by full path (libretro/libretro.cpp:1437-1462, 1552-1559).
- No Xbox 360 system file is read. xboxkrnl, xam and xbdm are C++ HLE modules
- registered at startup (src/xenia/emulator.cc:395-404), the XEX2 retail and devkit AES
- keys are constant arrays in the binary (src/xenia/cpu/xex_module.cc:67-72), and every
+ 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
XConfig setting is synthesised from cvars and constants by BuildSetting
rather than read from a flash image (src/xenia/kernel/xconfig.cc:87-246, 259-272). 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:777-792). That is a
+ 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.
+ 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
+ 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
+ launch fails, the folder is created and the window names the missing file
+ (src/xenia/emulator.cc:882-895, src/xenia/app/emulator_window.cc:1975-1985).
+
The fork's data ships inside the executable. assets/font/Inter-VariableFont
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).
The UI font is read from that buffer with AddFontFromMemoryTTF
- (src/xenia/ui/imgui_drawer.cc:374-384), and xe::EmbeddedBundle decodes the SDL controller
+ (src/xenia/ui/imgui_drawer.cc:375-385), 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).
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
- (src/xenia/ui/imgui_drawer.cc:39-44, 360-393), mappings_file to the embedded controller DB
+ (src/xenia/ui/imgui_drawer.cc:39-44, 361-394), mappings_file to the embedded controller DB
(src/xenia/hid/sdl/sdl_input_driver.cc:36-39, 237-241), achievement_sound_path leaves the
- achievement sound silent (src/xenia/ui/audio_helper.cc:21-24, 38-52). For glyphs the
+ achievement sound silent (src/xenia/ui/audio_helper.cc:21-24, 38-53). For glyphs the
embedded font lacks, the host font comes from the OS: tahoma.ttf and
msgothic.ttc out of the Windows fonts folder, or the fontconfig sans-serif and
- CJK matches on Linux (src/xenia/ui/imgui_drawer.cc:395-477, 479-563).
+ CJK matches on Linux (src/xenia/ui/imgui_drawer.cc:396-479, 481-565).
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:45-48),
- patches/*.patch.toml read on top of the embedded set (src/xenia/emulator.cc:390,
+ 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),
plugins/
/plugins.toml behind allow_plugins,
- which defaults false (src/xenia/patcher/plugin_loader.cc:16-38, 58-72), content
- (src/xenia/app/xenia_main.cc:563-566), scratch, cache0, cache1, cache and mu
- (src/xenia/emulator.cc:1479-1547). portable.txt next to the executable
+ 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:1651-1719). portable.txt next to the executable
keeps the storage root there instead of the user folder
- (src/xenia/app/xenia_main.cc:524-538).
+ (src/xenia/app/xenia_main.cc:533-547).
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
@@ -117,7 +127,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:114-122, 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:582-614"
+ 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"
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
@@ -125,8 +135,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:435-446). Windows defaults to
- gpu = "d3d12" (src/xenia/emulator.cc:119) and the backend factory
+ graphics_system!" (src/xenia/emulator.cc:456-467). Windows defaults to
+ gpu = "d3d12" (src/xenia/emulator.cc:128) 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
@@ -142,7 +152,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:25-28, src/xenia/ui/redist_installer_wx.cc:88-94, 123-126, src/xenia/ui/redist_installer_wx.cc:623-668"
+ 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"
note: >-
The binary exports D3D12SDKVersion 619 and D3D12SDKPath ".\D3D12\", so
d3d12.dll loads it at the first device creation. The provider checks for
@@ -159,7 +169,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:670-715"
+ 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"
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,
@@ -174,7 +184,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:717-756"
+ 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"
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
@@ -192,7 +202,7 @@ files:
required: false
validation: [signature]
description: "Microsoft Visual C++ 2015-2022 redistributable installer"
- source_ref: "src/xenia/app/xenia_main.cc:546-550, 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:758-867"
+ 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"
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
@@ -201,3 +211,35 @@ files:
"/install /passive /norestart", after which the process relaunches. What
the binary actually links is vcruntime140 and msvcp140, resolved by the OS
loader. vc_redist.arm64.exe on ARM64 builds.
+
+ # -- XeFu, original Xbox games --
+
+ - name: "xbox.xex"
+ path: "Xenia-Edge/xefu/xbox.xex"
+ standalone_path: "xefu/xbox.xex"
+ 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:882-895"
+ 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
+ xefu_launcher cvar can name a XeFu build in its place, which then runs
+ every game.
+
+ - name: "xefu/"
+ type: directory
+ path: "Xenia-Edge/xefu/"
+ standalone_path: "xefu/"
+ 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:2297-2306, src/xenia/emulator.cc:2332-2346, src/xenia/cpu/xex_module.cc:995-1019, src/xenia/cpu/xex_module.cc:1118-1143"
+ note: >-
+ Mounted as \Device\Harddisk0\SystemPartition\Compatibility, where XeFu
+ also writes its config.bin. xefu2019.xex and the xefu2021 builds import
+ xefutitle.xex, looked up first beside the build as xefutitle followed by
+ the build's suffix, then by that suffix without its trailing letters
+ (xefutitle2021.xex for xefu2021c.xex), then as xefutitle.xex. A build
+ whose imports are missing fails to launch and the missing name is
+ reported.