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.
This commit is contained in:
Abdessamad Derraz committed 2026-10-23 16:37:06 +02:00
1 parent 595c0ea898
commit 0e6026dd9c
1 file changed
+68 -26
+68 -26
View File
@@ -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/<title id>/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.