- Edited
,,,,,,,,,,,,
,,,,,,,,,,,,
WhisperingWind we could also disable the gpu like this:
https://superuser.com/a/210381
It's easy to just try it on a given system and see if it solve the issue.
And if this solves the issue and we know that using intel Arc also is dithering and eye strain free, that's easy to buy an Arc card if a gpu is needed.
,,,,,,,,,,,,,
we could also disable the gpu like this:
The environment variable LIBGL_ALWAYS_SOFTWARE=1
switches Mesa to use CPU for calculations. The graphics card continues to function normally and is managed by its driver. When I enable software rendering, the image quality seems a bit nicer. Previously, I noticed that colors change between CPU and GPU rendering, which might trigger the FRC module on my monitor. So, I'm currently using only software rendering, but I can still manage the graphics card through the driver (I have it set to 6-bit). I think for cards where the driver enables dithering, software rendering won't fix the issue.
Below is the system information for the software rendering mode:
$ inxi -G
Graphics:
Device-1: Intel DG2 [Arc A770] driver: i915 v: kernel
Display: x11 server: X.Org v: 21.1.11 with: Xwayland v: 23.2.6 driver: X:
loaded: modesetting unloaded: fbdev,vesa dri: swrast gpu: i915
resolution: 1920x1080~60Hz
API: EGL v: 1.5 drivers: iris,swrast platforms: gbm,x11,surfaceless,device
API: OpenGL v: 4.6 compat-v: 4.5 vendor: mesa v: N/A renderer: llvmpipe (LLVM 18.1.3 256 bits)
API: Vulkan v: 1.3.275 drivers: N/A surfaces: xcb,xlib
$ lsmod | grep i915
i915 4329472 5
drm_buddy 20480 2 xe,i915
ttm 106496 3 drm_ttm_helper,xe,i915
drm_display_helper 253952 2 xe,i915
cec 94208 2 xe,i915
i2c_algo_bit 16384 2 xe,i915
video 73728 2 xe,i915
llvmpipe (LLVM 18.1.3 256 bits)
is the CPU (software) render.
The lsmod
command indicates that the video driver is loaded.
To “disable” the video card, you need to blacklist its driver. In this case, Mesa will also switch to software rendering, but the video card driver won't be loaded.
I've blacklisted the i915 driver.
inxi -G
Graphics:
Device-1: Intel driver: N/A
Display: x11 server: X.Org v: 1.21.1.4 driver: X: loaded: modesetting
unloaded: fbdev,vesa gpu: N/A resolution: 1920x1080\~60Hz
OpenGL: renderer: llvmpipe (LLVM 15.0.7 256 bits)
v: 4.5 Mesa 23.2.1-1ubuntu3.1\~22.04.2
echo $XDG_CURRENT_DESKTOP
XFCE
"enable display compositing" = off
System is less comfortable than
inxi -G
Graphics: Card: Intel Device 46d2
Display Server: x11 (X.Org 1.20.4 )
drivers: fbdev (unloaded: modesetting,vesa)
Resolution: 1920x1080@77.00hz
OpenGL: renderer: llvmpipe (LLVM 8.0, 256 bits)
version: 3.3 Mesa 19.0.8
ubuntu 18.04(zorin 15 lite)
echo $XDG_CURRENT_DESKTOP
XFCE
"enable display compositing" = off
Maybe some other small differences between. i"m not sure.
This sounds intriguing! I will install Ubuntu 18.04 and try to figure out which system components might differ.
WhisperingWind It could also be placebo, the difference exists but it is small-medium. also edited previous reply to add details.
It's like gold mining: the more sand we sift through, the better our chances of finding something valuable.
modesetting includes 2D acceleration. fbdev doesn't and it's more basic.
fbdev also has backlight control.
I think fbdev has a lower chance of creating strain.
https://www.perplexity.ai/search/does-xf86-video-modesetting-ha-hHguh0i_TmqP0XBMZEmHdw
But it could also be because of the higher refresh rate(77hz) in 18.04 vs (60hz) in 22.04.
................
I tried latest ubuntu with my Intel iGPU 12900K and it was bad, dithering almost instant feeling
Try running the command
sudo cat /sys/kernel/debug/dri/1/i915_display_info
in the terminal. The command will output a lot of data, but among it, there should be information about the presence of dithering
dither=true|false
1 is the device number, which can be obtained through
inxi -G
But if there is only one video card, it should be 1.
''''''''''''
'''''''''''''
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+).
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 :/
,,,,,,,,,,
The Address has been calculated incorrectly. If BAR1=0x3c000004 and BAR2=0x00000060, then the value of Address should be 0x000000603c000000.
Make sure your monitor is safe. Try installing Linux and check for dithering as moonpie suggests. Evaluate how comfortable it is for you to work with your monitor in this case.