Hi everyone,
I’d like to put an idea up for discussion and get feedback from the people who know these cores best.
The idea
A single Vulkan renderer per core with two modes:
• Original: reproduces the console's GPU behaviour 1:1 (rasterization, blending, dithering, framebuffer formats). This is the reference path.
• Enhanced: runs on top of the same pipeline and adds modern features: higher internal resolution, widescreen support, better texture filtering (e.g. bicubic) and texture replacement.
Core design rule
Everything the game can observe stays native in both modes: framebuffers in emulated VRAM/RDRAM, depth buffers, CPU readbacks. Enhanced only produces an additional high-res output for display. If the game reads the framebuffer back, it always gets the native version. This way enhancements can never break game logic, and savestates and netplay stay compatible between modes.
Technical baseline
• Vulkan 1.3 only, plus a small explicit list of required features, checked at startup with a clear error message
• Compute shaders as the core of the Original mode, similar to paraLLEl-RDP, for bit-exact behaviour across GPU vendors
• No new software or OpenGL renderers. Existing software renderers would stay as test oracles during development, not as user options.
• A shared foundation (device setup, memory, shader cache, output, texture-replacement cache, filters, HDR) that all cores could use, with only the hardware-specific parts written per console
Building on existing work
This isn’t meant to replace what’s already there. A lot of the pieces exist:
• paraLLEl-RDP shows that an accurate compute renderer with upscaling works
• parallel-dc already has a tile-based compute renderer, GPU-side RTT that only copies back when the game reads it, and a reference software renderer for testing
• Beetle PSX already has HD texture replacement with a solid caching system
Suggested start
Begin with one console only, Beetle PSX, as a proof of concept for the shared foundation and both modes. Then Dreamcast and N64, since much of the groundwork exists there. PS2 and Saturn would come last; I see those as the hardest, especially Saturn’s VDP1/VDP2.
Questions for you
1. Does this architecture make sense to you, or are there fundamental problems I'm missing?
2. Is Vulkan 1.3 a reasonable minimum, or does it exclude too many users?
3. Would it be better to build this inside the existing cores or as a separate shared project?
4. Is anyone already working on something similar?