What I was doing was changing the VGA video output signal. If you want something that works on both NTSC/PAL/RGB and VGA, most of that wouldn't help. The only stretching that can be done with the video signal registers is a 2x horizontal and/or 2x vertical stretch. You can display a letterboxed frame buffer, and display (for example) a 640x384 image in a standard 480i/480p signal.
There's a better option for saving fillrate, the PVR has a vertical upscale feature, where it writes the tiles vertically stretched to the framebuffer. You could render at 640x384 or 640x416 and stretch it out to fullscreen 640x480. The hardware is also capable of changing the render resolution (as well as enabling or disabling antialiasing) per frame, so you could run at 1280x480 when load on the PVR is low, and drop to 640x480 or 640x384 when there are heavy transparencies.
In the last few images on
this gallery (you will need to click a "show more" button), demonstrate this.
I don't think it possible to getting this to work correctly with KOS's current PVR driver. You have to set up a different tile matrix for different resolutions. If you try to use a tile matrix for 640x480 and use the vertical stretch to render at a lower resolution, it will waste time rendering the off-screen parts only to discard them. (i.e. if KOS makes a tile matrix for 640x480, then try to do a stretched 640x240, the PVR will render the entire 640x480, but only store the stretched upper 640x240)
My custom PVR driver supports having multiple tile matrices, so you can have 1280x480, 640x480, and more ready to use. I've been meaning to release it for a long time, but haven't been able to get around to doing some clean up to it. I think I'll just release it as is soon. I'm going to make some API changes at some point, but nothing that should affect T&L code, just some of the initialization/scene management.
Since it was brought up, I'm releasing the code for the program I used to test how the video output registers worked and experiment with different resolutions now. You can change the video registers using the VMU while a test image is displayed.
Since the test program messes with video signals, and maple updates are triggered on vblank, I disable the default maple update and trigger it manually in a thread, in case the video settings break the vblank interrupt.
You can edit the video signal registers on the VMU with the d-pad (or faster with L/R on analog). To apply the settings, press A. You can press Y to dump the settings to stdout.