anon123

That's interesting. I'm new to modern Macs as you can see (my last Mac that I truly used for significant period of time was the CRT iMac lol).

At this point I am a bit tired of chasing new monitors and hardware swaps. Focusing now on how to build up defenses (breaks, eye washes with water, acupresssure, etc. ) and using the screens less.

    anon123 when macOS divides by exactly 2 it works by just doing a 200% zoom, the same as Windows, so the vibrating feeling they had is probably related to usual Mac temporal dithering. Sounds just like the dithering symptoms I get on iPhone SE 2, most Macs, AMD video cards etc.

    however, yes there will be additional distortion and moire patterns on not-exactly-2 scale factors (this is where it does differ from Windows). But exactly 2 should be fine, so they're definitely just feeling the symptoms of dithering

      photon78s I'm not sure what to make of these videos. If your Windows setup is outputting an 8-bit signal (with dithering disabled) over to an FRC display and you're measuring a flicker, then that says more about the display than your particular OS+GPU config.

      We've already seen that Stillcolor disables Apple GPU/DCP dithering in the Mira e-ink monitor (USB-C to ?), Blackmagicdesign capture card (HDMI to HDMI 1080p60), and via user testimony.

      If you can take microscope footage on a monitor that's proven to be FRC-free at a particular bit depth, showing no flicker, then take footage using a OS+GPU combo on the same display that demonstrates flicker, then we can start diagnosing the software.

      Edit: does your phone have a "Pro Video" mode at at 120fps FHD? If you can set your output's refresh rate to the minimum possible (30fps?) and and take scope footage with 120fps, it will probably be easier to analyze.

        aiaf

        Thanks for the suggestions. The pro video mode is not very useful in my case. Will try something else.

        aiaf Please how should I send it to you? I exported it into *.txt file, but its quite a lot of text to copy it here.

          martin I would also be interested in it for research purposes.

          https://gist.github.com could work if there's no sensitive information in there.

          Forum has a PM function under the user profile.

            JTL I think PM permissions are disabled by default. I had to manually ask admin to give me permissions for it.

            • JTL replied to this.

              aiaf DISABLING "uniformity2D" WORKS

              IT FIXES THE "weird fading to black bands around the edges" while still keeping bands on shadows (i.e. dithering is disabled TOO! this is in addition to it)

              there is still some blotches of solid white backgrounds where changing gamma affects them differently than other areas of the same background, so that may be related to a different property, but uniformity2D is behind that weird edge effect!!!

              the effects of disabling uniformity2D are sooooo obvious even when dithering is still enabled (but i can still notice an additional change when disabling/enabling dithering too)

              this fixes something that's annoyed me about this screen for years where i always KNEW the edges were fading to dark instead of displaying a solid background

              once you disable uniformity2D "you'll never unsee it" when it's on like it is by default! it's such a dumb screen effect because the screen honestly looks more color accurate when it's off!

              in summary:

              disabling and enabling dithering affects whether the fading to black at the edges (most visible on a white background) is banded or "smooth"

              disabling uniformity2D GETS RID of the fade to black entirely

              fyi:

              a good way to test the effects of disabling and enabling dithering is looking at the transparent dark sidebar of Xcode against a wallpaper of a partly cloudy sky. you can easily see banding appearing and disappearing here

                So after some more experimentation with the microscope, it turns out the OLED display I was testing Stillcolor with seems to have built-in FRC dithering. In fact, it is quite aggressive. The marketing and independent specification for the display make no mention of this. It occurred to me that I might be able to confirm that there is no temporal dithering built into the display by looking at the onscreen controls under the microscope. Sure enough, the middle grey design elements in the onscreen display settings have temporal flicker.

                With that, I am more confident that Stillcolor is working on the M1 MacBook Pro 16". And that the temporal dithering visible under microscope might be LCD inversion with a sub-pixel implementation. But it amazes me how bad the LCD inversion is. The built-in MacBook display performs well on the many inversion tests available, but under the microscope it is pretty much terrible. If this flicker is LCD inversion, then I could see LCD inversion being a main cause of people's discomfort with these machines. I didn't know it was this bad, and had always thought this sub-pixel independent flicker under microscope on darker colors was temporal dithering.

                Stillcolor does for sure increase the banding on the Lagom gradient test. So there is evidence it is working. It would be awesome to see time blend output from an M1 MacBook Pro 16" to a capture card, but for now I'll just have to assume Stillcolor is working. Because of the very similar noise of inversion, it is so far not obvious that anything temporal has been disabled by Stillcolor, through the microscope.

                In the meantime, I am going to try to come up with an experiment to distinguish between LCD inversion and temporal dithering (sub-pixel type) to put this confusion completely to rest.

                  Blooey i still think the XDR Pros are dithering with an additional 10-bit to 8-bit FRC step like external monitors do (because macOS output is 10-bit but I doubt the internal panel is "true" 10-bit), and this would best be solved if Stillcolor gains the ability to truly force color depth

                  can you try measuring the display with both Stillcolor enabled and BetterDisplay dummy/virtual display mirrored to the physical display? BetterDisplay dummies try to render 8-bit (but I'm pretty sure the actual output of the Mac in the end is still 10-bit, until progress on forcing bit depths is made), curious if the flicker pattern changes with that configuration

                    DisplaysShouldNotBeTVs @aiaf in addition to the obvious change made by disabling uniformity2D DISABLING "NormalModeEnable" ALSO MAKES A HUGE CHANGE

                    (⚠️ FYI, when disabling NormalModeEnable, make sure that ProMotion is off (use 60 FPS or lower.) Even though it also affects ProMotion, trackpad mouse cursor movement will get totally messed up, but this isn't an issue on 60 FPS and lower.)

                    after disabling:

                    at default gamma the screen will slightly change color tint and dark grays will get brighter

                    at darker gamma the screen gets A LOT brighter overall, and background colors look more solid

                    disabling it also makes shadows on windows feel less 3D (maybe because the level of backlight zones now becomes more similar between a dark window and a lighter background?)

                    AND on some pages, like the animation when you load the "MacBook Pro" page on Apple.com, there is even more banding after setting NormalModeEnable to false. (look at the white gaps between the laptops that are animating)

                    again, disabling this simply makes the screen BETTER, it removes another one of the strange tricks used to mask the imperfections(?) of the display, potentially this one is related to control of the mini-LED backlight zones?

                    this image on Apple's website implies that typically mini-LED zones will have different brightness per zone that attempts to match whatever image is being shown?

                    potentially this property reduces or disables this?

                    there are still some blotches of (now not dithered anymore) gray on white backgrounds visible at lower gammas, but we're just a property away from clean screen output (aside from forcing 8-bit which is also important), i can feel it

                    So far:

                    enableDither = false: way less text shimmer, can more easily visually process multiple occurrences of a repeating object at once, edges of "pixel-perfect" icons in Finder list view look sharper

                    uniformity2D = false: the "vignette effect" / fade at edges is GONE

                    NormalModeEnable = false: less "cloudy", more natural color tint

                    both uniformity2D and this potentially reduce the weird "fake 3D" effect

                    The issues that remain:

                    "Fuzzy text/glowing halo around text" (may be related to panels from one of the multiple manufacturers only, based on prior experience since one friend's Mac didn't have this issue), some shimmer on certain background colors, blotches of slightly different shades on solid backgrounds (that are very obvious now because they can't "blend in" by being dithered)

                      aiaf Thank you for your great work and sharing the technical details!

                      I tried to reverse the Apple silicon video drivers a year ago but gave up because of complicated logic of the driver set.

                        @aiaf do you have any pointers for being able to use IOKit in Swift on iOS so I could experiment with adjusting enableDither on my iOS devices? IOKit is a private framework on iOS and gives an error when trying to import it with IOKit.

                        Some people said they could use it through Objective-C instead, but I don't know how to write ObjC at all (despite me being very experienced with Swift). However, even when trying to do this just to see if it would work, I actually couldn't get IOKit to load in ObjC either.

                        ———

                        FYI: As I am a mobile developer, I have a LOT of iOS devices I've collected over the years… so I can certainly help with testing anything iOS-related if this ever becomes something you're interested in.

                        For reference:

                        Devices I own with "good screens": iPhone 4 (iOS 7), iPhone 5 (iOS 6.1.3 native, but also runs iOS 7/8 via dual boot), iPhone 6 (iOS 12), iPhone 7 (iOS 15), iPad mini 2 (iOS 10.2), iPad 6 (iOS 15)

                        Devices I own with "bad screens": iPhone 5s (iOS 12), iPad Pro 11" 2018 (iOS 17), iPhone SE 2 (iOS 17.2.1), iPhone 14 Pro (iOS 16.4)

                          DisplaysShouldNotBeTVs Update: I'd recommend only disabling dithering and uniformity2D — as disabling NormalModeEnable seems to make the system less stable / cause the cursor to lag / eventually randomly crash the WindowServer and log out.

                          Disabling the other two, dithering and uniformity2D, works totally fine and that does most of the work in improving the screen, so disabling normal mode isn't that necessary.

                          I'm still not sure which property will get rid of the "blotches of slightly different colors".

                          I wonder why disabling NormalModeEnable is causing this?

                          @aiaf just found AN IMPORTANT ONE

                          Disable VUCEnable

                          This causes even more banding to appear on the gradient test than just disabling dithering on my M1 Max XDR.

                          Additionally, "irregular patterns of boxes" appear on certain solid color background shades.

                          Potentially this is disabling the internal panel's FRC???

                          If you turn the Mac backlight up to max and Software Brightness (BetterDisplay) very far down, you will also now see a "dark, heavily banded blotch that follows the mouse cursor like a trail" when moving the mouse on a dark gray background. (Easily seen after zooming in with Ctrl+Scroll accessibility zoom.)

                          This confirms another thing I swear I could see for years, where it always felt like there was a dark spot around the mouse or that there was an area flickering around the mouse (specifically on the internal display). There IS, and it was literally being dithered (i.e. flickered) to hide it, too.

                          This will also make a strange "animation" visible (that was present before but now very obvious) of all the "blotches" I've pointed out moving around whenever Software Brightness is changed, lagging behind a second or so with what seems like an intentionally smoothed out animation — even when BetterDisplay's own "software brightness smoothing" is disabled.

                          I still don't know how to disable these blotches, but one thing's clear — they're basically programmed to "move around in the corner of your eye at a slower, smoothed out rate compared to everything else" whenever colors change on screen. And before enableDither=false, uniformity2D=false and VUCEnable=false, the effect was being dithered very aggressively in order to "hide" whatever this is.

                            @aiaf firstly, thank you so much for your work on this, I can instantly feel a difference once enabled on an external studio display.

                            @DisplaysShouldNotBeTVs thanks for your work too, and any chance you could share your code for additional properties you've disabled? I've tried to update the existing program but am getting the below errors so must have missed something

                            Failed to set VUCEnable to true IORegistryEntrySetCFProperty returned -536870206 -> (iokit/common) invalid argument

                            Failed to set VUCEnable to true IORegistryEntrySetCFProperty returned -536870206 -> (iokit/common) invalid argument

                            Thanks!

                              tmfd Go to Stillcolor at the top left of the Xcode file tree, then "Stillcolor" under TARGETS, then Signing and Capabilities. If you see stuff like "App Sandbox" and "Hardened Runtime" here, there should be trash can icons at the top right of each of them. Click the trash can on both so all you're left with is one tab called "🔻 Signing". This will remove the app sandbox and allow those properties to be changed.

                              Then, just comment out the alert.runModal() line that shows the alert box that says "Stillcolor Issue". It will say "invalid argument" some times but then end with a "successful" anyway in the console after it tries a couple of times, so even though it makes it "look like" it didn't work, it does make the change as long as app sandbox is disabled and you eventually see "returned 0 -> (os/kern) successful" in the Xcode console.

                              For example, here's what I get in the console when I disable VUCEnable:

                              (Disabled = box checked in the Stillcolor menu bar BTW)

                              AppleCLCD2 service: 310b
                              AppleCLCD2 client: a17b
                              IORegistryEntrySetCFProperty returned -536870206 -> (iokit/common) invalid argument
                              Failed to set VUCEnable to false IORegistryEntrySetCFProperty returned -536870206 -> (iokit/common) invalid argument
                              AppleCLCD2 service: 310f
                              AppleCLCD2 client: a17f
                              IORegistryEntrySetCFProperty returned -536870206 -> (iokit/common) invalid argument
                              Failed to set VUCEnable to false IORegistryEntrySetCFProperty returned -536870206 -> (iokit/common) invalid argument
                              AppleCLCD2 service: 3113
                              AppleCLCD2 client: a183
                              IORegistryEntrySetCFProperty returned -536870206 -> (iokit/common) invalid argument
                              Failed to set VUCEnable to false IORegistryEntrySetCFProperty returned -536870206 -> (iokit/common) invalid argument
                              AppleCLCD2 service: 3117
                              AppleCLCD2 client: a187
                              IORegistryEntrySetCFProperty returned -536870206 -> (iokit/common) invalid argument
                              Failed to set VUCEnable to false IORegistryEntrySetCFProperty returned -536870206 -> (iokit/common) invalid argument
                              AppleCLCD2 service: 311b
                              AppleCLCD2 client: a18b
                              IORegistryEntrySetCFProperty returned 0 -> (os/kern) successful
                              VUCEnable set to false

                              It says "failed" a bunch of times, but eventually ends with successful, and the VUC change works in the end.

                                dev