AshX
there is another layer of dithering or we are mistaken as to what the purpose of dithering ultimately is
I also think that Apple uses a mix of dithering algorithms. I was led to this conclusion by a post from aiaf, where he lists several patents from Apple, Samsung, and others.
Just to be clear: this is speculation based on public patents, not reverse engineering.
I think it's something like this:
- FRC (patent JP4869422B2) - temporal dithering, which creates missing shades. For example, when we want to display a 10-bit signal on an 8-bit display.
- Spatio-temporal rotation (patent CN102362307B) - a mix of spatial and temporal dithering. It's needed to eliminate banding caused by the interaction between FRC and pixel inversion on the display.
- Dynamic dithering (patent US8860750B2) - temporal dithering. It doesn't increase the number of colors, but simply changes the rounding threshold from frame to frame. It's used to add pseudo-random noise to hide regular patterns, because FRC can produce visible grain and static artifacts on gradients.
Now here's the most interesting part: temporal dithering can cause flickering at 30 Hz and below. Therefore, (patent US9390690B2) suggests completely replacing it with spatial dithering in such cases. This patent may be directly related to the MacBook Pro with ProMotion.
Another interesting finding: even when an 8-bit signal is being displayed on an 8-bit panel, dynamic dithering may still be used. It doesn't add new colors, but it's very effective at reducing banding in gradients. So, just because the bit depth of the GPU output matches the bit depth of the monitor doesn't mean there will be no temporal dithering at all.
Of course, I don't know the exact implementation in the macOS driver stack - these are just interpretations of public patents. But they could show that dithering control on Apple's platform can be very complex and multi-layered - like a layered cake.
P.S. And now, a bit of reverse engineering. We also have the DCP controllers and the TCON controller, which each have their own settings regarding dithering. I suspect that on my MBP M1 13" there are two DCP controllers: dcp(for the internal display) and dcpext (for external display), which may also have different logic. Here's a screenshot from IORegistry on my M1 MBP 13" showing exactly that - dcp and dcpext are separate nodes in the device tree, both using the same AppleDCPExpert driver, but with different configurations and addresses. This explains the limitation of connecting only two displays to the MBP M1 13" - the internal one and one external.