Few time ago I got Macbook pro 15 2019 and Macbook pro 16 2019. Both have the same Intel embedded GPU but different eGPUs.
The interesting thing I noticed is 15 2019 reports that dithering is disabled but 16 2019 tells that dithering is active.
It was curious to make binary comparison of the "AppleIntelCFLGraphicsFramebuffer" kext. They are same! There are no any differences. The kext bundle includes metadata file (Info.plist) which describes the driver dependencies as well as parameters passed to the kext for loading. These parameter can control different driver options (BTW including dithering).
I also compared Info.plist between both laptops. They are also same!
…suppose, we have the specific chipset model, say Intel with embedded GPU. At the same time, we have 10+ display vendor with different parameters. It is difficult and not effective approach to release the specific driver to support the specific display. For this reason, EDID specification was invented to tell to the graphics card the display settings. Usually, the EDID value is stored in the display's EEPROM memory and it is being read by the driver on loading to understand how to setup the graphics card framebuffer (width, hight, screen resolution, color scheme, color depth, etc).
So, the idea is to pass the fake EDID to macOS from the user land level to tell the graphics card driver to work with the framebuffer differently. Anyway, if we have 10-bit depth display but the graphics card is unable to produce true 10-bit color, there are no any reason to hold the graphics card in the dithering mode and we can tell to the graphics card driver to work with 8-bit color depth.
At this moment I am thinking on implementation of this idea. If we can set the fake EDID, we can automatically disable dithering for Intel and AMD GPU's. I am not sure whether this will work on the Apple silicon.
Another interesting thing I found which can be used to disable dithering for the Intel GPU.
The Intel GPU kext driver has such function
void init_sysctl(void)
{
…
sysctl_register_oid(&sysctl__debug_intelfb_forceDither);
}
which controls dithering via the sysctl interface.
To play with it, use the command
sysctl -a | grep forceDither
first, to make sure the Intel GPU is used.
The expected output is:
debug.intelfb.forceDither: 0
or
debug.intelfb.forceDither: 1
depending of whether dithering is active.
It can be modified but I am not sure it will have some effects.