• Hardware
  • Intel confirmed no dithering on Intel arc a770

WhisperingWind i5-12450H , Intel UHD Graphics Xe (driver v. 31.0.101.5537), Windows 11 23H2, 8-bit monitor.

Hello WW, happy new year!

Could you pls share extra settings you have in mini-PC: PC model name, ram used? You also mention, it doesnt have "true" HDMI, which connectin you use for your monitor (and whats your monitor)?

    simplex

    Hello simplex, happy new year!

    I have this mini-PC: https://www.tecno-mobile.com/pc-tablets/product-detail/product/mega-mini-m1

    Processor: i5-12450H, Graphics: Intel UHD 48EU (Xe arch), RAM: 2 × DDR4 3200 8 GB Lexar LD4S08G32C22ST. It was connected via type-c (DP) and HDMI. The display used was Sony TV (8+FRC), BenQ BL2711U (8+FRC) and BenQ GL2450 (6+FRC).

    This mini PC has a two true HDMI ports. However, there are two Type-C ports that operate in DP mode. When using a true 8-bit monitor, my eyes felt comfortable.

    Cons:

    • It has a VERY noisy cooling system (IMHO).
    • the processor receives about 38.6 watts maximum (I saw this figure in some reviews), which prevents the CPU from performing at 100% of its capabilities.

    Pros:

    • The absence of dithering in Linux/Windows (tested only on Windows 11).
    • The ability to switch to 6-bit video output mode in both Windows 11 and Linux without enabling dithering. I am visiting relatives, and I brought this mini-PC with me. I'm currently testing it with one of my relatives' monitors, the BenQ BL2420PT (6bit+FRC), in 6-bit video output mode on Windows 11 23H2. For now, this is the only way for me to work with this monitor, as I couldn't switch my relatives' PC (i5-12400, UHD 730) to 6-bit mode without enabling dithering, just like my ARC A770. Later, I will compare it with Ubuntu Linux on the same monitor in 6-bit video output mode.

      WhisperingWind Processor: i5-12450H, Graphics: Intel UHD 48EU (Xe arch), RAM: 2 × DDR4 3200 8 GB Lexar LD4S08G32C22ST

      I currently use mini-PC: i7 13700h + DDR5 4800 mhz KVR48S40BD8K2-64 + Iris XE 96UE with benq bl2420z (via HDMI to DVI cable). When I switched memory to KF556S40IB-16, I got strain. I also got strain with mini-PC 8845hz + 780m even with KVR48S40BD8K2-64 modules, but a little lower level comparing to default 5600 mhz modules. After experiments with registers, we with SunnyCove switch off all dithering settings in AMD, but 780m still strain 🙁

      My hope was, Intel 12..14 gen CPUs works better with DDR5 gen ram, but your config shows it can be perfectly with DDR4 3200 without issues.

      To be honest, 13700h + IRIS XE good with 4800 mhz DDR5 which have standart, not OC JEDEC timings (CL40). Lowering 5600 to 4800 timings with two different RAMs, didnt helps (only RAM with 4800 CL40 max is good). Your DDR4 also seems to have standart 3200 mhz timings (CL22).

      The joke is, I tested laptop with same IRIS XE (13900h) but with LPDDR4 with win11 preinstalled, I play with it in 30 min and after leaving shop, got strain. So I dont really know, does lpddr4 matters in this case, or only screen pixel inversion/FRC (keeping in mind, IRIS XE is safe)

      WhisperingWind my relatives' PC (i5-12400, UHD 730)

      Could you please check, whats motherboard they use (incl BIOS ver), which DDR4 model names (freq, timings)…? 12400 is okay for your taste, does they use iGPU only?

        simplex

        Culd you please check, whats motherboard they use (incl BIOS ver), which DDR4 model names (freq, timings)…?

        does they use iGPU only?

        Gigabyte B760M Gaming X DDR4 motherboard, i5-12400 CPU. Samsung DDR4 RAM: inexpensive green modules of 16 and 8 gigabytes at 2666 MHz, with timings of 20-19-19; support for XMP profiles is absent. To connect to the monitor, UHD 730 is used (a discrete graphics card is absent). The BIOS version is F3 (2023).

        Win10 22H2 2022 Update.

        Dithering is not present out of the box (I read the video pipeline status register to confirm this).

        12400 is okay for your taste?

        When using pc of my relative with the BenQ BL2420PT monitor, eyes strain is noticeable. I think it's because of the monitor's FRC, as I experience the same level of eye strain when connecting the mini-PC in 8-bit mode. However, when switching mini-PC to 6-bit, it becomes more comfortable to work: Windows 11 provides maximum comfort, while in Linux Ubuntu, there's slight eye strain but within acceptable limits.

        Please keep in mind that I spend about 3 hours a day in front of this monitor, no more than that.

        At my relatives' place, this is the best monitor; the others are even worse 🙂 Therefore, there's no way to properly test the setup based on the i5-12400.

          WhisperingWind how did you manage to switch to 6-bit output on Windows 11? I would be glad for such instruction

            Ivan_P

            This is an Intel-specific fix. I'm making this switch in Windows 11 by slightly modifying the source code of the ditherig application in Visual Studio. I write a specific value to the hardware register of the video chip, thereby switching it to 6-bit mode. This works in Windows 11 only with my Intel UHD 48EUs, but it doesn't work with Intel UHD630, Intel UHD730, and Intel ARC A770. If you need technical details, I can provide them.

            P.S. I don't know yet why it doesn't work on the UHD 730 (i5-12400), since the i5-12400 also has the Xe video chip architecture, similar to the Intel UHD 48EUs. It might be an issue with the installed version of the driver or something else.

              WhisperingWind Intel UHD730

              Can you share the link for "Programmer's Reference Manual For the 2022 12th Generation …" ?

              I got only 2021 (tiger lake) and registers works nice with IRIS Xe (13700h), I am wonder if UHD 12 gen has another settings

                simplex

                Link to the guide: https://cdrdv2-public.intel.com/703047/intel-gfx-prm-osrc-tgl-vol-02-c-command-reference-registers-part-2.pdf

                On page 692 of the guide, it is stated that bits 5-7 of the register are the Dithering BPC bits, and the 4th bit is the Dithering Enable bit. This means that bits 5-7 set the color depth for dithering. According to my experiments, no matter what values I set for bits 5-7, there is no effect on the i5-12400 (UHD 730) as long as the 4th bit is zero, meaning dithering is off. However, if the 4th bit is set to one, enabling dithering, then bits 5-7 can be used to adjust dithering depth. But this is not what we need, as we actually want to get rid of dithering.

                However, when attempting to change bits 5-7 for the Intel UHD 48EUs (i5-12450H), the color depth of the output signal changes, while the Dithering Enable bit (the 4th bit) remains set to zero. This behavior is different from the desktop i5-12400 iGPU.

                However, I was led to these experiments after reading a comment in the Linux kernel in the i915 module. It stated:

                For Display < 13, Bits 5-7 of PIPE MISC represent DITHER BPC with valid values of: 6, 8, 10 BPC.

                ADLP+, the bits 5-7 represent PORT OUTPUT BPC with valid values of: 6, 8, 10, 12 BPC.

                I know that there is a way to switch to true 6-bit on the Alder Lake i5-12400, as the i915 module in Linux does this. However, in Linux, this is done through the convenient xrandr tool, and I'm not ready to say which other registers are involved in this process.

                  WhisperingWind ADLP+, the bits 5-7 represent PORT OUTPUT BPC

                  Perhabs, this mean Alder Lake and later (12gen+), use another registers for dithering, when 5-7 used for port output bit depth:

                  Till DISPLAY12 the PIPE_MISC bits 5-7 are used to set the
                  Dithering BPC, with valid values of 6, 8, 10 BPC.
                  For ADLP+ these bits are used to set the PORT OUTPUT BPC, with valid
                  values of: 6, 8, 10, 12 BPC, and need to be programmed whether
                  dithering is enabled or not.

                    WhisperingWind, can you tell me what files and what lines in those files you changed?

                    I would like to experiment with my 8 to 11-generation Intel laptops.

                    Also, could you share your method of checking output bit depth? (to test that changing registers truly made things)

                      simplex

                      As I understand it, the purpose of bits 5-7 in the pipe misc registers has changed. I haven't looked into it deeply, so I'm not aware of any other changes (this might be the only change).

                      According to the comment in the i915 code, this change occurred starting with the 13th generation for desktop CPUs and starting with the 12th generation for laptop CPUs.

                      Ivan_P

                      Also, could you share your method of checking output bit depth? (to test that changing registers truly made things)

                      Switching between 6 and 8+ bits is determined by this video: https://www.youtube.com/watch?v=suAR1PYFNYA. Once the player opens, you can pause it immediately at the 0-second mark. At the very beginning, there will be very contrasting waves on the gradient on 6 bits, while on 8+ bits, the gradient will be smooth without waves.

                      can you tell me what files and what lines in those files you changed?

                      Sorry, I don't know if you have any knowledge of programming. I'll describe it as it is. If it's difficult to understand, I can later upload everything to GitHub in a ready-to-build format.

                      This line https://github.com/skawamoto0/ditherig/blob/2fb5b3a3b8edc405c3427757e1213cc9fcafbc9f/ditherig/ditherig.cpp#L625C1-L626C1 is responsible for forming a new value that will be written to the register. We need to clear bits 4-7 and then set the 6th bit. Bits are counted from right to left starting at zero. This way, we will disable dithering if it was enabled by default (by clearing the 4th bit of the register) and set the color depth to 6 bits on output (bits 5-7 of the register are responsible for this; 010 - 6-bit output; 000 - 8-bit output). It should look something like this:

                      if(ReadPhysicalMemory(Address + RegisterAddress, &Old, RegisterSize))
                      {
                      	New = Old;
                      	New = (New & ~RegisterMask) | (RegisterData & RegisterMask);
                      
                             // { new code starts here
                      
                      	New &= 0xFFFFFF0F;
                              // enable 6-bit output mode; 
                              // comment out the line bellow to switch to 8-bit output mode 
                      	New |= (1 << 6);
                      
                             // } new code ends here
                      
                      	if (New == Old)
                      		bResult = TRUE;
                      	else
                      	{
                      		if(WritePhysicalMemory(Address + RegisterAddress, &New, RegisterSize))
                      			bResult = TRUE;
                      
                      	}
                      }

                      I built it in Visual Studio 2022 (a conversion to the new project format is needed; MFC will also be needed here).

                      This line needs to be removed before building: https://github.com/skawamoto0/ditherig/blob/2fb5b3a3b8edc405c3427757e1213cc9fcafbc9f/ditherig/stdafx.h#L21. Additionally, you need to copy all the DLLs from the project folders (InpOut32, WinRing0) into the folder where the compiled binary will be.

                      I would like to experiment with my 8 to 11-generation Intel laptops.

                      I only have a 12th generation CPU for a laptop, so I can't test it on earlier versions. However, according to the comment in the i915 module code, this will only work starting from the 12th generation (ADLP+).

                        amd cards will generally do 6 bit with displayport fyi.

                        simplex 8 bit = 1 (truncate data)

                        In this case, the code will be like this

                        New &= 0xFFFFFE0F;
                        // Comment out the line below to switch to 8-bit output mode.
                        // Uncomment to switch to 6-bit output mode.
                        New |= (1 << 6);
                        // set Pixel Rounding to Truncate
                        New |= (1 << 8);

                        WhisperingWind Address + RegisterAddress, &New, RegisterSize

                        WhisperingWind, maybe you can help with my stuck?

                        I am tryied to hardcode this part to Address + 0x00070030, &Old, 0x4 it works, but when I set 0x3C000000 + 0x00070030, &Old, 0x4 it didnt.

                        Address = ((DWORD_PTR)BAR1 | ((DWORD_PTR)BAR2 << 32)) & ~((DWORD_PTR)0x10 - 1)keeping BAR1:0x3C000004 и BAR2:0x00000060

                        What part I am missing, why I cant hardcode address…?

                          So I wanted to come in here and say that I specifically bought an Intel Arc A750 Limited Edition in the hopes that it wouldn’t dither on Windows 11. Unfortunately? Even with Ditherig running, I’m still feeling that hazy fatigue feeling after 30 minutes of use as if some area behind my eyes is being pulverized. Other Windows 11 gpus/laptops or screens give me intense eye strain as if I can’t focus on the text at all but not this one. It’s a different feeling but it’s just as unusable. I’ve tried adjusting so many things and have had no luck with Windows 11 :/

                            dev