Integer scaling

Is integer scaling possible? And if not, is it on the roadmap? From what Google turned up it seems like there’s an option there somewhere but I can’t see it (was wondering if it was removed at some point for some reason?). I’m running latest canary build for Windows (10 Home 64-bit).

In order for us to provide better support, we need to see the log generated by Citra. This guide will walk you through how you can obtain the log file: How to Upload the Log File.

Thanks Mr Bot but this isn’t that kind of support issue.

Unless I’m not understanding your question correctly, Integer Scaling has been in Citra for years.

Emulation > Configure > Graphics > Internal Resolution will allow you to set the scale. If the game looks too smooth, you’ll want to disable “Linear Filtering”

Yeah that’s not integer scaling - you’re increasing the internal render resolution (which is really nice for 3D stuff like Mario 3D Land with little in the way of 2D elements) but some games are a lot better left at native res (fixed-res backgrounds like Metroid or Mario Bros or UI-heavy games like Pokemon).

At native res though, we obviously don’t want a 1:1 pixel ratio on screen (it would be tiny) so each 3DS pixel with integer scaling is represented by a 2x2 block of actual pixels on screen, or 3x3, whatever fits on the monitor’s resolution.

Side-by-side the combined resolution of the 3DS displays is 720x240, so on a 1080p display that would double up (width and height) to 1440x480. However if the width is being stretched across the whole 1920 width then we’ve got nearest neighbor scaling and the corruption associated with that (how do you get the 3DS ‘pixels’ all the same size when 1920 doesn’t divide by 720?). You get most pixels doubled and the rest tripled and the result is ugly.

Anyone familiar with emulation of 2D-oriented systems like the SNES via Retroarch etc will tell you that integer scaling is the perfect solution for native res emulation of games with fixed res assets.

Well for anyone who gets what I’m talking about, here’s an effective (albeit inconvenient) workaround - for nVIDIA Windows users (AMD / Intel probably have a similar option) you just need to open up the nVIDIA control panel, go to a tab called something like “change desktop size or position” and choose to disable scaling from the three options (maintain aspect, full screen or no scaling).

Then drop your monitor resolution to anything with a width that is a multiple of 720 (for 1080p displays use 1440x900) and in your the settings on your actual monitor (via the physical buttons), disable scaling (the option might be called something like 1:1 ratio or 1:1 scaling). Then fire up Citra, load a game, hit F11 for full screen and voila - integer scaling, PITA edition!

Obviously this is assuming you’re using the side-by-side 3DS screen layout and native resolution. Hope that helps, and assuming I’m not just being stupid and not seeing the option, hopefully Citra devs will implement integer scaling (would be a lot more convenient than this workaround).

I wouldn’t hold your breath on that. Ofcourse, you’re more than welcome to contribute yourself to make it happen faster I guess.

Should I infer from that reply that development has been slowing down, or just that the devs have too much on their plates already?

Development was always a “feel free to contribute” kind of thing. So when devs have the will, time and energy to work om citra, they do. They also work on the stuff they want to work on. Therefore, the urgency in developing certain features, is also subject to the interest/skillset of the developers themselves.

Right now, with citra android being in it’s baby phase and citra desktop still having lots of bugs to work out, it just seems very unlikely that a dev would take an interest in making your request happen in a relatively short amount of time. So if you want something added in the near future, it’s best to work on it yourself. Hence why I said, “you’re more than welcome to contribute yourself”. You really are more than welcome xD.

Well I’m not much a coder (wouldn’t know where to begin to find the existing code that stretches the game to fit the screen, or how to edit the settings UI) and I’ve not contributed to an open source project before… but on the other hand, it sounds like fun! I might pull the source code and have a gander.

Do you mean the screens themselves are integer scaled? With that method, the top screen would be 800x480 and bottom screen 640x480 (both 2x native) using 1440x900 and side-by-side layout.

I assume it should be black borders all around.
image

If yes, you could setup custom layout to accomplish this.

e.g

custom_layout\default=false
custom_layout=true
custom_top_left\default=false
custom_top_left=240
custom_top_top\default=false
custom_top_top=300
custom_top_right\default=false
custom_top_right=1040
custom_top_bottom\default=false
custom_top_bottom=780
custom_bottom_left\default=false
custom_bottom_left=1040
custom_bottom_top\default=false
custom_bottom_top=300
custom_bottom_right\default=false
custom_bottom_right=1680
custom_bottom_bottom\default=false
custom_bottom_bottom=780

This would center both screens at 1920x1080 monitor resolution with 2x native.

2 Likes

Works flawlessly! Thank you :smiley:

For anyone else reading and wondering where this goes:

C:/Users/You/AppData/Roaming/Citra/config/qt-config.ini

In the [Layout] section between the swap_screen and upright_screen variables (replacing what’s already there).

I’d keep a copy of this and the existing configuration file, then you can swap them between depending on the game you’re playing (assuming you don’t want integer scaling for all games).

1 Like

Why is stretching not possible?
Considering the poor performance of the emulated graphics, perhaps anything beyond 4x would be pushing most non dGPU’s.

But one could do an automatic 4.5x or 6.7x or whatever fits the screen.