* [Gpu] Astro Bot performance: 14 -> ~60 fps at the title scene - Defer RELEASE_MEM command-buffer flushes instead of submitting per packet - Resolve indexed indirect draws and dispatches on the GPU - Async buffer readbacks on a dedicated transfer/compute queue - Pool image backings, flip snapshots and tiler resources - One-frame command-stream run-ahead - Lock-free backed-range and image page-owner checks on CPU writes - Scalar value cache with generation-stamped reset; memoized invariant phis - Shader compiler: structured forward-only CFGs with function-scope registers, EXEC-full guard elision, bounded V_MOVREL offsets - Trivial-leaf import dispatch and strchr/strrchr fast paths - SHARPEMU_GUEST_REFRESH_RATE option * [Tests] Fix full-suite flaky tests - Red-zone patcher: when every fixed trampoline candidate is taken, look for any free host range within relative-jump reach (PhysicalVirtualMemory.EnumerateFreeHostRanges); the test places its image in a probed free hole - Kernel memory tests: probe a free PRT-area address instead of the fixed 0x1026C00000; the reservation-extent test only rejects picks inside the reservation - Release checks tolerate another thread reusing the freed range - Allocation tests measure on a dedicated thread and keep the least allocating of several rounds (AllocationMeasurement.SteadyState) * [Gpu] Astro Bot: structured loops, buffer slabs, pad motion - Shader: emit natural loops as structured SPIR-V loops (OpLoopMerge) instead of the block dispatcher, and merge SCC-uniform if/else joins as selects so descriptors picked on a branch stay evaluable per draw. - Shader: decode V_FFBH_I32 and V_MIN3_F16; read the DS GDS bit from bit 17 (GFX10) and route GDS append/consume through shared atomics. - Gpu: sub-allocate small device-local buffers from shared memory slabs. - Pad: report motion data by default (Astro Bot never imports scePadSetMotionSensorState), convert acceleration from m/s^2 to G, and add scePadResetOrientation / scePadSetAngularVelocityDeadbandState. * [CPU] Stop pinning guest threads to host cores by default Guest affinity packed Demon's Souls' 13 spinning BPE job workers onto 10 host lanes and put its renderer next to them at equal priority, so the renderer and lock holders waited out whole scheduler quanta. Intro 10.6 -> 44.7 fps, menus 11.6 -> 47.5 fps. SHARPEMU_GUEST_AFFINITY=1 restores pinning. * [Media] Convert host movie frames to YUV on the decoder thread The render thread converted every decoded Bink frame from BGRA back to YUV 4:2:0 (6.7 ms per frame). The decoder thread now produces the planes and the presenter uploads them as-is. PS Studios logo 33 -> ~50 fps, attract movie 44 -> 60 fps. * [Agc] Accept a zero destination in sceAgcDcbWriteData Demon's Souls emits WRITE_DATA with address 0 into a template and patches it after copying. Returning null made the title patch a relocated null pointer, which wrote a stack-derived value into its label and was then parsed as an unknown NOP marker (GPU FATAL). * [Loader] Patch short red-zone faulting accesses next to branches A faulting access shorter than a jump could not be relocated when followed by a branch or a branch target, so a handled fault let Windows overwrite the red zone. Spans may now end with a direct branch (run after the stack pointer is restored) or start up to three instructions earlier. Fixes a Demon's Souls crash after the new-game intro movie. * [GPU] Astro Bot rendering fixes: compute subgroups, DCC clears, PS inputs, texture MIN_LOD - Compute: pin non-emulated compute pipelines to a 32-lane subgroup (VK_EXT_subgroup_size_control) so wave64 groups other than 64 invocations keep lanes 32..63 active on AMD (striped froxel volume). - Shader translator: 64-bit AND for the wave32 S_*_SAVEEXEC_B64 mask. - PS inputs: slots that read one VS parameter share one host input; a smooth/flat slot next to a V_INTERP_MOV slot is rebuilt from the per-vertex values (black save cards, NaN normals, black props). - Render targets: drop unwritten color targets of depth passes from both the attachments and the pixel outputs, keeping locations aligned. - DCC: materialize pending zero fast clears before shader access so a later attachment bind does not wipe compute writes. - Textures: honour the T# MIN_LOD with VK_EXT_image_view_min_lod so streamed textures never sample unloaded mips (blown-out stadium sky). - Device: enable VK_KHR_maintenance5 for point lists without PointSize. * [Audio][GPU] ATRAC9 independent mono streams, BC storage fallback, 32-bit bit counts - LibAtrac9: decode config header 0x30 streams (PS5 ambisonics), where every channel is an independent mono stream interleaved frame by frame. - Images: when the driver refuses storage usage on a block-compressed image, compute writes go through an uncompressed replacement of the same memory. - SPIR-V: count 64-bit masks with two 32-bit OpBitCount, which Vulkan requires without maintenance9. - Agc: drop the indirect-draw emit debug log; report the draw modifier in the unsupported indirect draw error. * [GPU] Partial texture-pool uploads and cheaper per-draw preparation - A CPU write into a large layered texture (Demon's Souls' 256-layer BC3 pools) re-uploaded the whole image, ~750 ms of GPU detiling in one frame. Each (mip, layer) piece's guest bytes are hashed at upload; a refresh uploads only the pieces that changed. - Device-address preparation touched and checked every registered buffer for each dispatch. Recency touches now run once per retirement tick, and uploads only visit buffers in blocks the tracker does not know to be clean; hot pages stay dirty, so they are still re-uploaded every time. - Resource materialization cache: when the only changed words are ones the flattened table alone reads (per-frame inline constants), only the table is evaluated again. - A full batch no longer splits an open render pass before 512 draws. - Lock-free lookups for shader headers, device format properties and the idle host movie bridge; the SPIR-V dump toggle is read once per program cache. * Demon soul - fix texture * Delete runahead tests * Screcrow fix for nvidia GPU |
||
|---|---|---|
| .github | ||
| LICENSES | ||
| assets/images | ||
| docs | ||
| scripts | ||
| src | ||
| tests | ||
| tools | ||
| .editorconfig | ||
| .gitignore | ||
| CONTRIBUTING.md | ||
| Directory.Build.props | ||
| Directory.Packages.props | ||
| LICENSE.txt | ||
| README.md | ||
| REUSE.toml | ||
| SharpEmu.slnx | ||
| global.json | ||
| nuget.config | ||
README.md
SharpEmu
An experimental PlayStation 5 emulator for Windows, Linux and macOS.
Join our official Discord server for development updates, compatibility discussions, support, and community chat.
[!NOTE]
SharpEmu supports Windows x64, Linux x64, and macOS x64. Apple Silicon Macs can run the macOS x64 build through Rosetta 2, and Windows on ARM devices (e.g. Snapdragon) can run the Windows x64 build through Windows' built-in x64 emulation.
[!WARNING]
SharpEmu is an experimental PS5 emulator developed from scratch in C#. The current focus is on accuracy and infrastructure setup rather than game-specific compatibility.
Info
SharpEmu is an emulator project currently in its early stages of development.
This project is developed purely for research and educational purposes. There are no commercial goals associated with it. We enjoy learning about system architecture and reverse engineering.
SharpEmu focuses exclusively on the PlayStation 5.
Our goal is not to emulate PS4 games, as there is already an excellent emulator dedicated to that platform: ShadPS4.
Games Tested
| Demons Souls Remake | Tomb Raider V Remastered |
|---|---|
![]() |
![]() |
| Hades | Dead Cells |
|---|---|
![]() |
![]() |
| PAC-MAN World Re-PAC | Cult of the Lamb |
|---|---|
![]() |
![]() |
Status
The emulator can currently load the eboot.bin of real games, execute native CPU instructions, and partially handle gpu-related functionality. Included 3D games.
SharpEmu supports Windows, Linux, and macOS hosts. Video output uses Vulkan on Windows and Linux, and MoltenVK on macOS. Platform support is still experimental, so compatibility and performance vary by game, operating system, and GPU driver.
Using
Download the release archive for your operating system, extract it, and launch
SharpEmu with the path to a legally obtained game's eboot.bin.
Or command line;
Windows PowerShell:
.\SharpEmu.exe "C:\path\to\game\eboot.bin" --log-to-file
Linux and macOS:
chmod +x ./SharpEmu
./SharpEmu "/path/to/game/eboot.bin" --log-to-file
SharpEmu supports environment variables that can be configured from the GUI. Undocumented variables are listed here: docs/sharpemu-gui-undocumented-env-vars.md
You can set them per game or globally in the GUI, or pass them directly through the CLI.
A Vulkan-capable GPU and current graphics driver are required. The macOS release includes the MoltenVK Vulkan implementation.
[!IMPORTANT]
This project does not support or condone piracy.
All games used during development and testing are dumped from consoles that we personally own.
Users are expected to use legally obtained copies of their games.
Build
- Install the .NET SDK version specified in
global.json. - Clone the repository:
git clone https://github.com/sharpemu/sharpemu.git - Open the solution file (
SharpEmu.slnx) in VSCode. - Build the project:
dotnet buildordotnet publish - Build artifacts will be located in the
artifactsdirectory.
Disclaimer
SharpEmu is an experimental emulator intended for research and educational purposes.
This project does not contain any copyrighted system firmware, game data, or proprietary PlayStation assets.
Special Thanks
The following projects were extremely helpful during development:
-
ShadPS4
Helped with understanding the basic architecture of the PlayStation 4. -
Kyty
One of the few PS5 emulator projects available and very useful for studying native code execution. -
Ryujinx
Provided valuable references for filesystem handling and low-level C# implementation patterns.
License
Support
Support SharpEmu via GitHub Sponsors or cryptocurrency. Every contribution helps fund ongoing development and long-term maintenance. GitHub Sponsors is the preferred way to support the project, but cryptocurrency donations are also appreciated.
ETH/USDT
0xF315F5d986c790bB3A58DbE60F1B2760997dEd82
BTC
bc1qmr9k8899njys5ny63xsues4jgmkk96erslrkmv
Contributing
Before opening an issue or pull request, please read our contribution guidelines:
The guide covers:
- Coding style and formatting
- AI-assisted contributions
- Pull request expectations
- Testing guidelines
- Legal and reverse engineering policy





