* [Gpu] Cover the whole tile plan when a buffer reads back an image TrySynchronizeBufferFromImage sized the copy from the mip layout, but the tile plan of a fully fitting image can extend past it; Silent Hill hit a 128x128 slice planned at the exact end of the mip chain and the tiler aborted the process. Grow the copy to the plan's tiled end when the buffer holds it, otherwise keep the guest bytes. * [SpirvTranslator] Read half-selected V_FMA_MIX literals as f16 op_sel_hi marks a V_FMA_MIX operand as f16 for literals too, but literals were always read as f32 bit patterns. Silent Hill's deferred lighting weights a luminance with the f16 literals 0x34CD/0x38B8/0x2F0A (0.30, 0.59, 0.11); as f32 denormals they made the luminance zero, the shader clamped it to 1e-4 and divided by it, and the title-menu scene came out thousands of times too bright, which auto exposure then turned black. * [Gpu] Materialize every fixed DCC clear code on a sampled image A DCC fast clear stays pending until the surface binds as a colour target; when a shader samples the surface first, only the clear-to-zero code was materialized. The other fixed codes (alpha 1, rgb 1, rgba 1) carry their own colour too. Silent Hill fast-clears UE's separate-translucency target to (0,0,0,1) and only samples it, so the post composite read stale zeros and the whole title-menu scene came out black. * [SpirvTranslator] Keep wave64 LDS phase barriers when a half-mask plan applies The half-mask plan's barriers order its own mask exchanges, not the program's shared-memory traffic, yet planning a program switched the LDS phase ordering off. UE's FFT bloom (wave64, 512 threads, LDS butterflies) then read half-written rows: Silent Hill's convolution output collapsed into a flat haze (max 56 for a scene peaking above 1500) and the histogram fed by it never adapted exposure. * [Gpu] Publish linear GPU-written images to guest memory by default Unreal reads its eye-adaptation result back on the CPU through a linear staging texture (FRHIGPUTextureReadback) and derives View.PreExposure from it. The image cache was built with linear readback disabled, so the CPU always read zeros, PreExposure stayed 1.0 and the scene rendered without pre-exposure. FFT bloom's bright-pixel prefilter, which works in pre-exposed space, then flattened every pixel to its max luma and the Silent Hill title menu came out nearly black. SHARPEMU_READBACK_LINEAR_IMAGES=0 restores the old behaviour. * [Tests] Enable MoltenVK portability devices in headless harness * [SpirvTranslator] Saturate V_CVT_PKRTZ_F16_F32 at 65504 instead of overflowing to infinity Rounding toward zero never produces infinity from a finite value: past the f16 range the result is +-65504. We truncated the mantissa and let packHalf2x16 round, so large values became infinite. Silent Hill's deferred lighting packs title-menu values past 65504; its height fog then multiplies scene color by a tiny transmittance, which keeps 65504 finite but leaves an infinity infinite, a later pass turns it into NaN and the whole 3D menu background renders black. Subnormal results now also keep whole 2^-24 steps. A MoltenVK device test covers overflow, truncation, subnormals, NaN and inf. * [Tests] Wait for the blocked worker before publishing its signal |
||
|---|---|---|
| .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.
[!IMPORTANT] Official channels: Only sharpemu.app and the links listed in this GitHub repository are affiliated with SharpEmu. Any other websites, accounts, or donation pages are unofficial and unauthorized.
[!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
| Demon's Souls Remake | ASTRO BOT |
|---|---|
![]() |
![]() |
| ASTRO's PLAYROOM | Dead Cells |
|---|---|
![]() |
![]() |
| God of War: Sons of Sparta | Tomb Raider V Remastered |
|---|---|
![]() |
![]() |
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





