RetroArch - Native CRT Support


I just want to re-iterate this statement. There is a 4:1 which is suitable for 1920x480, but not an 8:1 for 1920x240. Let alone higher resolutions like 3840x240, etc, etc.

As far as I know, the only way to get proper visuals is to set the aspect ratio correctly and set integer scale to “on”. Setting it to ‘config’ requires you to manually input the x/y resolution numbers; which are going to differ between each system (and in our case multiple times per game).

You can manually set 8:1 or 16:1 aspect ratio by changing the “Config Aspect Ratio” to 8.0 or 16.0 and setting the Aspect Ratio mode index to “Config”, and this automatically scales horizontally without needing to change anything per-game. The custom viewport x/y stuff is only used if the Aspect Ratio index is set to “Custom”

In the config file, it would look like this:

aspect_ratio_index = 19
video_aspect_ratio = 8.0

With 3840x480 fullscreen resolution, this will automatically stretch all games to the full width of the screen.


With 3840x480 fullscreen resolution, this will automatically stretch all games to the full width of the screen.

Is there any way to accomplish this regarding the height of the screen? My problem currently trying to use the fork for supee resolutions is that 240 and 480 high modes don’t stretch to the height of the screen when switching from one to the other


Shaders can already react to framebuffer size changes in the core without the change being reported through set_geometry. This is how the interlacing shader could instantly detect games that change the vertical resolution by checking video_size.y/SourceSize.y despite Beetle-PSX not implementing set_geometry for those changes.


If you wanted to try using kernel mode setting, I believe the relevant section would be here:


If you have Integer Scale turned on, it should automatically scale and center the game vertically to your output resolution. However, it’s probably not updating the scaling when mode changing between 240 and 480 because the aspect ratio is not being reinitialized with the new dimensions yet.


TL:DR I may be wrong about all this

Changing whenever the height / width values change in video_cb still worries me, it could become annoying / destructive.

In my opinion (and consider that I have no way to test), it should only switch if vertical res changes on a set_geometry call, and in every set_av_info call, and what should happen is that the cores should have that as an option so it’s called as often as required for people with the right gear.

It just seems to me you’re reading the values from the video callback and assuming that a change there warrants a mode switch, from your videos it works but I think that’s a bit brutal.

I think there are some games that switch often, like Seiken Densetsu 3 (not sure if it’s reported by the core though). If av_info was called everytime there is an internal mode change there you would end up switching every time a dialog box pops up.

That said… I’ve been looking for a PVM/BVM all week in anticipation.


I have a crt connected all the time, so feel free to use me for testing.


I completely understand where you are coming from. Too much switching will cause playability issues or even annoyance. This being said, you stated that some cores don’t have geometry change on display mode.

In doing it this way. I am receiving that exact resolution the console is outputting. Then choose to handle in a way that best suits. In the case stated above about SD3, the best way for that to be handled is not to switch down to the lower resolution. Instead always run the horizontal at 512. This would stop any unnecessary switching and should work absolutely fine. The low res is 256 exactly 1/2 the size and the CRT will treat the resolution the same. Then use aspect ratio to fix.

I’m happy to look into alternatives methods, If you think theres is a better way to do it. As you know its a fair amout of code to sift though! But any pointer will help with the progress.


Foxhole was kind enough to send me his retroarch config and that helped me figure out my configuration issues so a big thank you to him! With this I have everything working properly with all platforms and games tested so far. Does anyone have a few good examples of games to test?


The game mentioned by @radius Seiken Densetsu 3 would be a good one. I’ve not incorporated aspect scaling and width ignore yet. It will be interesting to know how it functions. With your config.


Games that i know about that switches from 240p to 480i in gameplay to menu’s.


Chrono Cross (Between gameplay to menu)

Einhander (between gameplay and config/gallery/ending credits)

Tobal No. 1 (between gameplay and FMV)

Tobal 2 (between gameplay and FMV)

Silent Hill (switches to 480i for the inventory screen)

Toaplan Shooting Battle

Dance Dance Revolution 4th, 5th, and Extra Mix

Thunder Force V

Omega Boost


Killer Instinct Gold


Which emulator is everyone using for n64 and which plugins/settings? I’m having trouble getting anything (N64) to run with this build and feel like it must be down to a modeline misconfiguration.

EDIT - With parallel core d3d isn’t working at all and gl crashes on interlaced gfx if you choose 320x240.


@Retrorepair If your CPU is fast enough, try using angrylion gfx plugin with cxd4 RSP.

@Alphanu Re: switching too much, I was thinking about how we would ultimately handle this functionality in the config/menus and I figured a good solution could be to have 1 overall option (call it CRT Switch Res or something like that) that has 2 modes of behavior: super-res (horizontal res is locked to 2560 or whatever, vertical res changes when the game changes it [could be represented as a mask in the video_fullscreen_y config option, such as -1 since 0 is already taken]) and “original” (both horizontal and vertical res change when the game changes them; both video_fullscreen_x and video_fullscreen_y would be -1 in this case). So, the option would have OFF, Super-Res, and Original to choose from.

This would solve the issue @radius described without needing to change how you’re doing it or dig into each core and add core options to enable res-switching capability (i.e., adding set_geometry to run on every frame).

I think it would also be good to have a “double scan” toggle that just doubles the refresh rate values it matches against, for people using 31 khz PC monitors.


(Bounty up to $100)


Here’s a couple extra videos of me testing

The only idea I still have that I think would be a good addition would be a way for you to define the horizontal super resolution you wish to use. This is handy because with CRT Emudriver you have full control over a resolutions overscan so you can set up systems like Genisis & SNES that don’t need a lot of overscan on something like 3840x240 and something like N64 on 2560x240 and adjust the porch values to include lots of overscan, I personally used this trick a lot to optimize different systems to my CRT.

Also @Alphanu I tried Seiken Densetsu 3 but as I’m using Super Resolutions there wasn’t any changing happening other than the refresh rate, after turning off onscreen notifications it’s nearly impossible to tell there was any switching happening at all. Definitely the desired results but if you’d like I can also test this game with Native res and it might be a little more informative?


I second this as well, but more so because depending on hardware your available resolutions will differ. For example, my monitor can’t go as wide as 3840, so I use 1920.

@Monroe88 - I tried using the “Config” method you were referring to here but it doesn’t quite resolve what I was getting at. I can set it to “Config” and the ratio to “4.0” - and it does match 1920x480 quite well, but saving those settings (for 480i content) and then switching the resolution to 1920x240 the ratio still has to be switched to 8.0 for all 240p content.

It works great with the integer shader, which is how my setup is running currently, but what I’m worried about is aspect ratios after a resolution switch like we’re doing here.


Do you have interger scaling on? I set my config aspect ratio to “16.0” and interger scaling on and it works properly now between 240p and 480i although it takes a moment to switch


The delay in switching was because of the external program I was using as a wrapper to change windows resolutions. This will no longer be that case, as I have now changed this method. I have rewritten the code and now all resolution switching is done from within RA. Its much soother and qucker.


Wow this is exciting news! Looking forward to it!


Ok so here is a video of the new switching method. It’s a much smoother transition. In some cases you can only just notice it.

I have my degree assignment due next week so there may not be many updates. However, I will work on it when I can.

@Rion @Monroe88 @hunterk @SkyHighGam3r @radius