One of the things Stretcher supports is small update regions, used for games that support Dirty Rectangles.
A game can redraw a tiny part of the window → Tiny region of the unscaled texture gets changed → Tiny region goes through the pixel shader → Finally, tiny region gets presented to the screen.
To support the small screen updates, I use a combination of the Scissor Rectangle and punching holes in a Z buffer. If there's just one rectangle, I use only the scissor rectangle. If there are multiple rectangles, I punch holes in the Z buffer, then use the scissor rectangle for the overall area. Once you have a scissor rectangle and/or Z buffer set up, you can draw a single big quad, and the GPU will skip drawing parts that don't need to be drawn.
Some games will do very small screen updates during idle time, for example, display a small looping animation in the corner of the screen. These games might be running at the idle screen for minutes or hours on end. If you support partial screen updates, then you don't waste CPU and GPU on updating the entire screen.
I can see that the CRT filter adds a fish-eye distortion effect to try to simulate some old TVs. That makes the step of going from Unscaled Bounding Box → Screen Bounding Box harder. But if you can come up with a function that will accurately calculate the screen bounding box, then would make small screen updates work fine.
Right now, the code isn't really set up for anything other than Linear Interpolation or one specific Two-Pass shader (superXBR), so I'd need to do a little work there for everything else. I know that RetroArch has a system for doing multi-pass shader stuff, but there are slight incompatibilities between CG and HLSL that break using RetroArch filters directly in D3D9. Single-Pass shaders are probably a lot more simple.
Additionally, the backing texture is set up as being screen sized (such as 1920x1080), with the active small screen area (possibly 320x240, 640x480, or 800x600) in the upper-left corner. UV values are set in the quad it draws so it uses the correct area. If that's a problem, I might introduce a feature that forces the texture size to match the small size.