Apologies if this is naive: glxgears with the window enlarged to 4K, is running on my Pi4 at about 10 FPS and on tears badly on an up-to-date Raspian Buster.
My guess would be that Pi4 should be able to do at least 2 GPixels/s fill rate. Assuming an overdraw of 2, there’s about 16 M/pix to draw and 8 more to copy to screen. Rounding up to 25 Mpix, that’s 80fps.
It reports the V3D driver is used, so I believe it’s using the VC-IV to do the rendering. If I build a modified project locally, which fills the screen with a texture, I see the same behavior. But if I only call swap every 10 frames, total fill rate goes up dramatically, to something equivalent to 40 draws per second. Faster at 100 draws per swap and more by not clearing the screen to peak at about 1Gpix/s.
I suspect that the time is in the swap to screen (the tearing is another hint). CPU usage is low, so I don’t think the cpu is touching the data.