dantmnf / MHC2

information about next generation color management in Windows
The Unlicense
155 stars 7 forks source link

Proper way to enable ACM with modified profile? #10

Open albertofustinoni opened 1 year ago

albertofustinoni commented 1 year ago

I have a ROG Zephirs G14 (2022 model) with a wide color gamut display (close to full DCI-P3 coverage) but no HDR.

Given that I have a colorimeter, what is the proper way to enable ACM in Windows 11? What I tried so far is:

  1. Created an ICC profile with DisplayCal (default settings)
  2. Converted it using mhc2gen sdr-acm <icc-file-path> <acm-icc-path>
  3. Right click the icc file, install
  4. In the Color Managment applet, go to system defaults and add the profile to the display (only one listed)
  5. Reboot

At this point I was expecting to see the Automatically manage color for apps toggle in Settings->Display->Advanced Display Options, but it was not there. Color profile for the display was listed as expected though.

To get the toggle to show I had to create a EnableAcmSupportDeveloperPreview key in the registry at HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\GraphicsDrivers.

Is this right? I thought the whole point of running mhc2gen was to add whatever tags windows expects in an icc profile to enable ACM without forcing it via the developer toggle.

Also, what does --calibrate-transfer do when performing the conversion? Is it meant to be used only on SRGB displays or wide color gamut ones?

dantmnf commented 1 year ago

I thought the whole point of running mhc2gen was to add whatever tags windows expects in an icc profile to enable ACM without forcing it via the developer toggle.

The ICC profile is used to override display characteristics in EDID, which is not always accurate in budget devices, and additionally calibrate the display to an ideal state (in native gamut). In short, it is optional.

The EnableAcmSupportDeveloperPreview registry requirement is removed in build 25309. If you are running an older build, it is required to enable ACM feature.

Also, what does --calibrate-transfer do when performing the conversion? Is it meant to be used only on SRGB displays or wide color gamut ones?

Currently ACM expects the display have sRGB gamma response. If you choosed other calibration target when creating ICC profile, you can use --calibrate-transfer to convert the gamma calibration to sRGB.

schm1dtxbox commented 1 year ago

For devices that do legitimately have ACM on build 22621, like the Surface Pro 9, they actually depend on the the presence of an alternative registry DWORD, MicrosoftApprovedAcmSupport, being present and set to 1. That DWORD needs to be present in the following regkey: HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Class\{4d36e96e-e325-11ce-bfc1-08002be10318}\000x with 000x being the index of the currently active/desired display (e.g. 0001 would be valid). This appears to be set by the OEM during device provisioning, and doesn't rely on a valid MHC2 color profile's presence interestingly enough.

riverar commented 1 year ago

You may also need to enable feature 24316826 (AutoColorManagementEnabled).

Other interesting features that may also apply:

clang88 commented 4 months ago

For devices that do legitimately have ACM on build 22621, like the Surface Pro 9, they actually depend on the the presence of an alternative registry DWORD, MicrosoftApprovedAcmSupport, being present and set to 1. That DWORD needs to be present in the following regkey: HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Class\{4d36e96e-e325-11ce-bfc1-08002be10318}\000x with 000x being the index of the currently active/desired display (e.g. 0001 would be valid). This appears to be set by the OEM during device provisioning, and doesn't rely on a valid MHC2 color profile's presence interestingly enough.

The only way I could get Automatically manage color for apps show for me, was this registry key. Is this expected with Windows 11 build 22631 (23H2)?

I've found the behaviour to be a bit strange, when I enable it on multiple monitors. One issue I am having with the profiles is particularly strange: I have two monitors which I would like to use ACM for. I created a separated SDR-ACM profile for both and added them as a standard profile.

  1. AOC 24G: SDR-ACM AOC 24G sRGB.icm
  2. VE228: SDR-ACM VE228 sRGB.icm

However, oddly enough, when I disable the VE228 Monitor, suddently the AOC monitor is assigned the VE228 profile, which is completely off. So basicly it becomes this:

  1. AOC 24G: SDR-ACM VE228 sRGB.icm

I can also not select the correct profile in Display settings. Strangly enough, this is not reflected in the color management window when using windows to calibrate the displays., i.e. there the profiles are still listed correctly for the AOC 24G. Adding a new profile there is also not added to the selection. DisplayCAL Profile Loader shows the correct display profiles, but when I try to make it load a profile by double-clicking the profile, it is always as an "Advanced" profile to the AOC 24G and disappears from the list of profiles in DisplayCAL Profile Loader.

Can anyone confirm this behavior with multiple monitors and Build 22631? What would be the right way to add the profiles? Is there an alternative to the windows color management app (like DisplayCAL Profile Loader) that actually works with ACM? How are is everyone doing this?