Skip to content

Xenia Edge - RetroBIOS

Type standalone
Classification Community forks
Source https://github.com/has207/xenia-edge
Version edge
Profiled 2026-08-10
Cores xenia-edge
Systems microsoft-xbox-360
Technical notes

Xbox 360 emulator forked from Xenia Canary, with a wxWidgets front end, a game library, and Direct3D 12, Vulkan and Metal backends. Releases are tagged by short commit on the edge branch and ship as xenia_edge_linux.AppImage, xenia_edge_macos.dmg and xenia_edge_windows.zip. ES-DE finds it through the XENIA-EDGE rule and runs xenia_edge <rom>; RetroDECK unpacks the AppImage into a xenia-edge component and executes bin/xenia_edge.

No Xbox 360 system file is read. xboxkrnl, xam and xbdm are C++ HLE modules registered at startup (emulator.cc:388-397), the XEX2 retail and devkit AES keys are constant arrays in the binary (xex_module.cc:58-63), and every XConfig setting is synthesised from cvars and constants by BuildSetting rather than read from a flash image (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 (emulator.cc:718-733); that is a companion module inside the dump the user launched, not a host-side lookup.

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 (imgui_drawer.cc:367-377), and xe::EmbeddedBundle decodes the SDL controller mappings (sdl_input_driver.cc:148-165), the canary game patches (patch_db.cc:304-310), the game-compatibility master.json (game_compat_db.cc:47-58) and the x360db games.json (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 (imgui_drawer.cc:39-44, 353-386), mappings_file to the embedded controller DB (sdl_input_driver.cc:35-38, 148-152), achievement_sound_path leaves the achievement sound silent (audio_helper.cc:21-24, 38-52). 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 (imgui_drawer.cc:388-470, 472-556).

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 (config.cc:43-46), patches/*.patch.toml read on top of the embedded set (emulator.cc:383, patch_db.cc:34-58), plugins//plugins.toml behind allow_plugins, which defaults false (plugin_loader.cc:16-38, 58-72), content, cache0, cache1, scratch and mu (emulator.cc:1412-1471). portable.txt next to the executable keeps the storage root there instead of the user folder (src/xenia/app/xenia_main.cc:556-570).</p> <p>On Windows the Direct3D 12 and Vulkan runtimes are not in the release zip, which holds only the build output (.github/workflows/build.yml:416-426). 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 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 builds need none of them: MoltenVK is statically linked and the Vulkan loader comes from the system (src/xenia/ui/vulkan/vulkan_instance.cc:66-72, 81-83).</p> </details> <p><strong>6 files</strong> | 3 required, 3 optional | 6 in repo, 0 missing</p> <div class="rb-file-entry rb-file-entry-required"> <p><strong><code>dxcompiler.dll</code></strong> <span class="rb-badge rb-badge-danger">required</span> <span class="rb-badge rb-badge-success">in repo</span> <br>DirectX Shader Compiler 1.9.2602.24, DXIL compilation for the Direct3D 12 backend</p> <ul> <li>Path: <code>D3D12/dxcompiler.dll</code></li> <li>System: microsoft-xbox-360</li> <li>Source: <a href="https://github.com/has207/xenia-edge/blob/2fe66280ac26502261414703bc7187b77dacc8d3/src/xenia/ui/d3d12/d3d12_provider.cc#L279-L322"><code>src/xenia/ui/d3d12/d3d12_provider.cc:279-322</code></a>, <a href="https://github.com/has207/xenia-edge/blob/2fe66280ac26502261414703bc7187b77dacc8d3/src/xenia/gpu/d3d12/pipeline_cache.cc#L121-L134"><code>src/xenia/gpu/d3d12/pipeline_cache.cc:121-134</code></a>, <a href="https://github.com/has207/xenia-edge/blob/2fe66280ac26502261414703bc7187b77dacc8d3/src/xenia/ui/redist_installer_wx.cc#L79-L85"><code>src/xenia/ui/redist_installer_wx.cc:79-85</code></a>, <a href="https://github.com/has207/xenia-edge/blob/2fe66280ac26502261414703bc7187b77dacc8d3/src/xenia/ui/redist_installer_wx.cc#L119-L122"><code>src/xenia/ui/redist_installer_wx.cc:119-122</code></a>, <a href="https://github.com/has207/xenia-edge/blob/2fe66280ac26502261414703bc7187b77dacc8d3/src/xenia/ui/redist_installer_wx.cc#L594-L629"><code>src/xenia/ui/redist_installer_wx.cc:594-629</code></a></li> <li>Loaded by full path from the D3D12 folder next to the executable, then by plain name from the system search path. PipelineCache::Initialize returns false without it because guest and system shaders are all DXIL, and that failure propagates to "Failed to setup graphics_system!" (emulator.cc:430-435). Windows defaults to gpu = "d3d12" (src/xenia/app/xenia_main.cc:70) 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/dxcompiler.dll in dxc_2026_05_27.zip of DirectXShaderCompiler release v1.9.2602.24, pinned at sha256 cf658aacf070d3045e31b8f1f8a696c2945f37c1095019481ef7c513368db3b4; bin/arm64 on ARM64 builds.</li> </ul> </div> <div class="rb-file-entry rb-file-entry-required"> <p><strong><code>dxil.dll</code></strong> <span class="rb-badge rb-badge-danger">required</span> <span class="rb-badge rb-badge-success">in repo</span> <br>DXIL signing and validation library shipped with DirectX Shader Compiler 1.9.2602.24</p> <ul> <li>Path: <code>D3D12/dxil.dll</code></li> <li>System: microsoft-xbox-360</li> <li>Source: <a href="https://github.com/has207/xenia-edge/blob/2fe66280ac26502261414703bc7187b77dacc8d3/src/xenia/ui/d3d12/d3d12_provider.cc#L286-L292"><code>src/xenia/ui/d3d12/d3d12_provider.cc:286-292</code></a>, <a href="https://github.com/has207/xenia-edge/blob/2fe66280ac26502261414703bc7187b77dacc8d3/src/xenia/gpu/d3d12/spirv_to_dxil_compiler.cc#L154-L169"><code>src/xenia/gpu/d3d12/spirv_to_dxil_compiler.cc:154-169</code></a>, <a href="https://github.com/has207/xenia-edge/blob/2fe66280ac26502261414703bc7187b77dacc8d3/src/xenia/gpu/d3d12/spirv_to_dxil_compiler.cc#L194-L200"><code>src/xenia/gpu/d3d12/spirv_to_dxil_compiler.cc:194-200</code></a>, <a href="https://github.com/has207/xenia-edge/blob/2fe66280ac26502261414703bc7187b77dacc8d3/src/xenia/ui/redist_installer_wx.cc#L79-L85"><code>src/xenia/ui/redist_installer_wx.cc:79-85</code></a>, <a href="https://github.com/has207/xenia-edge/blob/2fe66280ac26502261414703bc7187b77dacc8d3/src/xenia/ui/redist_installer_wx.cc#L119-L122"><code>src/xenia/ui/redist_installer_wx.cc:119-122</code></a></li> <li>Preloaded by full path so dxcompiler's own plain-name load resolves to it and the DXIL leaves signed; spirv_to_dxil queries its validator version to stamp the container the validator will accept. Same archive and pin as dxcompiler.dll, from bin/x64 or bin/arm64.</li> </ul> </div> <div class="rb-file-entry rb-file-entry-required"> <p><strong><code>D3D12Core.dll</code></strong> <span class="rb-badge rb-badge-danger">required</span> <span class="rb-badge rb-badge-success">in repo</span> <br>DirectX 12 Agility SDK 1.619.3 runtime</p> <ul> <li>Path: <code>D3D12/D3D12Core.dll</code></li> <li>System: microsoft-xbox-360</li> <li>Source: <a href="https://github.com/has207/xenia-edge/blob/2fe66280ac26502261414703bc7187b77dacc8d3/src/xenia/ui/d3d12/d3d12_provider.cc#L325-L336"><code>src/xenia/ui/d3d12/d3d12_provider.cc:325-336</code></a>, <a href="https://github.com/has207/xenia-edge/blob/2fe66280ac26502261414703bc7187b77dacc8d3/src/xenia/ui/windowed_app_main_win.cc#L25-L28"><code>src/xenia/ui/windowed_app_main_win.cc:25-28</code></a>, <a href="https://github.com/has207/xenia-edge/blob/2fe66280ac26502261414703bc7187b77dacc8d3/src/xenia/ui/redist_installer_wx.cc#L87-L93"><code>src/xenia/ui/redist_installer_wx.cc:87-93</code></a>, <a href="https://github.com/has207/xenia-edge/blob/2fe66280ac26502261414703bc7187b77dacc8d3/src/xenia/ui/redist_installer_wx.cc#L123-L126"><code>src/xenia/ui/redist_installer_wx.cc:123-126</code></a>, <a href="https://github.com/has207/xenia-edge/blob/2fe66280ac26502261414703bc7187b77dacc8d3/src/xenia/ui/redist_installer_wx.cc#L631-L676"><code>src/xenia/ui/redist_installer_wx.cc:631-676</code></a></li> <li>The binary exports D3D12SDKVersion 619 and D3D12SDKPath ".\D3D12\", so d3d12.dll loads it at the first device creation. The provider checks for it, offers the download, and returns false when it is still absent. Taken from build/native/bin/x64/D3D12Core.dll in the Microsoft.Direct3D.D3D12 1.619.3 NuGet package, pinned at sha256 43a7d5a3973812eb4b42623fae5275c790a005b8e48b8d7f5bb43cef39e073c5; build/native/bin/arm64 on ARM64 builds. The package version has to match the exported number.</li> </ul> </div> <div class="rb-file-entry rb-file-entry-optional"> <p><strong><code>D3D12SDKLayers.dll</code></strong> <span class="rb-badge rb-badge-muted">optional</span> <span class="rb-badge rb-badge-success">in repo</span> <br>Direct3D 12 debug layer from Agility SDK 1.619.3</p> <ul> <li>Path: <code>D3D12/D3D12SDKLayers.dll</code></li> <li>System: microsoft-xbox-360</li> <li>Source: <a href="https://github.com/has207/xenia-edge/blob/2fe66280ac26502261414703bc7187b77dacc8d3/src/xenia/ui/d3d12/d3d12_provider.cc#L357-L385"><code>src/xenia/ui/d3d12/d3d12_provider.cc:357-385</code></a>, <a href="https://github.com/has207/xenia-edge/blob/2fe66280ac26502261414703bc7187b77dacc8d3/src/xenia/ui/redist_installer_wx.cc#L127-L134"><code>src/xenia/ui/redist_installer_wx.cc:127-134</code></a>, <a href="https://github.com/has207/xenia-edge/blob/2fe66280ac26502261414703bc7187b77dacc8d3/src/xenia/ui/redist_installer_wx.cc#L678-L723"><code>src/xenia/ui/redist_installer_wx.cc:678-723</code></a></li> <li>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, since the debug layer only loads under the Agility runtime. Same NuGet package and pin as D3D12Core.dll.</li> </ul> </div> <div class="rb-file-entry rb-file-entry-optional"> <p><strong><code>vulkan-1.dll</code></strong> <span class="rb-badge rb-badge-muted">optional</span> <span class="rb-badge rb-badge-success">in repo</span> <br>Khronos Vulkan loader 1.4.350.0 for the Vulkan backend on Windows</p> <ul> <li>Path: <code>Vulkan/vulkan-1.dll</code></li> <li>System: microsoft-xbox-360</li> <li>Source: <a href="https://github.com/has207/xenia-edge/blob/2fe66280ac26502261414703bc7187b77dacc8d3/src/xenia/ui/vulkan/vulkan_instance.cc#L84-L99"><code>src/xenia/ui/vulkan/vulkan_instance.cc:84-99</code></a>, <a href="https://github.com/has207/xenia-edge/blob/2fe66280ac26502261414703bc7187b77dacc8d3/src/xenia/ui/redist_installer_wx.cc#L95-L105"><code>src/xenia/ui/redist_installer_wx.cc:95-105</code></a>, <a href="https://github.com/has207/xenia-edge/blob/2fe66280ac26502261414703bc7187b77dacc8d3/src/xenia/ui/redist_installer_wx.cc#L138-L142"><code>src/xenia/ui/redist_installer_wx.cc:138-142</code></a>, <a href="https://github.com/has207/xenia-edge/blob/2fe66280ac26502261414703bc7187b77dacc8d3/src/xenia/ui/redist_installer_wx.cc#L725-L764"><code>src/xenia/ui/redist_installer_wx.cc:725-764</code></a></li> <li>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 next to the executable is a fallback. Taken from VulkanRT-X64-1.4.350.0-Components/x64/vulkan-1.dll in LunarG's vulkan-runtime-components.zip 1.4.350.0, pinned at sha256 23ce69f32cef3e2799617e2b1776cd0c71030d23a91f8375821cc40d76b185b9. The zip carries x64 and x86 only, so the ARM64 build never offers the download.</li> </ul> </div> <div class="rb-file-entry rb-file-entry-optional"> <p><strong><code>vc_redist.x64.exe</code></strong> <span class="rb-badge rb-badge-muted">optional</span> <span class="rb-badge rb-badge-success">in repo</span> <br>Microsoft Visual C++ 2015-2022 redistributable installer</p> <ul> <li>System: microsoft-xbox-360</li> <li>Validation: signature</li> <li>Source: <a href="https://github.com/has207/xenia-edge/blob/2fe66280ac26502261414703bc7187b77dacc8d3/src/xenia/app/xenia_main.cc#L578-L582"><code>src/xenia/app/xenia_main.cc:578-582</code></a>, <a href="https://github.com/has207/xenia-edge/blob/2fe66280ac26502261414703bc7187b77dacc8d3/src/xenia/ui/redist_installer_wx.cc#L144-L172"><code>src/xenia/ui/redist_installer_wx.cc:144-172</code></a>, <a href="https://github.com/has207/xenia-edge/blob/2fe66280ac26502261414703bc7187b77dacc8d3/src/xenia/ui/redist_installer_wx.cc#L379-L409"><code>src/xenia/ui/redist_installer_wx.cc:379-409</code></a>, <a href="https://github.com/has207/xenia-edge/blob/2fe66280ac26502261414703bc7187b77dacc8d3/src/xenia/ui/redist_installer_wx.cc#L766-L875"><code>src/xenia/ui/redist_installer_wx.cc:766-875</code></a></li> <li>Not loaded by the emulator. The runtime version is read from HKLM\SOFTWARE\Microsoft\VisualStudio\14.0\VC\Runtimes\x64, and when it is older than 14.<_MSC_VER - 1900> clamped to 14.44 the installer is downloaded to %TEMP%\xenia_vc_redist.exe and run with "/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.</li> </ul> </div> <p><em>Generated on 2026-08-23T16:12:06Z</em></p> </article> </div> <script>var tabs=__md_get("__tabs");if(Array.isArray(tabs))e:for(var set of document.querySelectorAll(".tabbed-set")){var labels=set.querySelector(".tabbed-labels");for(var tab of tabs)for(var label of labels.getElementsByTagName("label"))if(label.innerText.trim()===tab){var input=document.getElementById(label.htmlFor);input.checked=!0;continue e}}</script> <script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script> </div> <button type="button" class="md-top md-icon" data-md-component="top" hidden> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M13 20h-2V8l-5.5 5.5-1.42-1.42L12 4.16l7.92 7.92-1.42 1.42L13 8z"/></svg> Back to top </button> </main> <footer class="md-footer"> <nav class="md-footer__inner md-grid" aria-label="Footer" > <a href="../xenia/" class="md-footer__link md-footer__link--prev" aria-label="Previous: Xenia Canary"> <div class="md-footer__button md-icon"> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11z"/></svg> </div> <div class="md-footer__title"> <span class="md-footer__direction"> Previous </span> <div class="md-ellipsis"> Xenia Canary </div> </div> </a> <a href="../xenios/" class="md-footer__link md-footer__link--next" aria-label="Next: XeniOS"> <div class="md-footer__title"> <span class="md-footer__direction"> Next </span> <div class="md-ellipsis"> XeniOS </div> </div> <div class="md-footer__button md-icon"> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M4 11v2h12l-5.5 5.5 1.42 1.42L19.84 12l-7.92-7.92L10.5 5.5 16 11z"/></svg> </div> </a> </nav> <div class="md-footer-meta md-typeset"> <div class="md-footer-meta__inner md-grid"> <div class="md-copyright"> <div class="md-copyright__highlight"> MIT for the tooling. BIOS and firmware files are third-party system software, preserved for personal backup, archival and interoperability. </div> Made with <a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener"> Material for MkDocs </a> </div> <div class="md-social"> <a href="https://github.com/Abdess/retrobios" target="_blank" rel="noopener" title="RetroBIOS on GitHub" class="md-social__link"> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path d="M173.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6m-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3m44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9M252.8 8C114.1 8 8 113.3 8 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C436.2 457.8 504 362.9 504 252 504 113.3 391.5 8 252.8 8M105.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1m-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7m32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1m-11.4-14.7c-1.6 1-1.6 3.6 0 5.9s4.3 3.3 5.6 2.3c1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2"/></svg> </a> </div> </div> </div> </footer> </div> <div class="md-dialog" data-md-component="dialog"> <div class="md-dialog__inner md-typeset"></div> </div> <div class="md-progress" data-md-component="progress" role="progressbar"></div> <script id="__config" type="application/json">{"annotate": null, "base": "../..", "features": ["navigation.instant", "navigation.instant.prefetch", "navigation.instant.progress", "navigation.tabs", "navigation.tabs.sticky", "navigation.sections", "navigation.top", "navigation.tracking", "navigation.indexes", "navigation.prune", "navigation.footer", "search.suggest", "search.highlight", "search.share", "content.code.copy", "content.tabs.link", "toc.follow"], "search": "../../assets/javascripts/workers/search.2c215733.min.js", "tags": null, "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version": "Select version"}, "version": null}</script> <script src="../../assets/javascripts/bundle.d7400e89.min.js"></script> <script src="../../javascripts/site.js"></script> </body> </html>