You really should not be doing this as a post process, and definitely not by just using a ceil of the multiplied screen coordinates. Suppose you are on a 1080p monitor and want it to look like it’s rendering at 960x540 (meaning all the pixels are twice as big). By doing this in the above post process approaches, you are throwing away 3/4 of the work your GPU just did to render the frame.
You are quite literally, in the purest possible sense, throwing performance away.
The right way to do this is rendering at a lower screen percentage and setting the upscale quality to 0, which will use nearest neighbor.
r.ScreenPercentage 50
r.Upscale.Quality 0
You will need to make sure you have your antialiasing set to Off, FXAA, or TAA. TSR won’t work.
This will actually render at a lower internal resolution than what is output to the screen, meaning you don’t waste any work on pixels that won’t be shown.