If the surfaces are exactly co-planer, your fate is up to the FPU gods; you'll more than likely have Z-fighting. If the triangles are *identical* and you do the *exact* same math to each, you *will* end up with the same Z-values for both. But again, this will only happen if your math operations are identical for both. (Since, in general, FPU operations are not commutative)

One possible solution is to not use the Z-buffer at all. Rather you can use the Painter's Algorithm. Granted, this comes with all the problems of the painters algorithm as well. But, it would solve the Z-fighting.

In your example case of Screen Space Decals (SSDs), the common solution is to use an offset, aka a simple thin cube. See Warhammer 40k's presentation about SSDs for reference. Or Bart Wronski's post which addresses some other issues with decals, but also links to a few other presentations about SSDs

2

You could checkout logarithmic depth buffers. There's an article on gamasutra

– Soapy – 2015-08-07T08:12:14.8501When you say "co-planar" do you mean "nearly" or "exactly" co-planar and if the latter, are those surfaces ever identical surfaces/triangles? The rendering hardware should be deterministic (assuming you aren't submitting in random order) for the last case and not have fighting.

If it's a case of non-identical surfaces but exactly co-planar, could you update the model to split surfaces into overlapping and non-overlapping portions? – Simon F – 2015-08-07T12:55:57.560

@SimonF, by "co-planar" I mean "exactly co-planar". Soapy's solution only works in the "nearly co-planar" case. – Mark – 2015-08-07T18:38:11.437

Could you give an example of your surfaces? The only thing I can think of off the top of my head is duplicate triangles as @SimonF mentioned. – RichieSams – 2015-08-07T20:28:32.447

@RichieSams the most common case that I can think of is decals, where you don't need exactly duplicate triangles. – rys – 2015-08-07T23:15:29.387