Don't write gl_FragDepth in 3D shaders.
Writing gl_FragDepth may make GPUs disable early-Z if the drivers aren't smart enough to realize they can leave it on in this case. Since a linear depth buffer is needed for shadow bias to work correctly, and deferred lighting to work correctly, etc., write the linear fragment Z to an additional buffer, but prior to rendering the geometry pass, render a Z-only (so, shadow) pass which will also ensure that only one fragment of the full G-buffer outputs will be written during the main geometry pass. (So even though we're writing more outputs and thus consuming more bandwidth, we're writing fewer fragments over each other and thus consuming less bandwidth.)
Edited by Seth Carter