- Edited
''''''''''''
''''''''''''
'''''''''''''
moonpie I will try ubuntu. I just loaded to Fedora with my Nvidia 3070 Super, but looks like fedora is in hybrid mode, I can't find any active resolution in i915 file. So currently I have hdmi connected through nvidia gpu and it still not dithering. I'm trying to switch graphics with this tool I found https://github.com/bayasdev/envycontrol
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)?
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:
Pros:
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)
I have supplemented the previous answer with new information.
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?
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 Thank you, much appreciate it!
WhisperingWind how did you manage to switch to 6-bit output on Windows 11? I would be glad for such instruction
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
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)
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.
According to this link
To get pure 6-bit, I suppose you need to set
4 bit = 0 (disable dithering)
5-7 bit = 010 (6-bit pipe)
8 bit = 1 (truncate data)
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+).