Force high-res 640x480 mode

Discuss any suggestions you may have here.
Post Reply
User avatar
Nintendo Maniac 64
Posts: 185
Joined: Fri Oct 04, 2013 11:37 pm

Force high-res 640x480 mode

Post by Nintendo Maniac 64 » Sat Jan 11, 2014 9:47 pm

An idea that I had mentioned around a year ago or so on EmuTalk that I figured I should mention on here.

The concept is pretty simple to explain, basically force-enabling the N64's built-in high-res 640x480 rendering mode even for games that don't use it, such as Super Mario 64.

No idea how possible such a thing really is, but it'd arguably be more accurate for the few N64 games that only ever were released in the west via the GameCube (Ocarina of Time Master Quest) or the Wii (Sin & Punishment) since the emulators for said games had them actually rendering at 480p (though the GC and Wii also did 4xAF which is definitely out of the question).
CEN64 Forum's resident straight-male kuutsundere
(just "tsundere" makes people think of "Shana clones" *shivers*)

CPU+iGPU: Pentium G3258 @ 4.6GHz/1.281v
dGPU: Radeon HD5870 1GB
RAM: Vengeance 1600 4x4GB
OS: Windows 7

User avatar
Posts: 47
Joined: Fri Oct 04, 2013 8:00 pm

Re: Force high-res 640x480 mode

Post by Iconoclast » Thu Jan 16, 2014 12:54 am

640x480 is, on NTSC, the native VI resolution for the DAC of RGB pixels.
The video interface manages the filtering of whatever is in the frame buffer, to your television screen.
So 640x480 isn't exactly a "built-in high resolution".
It's just what the RDP frame buffer resolution is up-scaled to in most cases.

If there was a built-in high resolution of 640x480 then why do so many games not apply it?
The objective is management of the OS video interface, not visual quality.

Some games which do support enhanced video resolutions when using the memory expansion pak accessory, like Gauntlet Legends, will apply a native frame buffer resolution of something around 640x240, but not necessarily 640x480.

User avatar
Site Admin
Posts: 692
Joined: Fri Oct 04, 2013 4:49 pm

Re: Force high-res 640x480 mode

Post by MarathonMan » Fri Jan 17, 2014 9:06 am

As I said before: feature. Also, it's a lot more complicated than just "forcing the high-res bit in the RDP":

The RDP writes its framebuffer output to RDRAM, and the VI then renders the frame to the video output using the frame data in RDRAM. Obviously, virtually everything is going to be double-buffered, so that means there are effectively two blocks of memory in RDRAM reserved for frames (one for the front buffer, one for the back buffer). A game like Super Mario 64 is only going to allocate two 240p buffers, because anything else would just be a waste.

Now where things get interesting: the buffers are laid back to back in physical memory. So, if you tell the RDP to render 480p all the sudden, there's going to be significant corruption if the thing even manages to boot as the frames are effectively now partially overlapped. If there's anything other than frame data following the second RDP buffer, it's going to get corrupted.

Secondly, I can't see how this would work with games that use VR4300 framebuffer effects. If memory serves, either the VR4300 or RSP render the 'PRESS START' text in Super Mario 64 when Mario's face is spinning around in the intro. My guess is that either one of these units is just writing to a fixed offset into the framebuffer. Well, again, if your framebuffer magically quadruples in size, it's going to be in the wrong place (and probably be corrupted since your vres is going from 240 to 480).

tl;dr: To do this, you would need to trap calls into libultra and fudge the parameters so that it renders 480p instead of 240p, redirect RDP output from RDRAM to this some physical sections of memory for the enlarged frames (outside of RDRAM), and tell the VI where these frames are now located prior to it rendering. And that's just to get the RDP going. You'd also have to somehow overcome the framebuffer accesses also previously mentioned.

Post Reply

Who is online

Users browsing this forum: No registered users and 1 guest