Here's what happens inside Embedded Framebuffer (EFB):
Shader process for bloom like fx:
1st stage (3xIR | 1xIR resized to 3x):
2nd stage (3xIR | 1xIR resized to 3x):
3rd stage (3xIR | 1xIR resized to 3x):
4th stage (3xIR | 1xIR resized to 3x):
From the images you can understand the process.
1. Get our image..
2. They basically change Gamma.
3. Then do the 1st pass of something like motion blur.
Actually they move the image left of center, make copy move right move right, make copy move further left and then the same for farther right.
All these with transparency blending.
For offsets, they probably calculate it from EFB resolution. That's why in 3xIR the distance is 3 times.
4. They do the same vertically.
5. Then the last EFB copy, they blend it to original image and vualah! Bloom fx!
The shader maths, were made and tied to original resolution and were not feature proofed to work in whatever resolution.
You can also see that camera zoom plays a lot of play here. Enable freelook in graphics option and zoom in: The fx is nice. zoom out: you see bigger differences.
I think that Dolphin can internally change shaders to fix these cases.
An example (for 3xIR) would be that for the 3 last steps to have 1x resolution and then bilinear upscale it to 3xIR.
Or it can divide the offset of steps 3 and 4 by 3. (sth like offset/dolphinIR or change the w and h for the offset calculation).
I can't pinpoint the shader though :/ Even if I delete the cache it still creates countless shaders inside.