MantisBT - Zandronum
View Issue Details
0003770Zandronum[All Projects] Bugpublic2020-03-20 20:332021-02-23 21:54
PCMicrosoft Windows10
0003770: SetDeviceGammaRamp() unreliable in multi-display setup
This issue is difficult to diagnose because so far 3 different systems have given me 3 different results. The problem is:

When there is more than one monitor connected to the system, SetDeviceGammaRamp() when called on a HDC obtained from GetDC() may fail and not set gamma at all. The observed problem is that the `gamma` CCMD doesn't work in OpenGL.

I can reproduce this problem with 100% repetition on my main Win 10 PC only if I connect a second monitor to my GPU. When I have just one monitor, there is no problem.

On my laptop (with Windows 7) I can reproduce a different problem with SetDeviceGammaRamp(): the function works as the gamma is set, but it returns FALSE as if it failed.

Pol M says that there is no problem at all on his computer.

I did some research in to this issue and it seems that SetDeviceGammaRamp() is more reliable if the HDC is not obtained from GetDC() but from CreateDC(). Using CreateDC() is also the way to control the monitors separately.

The problem is not present in the recent GZDoom versions. GZDoom doesn't call SetDeviceGammaRamp() anymore. It seems that they've converted to applying the gamma adjustments in the shaders.

There is also no problem in Zandronum's software mode at all.
Here's an app that has two examples:

1. Example 1 uses GetDC() (the same as Zandronum) and fails on my PC with more than one monitor
2. Example 2 uses CreateDC() and succeeds [^]

This problem may be the same problem that was reported in ticket 0002957.
No tags attached.
Issue History
2020-03-20 20:33ZalewaNew Issue
2020-12-03 14:22otarU1921Note Added: 0021573
2020-12-07 09:57Visual VincentNote Added: 0021576
2020-12-07 09:57Visual VincentNote Edited: 0021576bug_revision_view_page.php?bugnote_id=21576#r13271
2020-12-07 09:58Visual VincentNote Edited: 0021576bug_revision_view_page.php?bugnote_id=21576#r13272
2020-12-07 09:58Visual VincentNote Edited: 0021576bug_revision_view_page.php?bugnote_id=21576#r13273
2021-02-23 21:54Visual VincentNote Added: 0021602

2020-12-03 14:22   
I have the same problem when using multi-monitor setups on AMD GPU.

Contrast, Brightness, Gamma doesn't work using OpenGL on Zandronum when you launch Zandronum and have at least 2 displays on.

GZDoom works fine.
Visual Vincent   
2020-12-07 09:57   
(edited on: 2020-12-07 09:58)
I can confirm this issue as well. Neither Contrast, Brightness nor Gamma works on Windows 10 when I have multiple monitors connected. It does however work perfectly fine on my Windows 7 partition on the exact same PC, regardless of the number of monitors used.

- My specs -
Zandronum: 3.0 (170901-1140)
OS: Windows 10 20H2 (19042.630)
CPU: Intel Core i5-6500 Skylake
RAM: 16 GB @ 2133 MHz (single stick)
GPU: AMD Radeon RX 580 (8 GB)
Monitors: 3 (2 DisplayPort, 1 HDMI) @ 144 Hz

I can confirm the same issue also occurs for a friend of mine, who has the exact same GPU as me (don't know his Windows 10 version, though).

Visual Vincent   
2021-02-23 21:54   
While we're waiting for this to get fixed I put together a small program with a slider that lets you change the Gamma on all your monitors. It's based on Zalewa's workaround using CreateDC() instead of GetDC() (thanks for finding that, by the way!)

I've tested it on my Windows 10 20H2 system and it appears to work with Zandronum: [^]