One of the big things everyone has been wondering about Citra is when it will be able to render games at HD resolutions. One of the great things about emulators is that they can surpass the limitations of the original console, especially when it comes to graphical fidelity. With the 3DS specifically, many beautifully detailed games are hidden behind staggeringly low resolution screens topping out at 400x240. With Texture Forwarding (from tfarley, based on yuriks early implementation), Citra can now output games at any resolution, and runs faster as well!
What is Texture Forwarding?
To understand Texture Forwarding, we’ve created a diagram to show what’s actually going on.
The diagram is a simplified representation of the actual pipeline, as 3DS games perform multiple additional steps such as framebuffer copies between rendering and display - but the concept remains the same. The main idea is to keep framebuffers rendered by the HW Renderer as textures on the GPU as much as possible, to avoid the performance overhead of transferring them between the CPU and GPU as in the Slow Path. In most instances, the CPU never accesses (reads from/writes to) a rendered frame so it can safely stay on the GPU from rendering all the way through to ultimate display in Citra. This eliminates CPU/GPU sync points and makes the emulator faster overall.
In addition to a performance boost, Texture Forwarding also allows the HW Renderer to render and display at higher resolutions than the native 3DS when the pixel data is not accessed from anywhere else. But in the event that the memory region of some texture is read or written by the CPU, the renderer will fall back to the slow path and downsample the texture back to native resolution to ensure that the accesses are reflected accurately.
If you’re interested in seeing just how nice some 3DS games look, HD screenshots have been added to Citra’s screenshots page! Or you can try it yourself on your 3DS games by downloading the latest build of Citra from the download’s page.