libultraship's Vulkan backend allocated a new command buffer for each framebuffer every frame and only ever reset the pool. The driver resets every buffer the pool has ever handed out, so each frame cost a little more than the last and the game slowed down over ten minutes or so. Each frame slot now keeps its command buffers and hands them out again after the reset. contentVersion 01.000.001 (v1.0.1). Claude-Session: https://claude.ai/code/session_01AHL38DtcnG4fAd7y1YiWfc
Mario 64 for PlayStation 5
A PS5 homebrew port of Ghostship (v3.0.0), HarbourMasters' native port of the 1996 Nintendo 64 game, compiled from its decompilation on libultraship. On the console it draws through libultraship's Vulkan renderer on RADV, from the PS5 Vulkan stack.
The build reads no ROM and holds no game data. The player copies their own ROM beside the title, and the title converts it once, on the console.
Status
Runs on the console. First run on 2026-10-12 on a PS5 at 3840x2160: the title screen, the file select, a new game and the castle grounds, at a measured 60 images a second (frame interpolation; the game's logic stays at 30).
| Area | State |
|---|---|
| Game data | A US or JP .z64 in the title's folder is found on the first start and converted to sm64.o2r in a few seconds. With neither file the title says what to copy where and closes |
| Picture | 3840x2160 on a 4K output, 16:9 |
| 60 fps | Measured at 3840x2160 on the title screen and the castle grounds |
| Menu | The touch pad's click opens Ghostship's settings menu. L1/R1 change tab, L2/R2 change section, the d-pad and Cross work the settings, Options asks to quit. The controls are listed along the bottom of the screen |
| HD textures | SM64 Reloaded seen working on the console |
| Saves, settings | /data/homebrew/PPSA99310/userdata/ |
| DevLoop | devloop-shot in the title's folder (registered as ghostship) |
| Art | The icon and background are the port's own, made with an image generator (ps5/art/) |
Controls are Ghostship's defaults for a pad: left stick to move, Cross A, Circle B, L2 Z, R2 R, L1 L, Options START, the right stick for the C buttons. They can be changed in the menu under Settings, Controls.
Install
Download Mario64-PS5-vX.Y.zip from the
latest release and
unpack it: it holds one folder, PPSA99310. (Or build that folder yourself, see
Build.) It contains no game data.
What the console needs
- A PS5 that runs homebrew, with etaHEN (or an equivalent) loaded.
- ShadowMountPlus, which shows the folders in
/data/homebrewas titles on the home screen. - An FTP server on the console to copy files with (port 2121 here).
Steps
-
Copy the whole folder
PPSA99310to the console as/data/homebrew/PPSA99310/, so that you have:/data/homebrew/PPSA99310/eboot.bin /data/homebrew/PPSA99310/ghostship.o2r /data/homebrew/PPSA99310/config.yml /data/homebrew/PPSA99310/assets/ (what the ROM's conversion reads) /data/homebrew/PPSA99310/sce_sys/ (param.json, icon0.png, pic0.dds, pic1.dds) /data/homebrew/PPSA99310/sce_module/libc.prx /data/homebrew/PPSA99310/licenses/Copy
sce_sys/icon0.pngwith the first upload: ShadowMountPlus will not register a title without its icon. -
Copy your own Super Mario 64 ROM into the same folder, beside
eboot.bin. It must be the Nintendo 64 game's US or JP release, in.z64format (big endian; convert a.n64or.v64dump first), under any name ending in.z64. The title checks the ROM against these hashes and takes no other:/data/homebrew/PPSA99310/baserom.us.z64Release SHA-1 US 9bef1128717f958171a4afac3ed78ee2bb4e86ceJP 8a20a5c83d6ceb0f0506cfc9fa20d8f438cafe51 -
Wait a few seconds for "Mario 64" to appear on the home screen, and start it.
-
The first start says "ROM found" and asks whether to generate the game files: press Cross. It takes a few seconds, and the game starts. The ROM is not needed again and can be deleted from the console.
If you already have an sm64.o2r made by Ghostship 3.0.0 on a PC, copy that
into the folder in place of the ROM.
If "Mario 64" does not appear on the home screen, look in
/data/shadowmount/debug.log. "AppInstallAll hook is no longer installed" means
ShadowMountPlus has to be restarted before it will register a new title.
HD textures (optional)
The port takes Ghostship texture packs unchanged. The one tried on the console is SM64 Reloaded by GhostlyDark:
- Project: https://github.com/GhostlyDark/SM64-Reloaded
- Downloads: https://github.com/GhostlyDark/SM64-Reloaded/releases/latest
1. Download the Ghostship version of the pack. On the releases page, take the
file whose name contains gs-o2r:
| File | Size | |
|---|---|---|
sm64-reloaded-v2.6.0-gs-o2r-hd.7z |
99 MB | HD; the one used on the console |
sm64-reloaded-v2.6.0-gs-o2r-4k.7z |
618 MB | 4K |
The other files on that page are for emulators and other ports and will not work.
2. Unpack it. It holds one .o2r file, for example
SM64_Reloaded_v2.6.0_HD.o2r (547 MB).
3. Copy the .o2r to the console's mods folder:
/data/homebrew/PPSA99310/userdata/mods/SM64_Reloaded_v2.6.0_HD.o2r
The folder exists once the game has been started once.
4. Switch the pack on in the menu. Start the game, then:
- Press the touch pad to open the menu.
- Press R1 once, to the Enhancements tab.
- The Graphics section is the first one and is already selected (if another is, press L2 until Graphics is).
- Move down with the d-pad to Use Alternate Assets, under "Mods", and press Cross to tick it.
- Press the touch pad to close the menu.
The setting is remembered. Untick the same box to go back to the original textures. If the textures do not change when you tick the box, quit and start the game again.
Build
On Linux (on a Mac, in the Lima VM) with PS5_Vulkan, PS5_Mesa and PS5_PayloadSDK beside this folder.
ps5/tools/vm.sh build # from macOS; ps5/tools/build.sh inside the VM
ps5/tools/vm.sh assets # ghostship.o2r, Ghostship's own assets, into dist/
ps5/tools/vm.sh deploy
ps5/tools/vm.sh run
build.sh runs setup-source.sh first, which applies the console's changes to
vendor/ghostship and its two submodules from ps5/patches/ (every hunk behind
__PROSPERO__ or PS5). While changing anything under vendor/, run
ps5/tools/setup-source.sh --save before a build.
ps5/tools/vm.sh assets ROM.z64 also makes sm64.o2r on this machine, into the
ignored game/ folder, and ps5/tools/vm.sh console-files uploads it: the
quicker loop while developing.
What the console needed:
- SDL2. libultraship is written for SDL2;
ps5/sdl/holds SDL2 video, audio and pad drivers for the console (ps5/patches/sdl.patchregisters them). - Vulkan with no loader. RADV is linked into the title, so libultraship's Vulkan renderer and Dear ImGui's reach it through volk. OpenGL is compiled out.
- shaderc, built from source: the renderer writes its shaders as GLSL at run time.
- No working directory. A title cannot
chdir,getcwdorrealpath;ps5/src/shims.canswers the last two forstd::filesystem. - The log. A flush for every line made the ROM's conversion take twenty minutes; errors are flushed at once, the rest every two seconds.
- The menu with a pad alone: see Status.
GHOSTSHIP_PS5_FPS=1 in /data/homebrew/PPSA99310/env.txt writes the frame
rate to the console's log every ten seconds.
Licence
GPL-3.0 for the repository as a whole and for a built title: see
LICENSING.md. No game data is stored here or built in.
"Mario" and "Super Mario 64" are Nintendo's; this project is not affiliated with
Nintendo, HarbourMasters or Sony Interactive Entertainment.