seerge / g-helper

Lightweight Armoury Crate alternative for Asus laptops and ROG Ally. Control tool for ROG Zephyrus G14, G15, G16, M16, Flow X13, Flow X16, TUF, Strix, Scar and other models
https://seerge.github.io/g-helper/
GNU General Public License v3.0
6.96k stars 254 forks source link

sRGB Color Gamut Clamp and Modern Standby Assist #520

Closed ModrnJosh closed 6 months ago

ModrnJosh commented 1 year ago

Hey there, as you might know, 2023 Asus ROG laptops now have an sRGB color gamut clamp (in GameVisual) which is extremely useful for creators not working in color-managed applications, or just people who don't like the wide-color-gamut look in Windows, so that you can more accurately reproduce sRGB.

Another new feature in 2023 Asus laptops is Modern Standby Assistant. This one I'm not sure how Asus makes it work, but basically it fixes the Modern Standby issue in which many laptops suffer from waking up, overheating, or running fans when they're supposed to be sleeping.

Would love if there were a way to implement/toggle these features in G-Helper! I would be happy to volunteer in pulling any code/ACPI stuff or whatever to assist as I have a 2023 Zephyrus G14.

seerge commented 1 year ago

@ModrnJosh Hello,

I know about sRGB, but don't know exactly how it does this.

  1. Can you check if your system has a separate sRGB color profile somewhere either in windows "Color Management" utility, or under C:\Windows\System32\spool\drivers\color ?
  2. There is a standalone app from Asus that can also switch profiles, can you check if in your case it sees sRGB ? (on G14 2022 it doesn't)
  3. It could be that sRGB can be turned somehow on "hardware" level (same as you would do it with external monitor onscreen menu). Then it would be some new endpoint in driver / bios. Can you do a dump like @vddCore explained here https://github.com/seerge/g-helper/issues/38#issuecomment-1502133557 and upload it here ?

As for Standby Assistant, what Asus says - that it puts laptop into hibernation after some time of a regular sleep: https://kmpic.asus.com/images/2023/01/05/3259ce3f-bf25-48c6-b126-083d4025adc0.png

If that's the only thing it does, then it's just a setting inside windows power plan

By default (even on G14 2022) that "feature" in power plan is ON. So laptop would hibernate in 2-3 hours of sleep. I can theoretically add it as extra "checkbox" somewhere in the app, but not sure if turning it OFF will benefit people :)

ModrnJosh commented 1 year ago

Ok cool, so I'm attaching some screenshots to better assist here. I did try the standalone GameVisual app and unfortunately it did not have this feature. It looks like when you change the color profile in Armoury Crate that the ICC profile magically appears at the top of that folder, and it also appears in Windows Color Management. However when you switch to a different color profile, the old one is now gone and only the new one that you've selected is visible in that folder and in Color Management. You cannot select it within Windows display settings either, it just shows up there only after it's been selected in Armoury Crate:

What Happens When You Select GameVisual Color Gamut Clamp

The one at the top is the currently selected gamut clamp in Armoury Crate:

Color ICC profiles in windows color folder

After selecting "P3" color gamut:

Color ICC profiles in windows Color Management - Only selected profile is shown in here

It makes it the default:

Color ICC profiles in windows Color Management - Selected profile becomes default

I'm also uploading the dsdt file here, let me know if that helps dsdt.zip

seerge commented 1 year ago

@ModrnJosh oke, thanks! Do you mind to share that sRGB color profile with me here ?

And it looks like it should be some hardware sRGB switch somewhere, similar to one for multizone miniled. I checked your dsdt dump, but I don't see anything that would scream to be sRGB switch out of the box.

However I have noticed 2 new endpoints (comparing to 2022 model) that I'm curios to check 0x0012007E and 0x0012007F. It's absolutely not necessarily that they are related to display at all just in case.

If ((IIA0 == 0x0012007E))
{
    Local0 = (IIA1 + 0x000A0000)
    ^^PCI0.SBRG.MDSA = Local0
    ^^PCI0.SBRG.MDSE = IIA2 /* \_SB_.ATKD.WMNB.IIA2 */
    Return (One)
}

If ((IIA0 == 0x0012007F))
{
    ^^PCI0.SBRG.MS02 (IIA0, IIA1)
    Return (One)
}

If you feel adventurous, on your own risk you can try to run following in powershell as admin (try to set Device_ID to 0x0012007E or to 0x0012007F and Control_status to 0 or 1 and see if it changes something in the system)

Invoke-CimMethod (Get-CimInstance -Namespace root/wmi -ClassName AsusAtkWmi_WMNB) -MethodName DEVS -Arguments @{Device_ID=0x0012007F; Control_status=1}

Generally speaking things like power limits or performance modes (that are set in similar way) reset after simple reboot, but anyway it's up to you to try or not :)

AudreyAP commented 1 year ago

My M16 2023 also has the SRGB/P3 etc options. Please let me know if I can provide anything to help figure out how this works.

@ModrnJosh Do you have any .icm files in your esupport folder? I have a folder called "ArmouryCrate ICM Config" but it is empty.

image
AudreyAP commented 1 year ago

As instructed above, here's my DSDT.DSL file:

M16 2023 DSDT.zip

seerge commented 1 year ago

@AudreyAP thanks, you also have those 0x0012007E + 0x0012007F endpoints. So you may also try command i linked in previous message if you want :)

AudreyAP commented 1 year ago

@seerge Cool!

Is there any way to make a "backup" of the current endpoint setting? Brand new laptop, would like to avoid experimenting without having a backup if possible haha.

seerge commented 1 year ago

@AudreyAP most of the settings (probably except turned off/on GPU) are being reset on reboot. So they are not stored permanently :)

In a worst case - you can do a hard reset but turning laptop off, then pressing and holding power button for 30 seconds and booting normally. It doesn't touch any data, just reset all "hardware" things (just in case this helps if your wifi has hanged and disappeared as it sometimes happens with mediatek cards)

AudreyAP commented 1 year ago

@seerge Ran command in PowerShell as admin:

PS C:\Windows\system32> Invoke-CimMethod (Get-CimInstance -Namespace root/wmi -ClassName AsusAtkWmi_WMNB) -MethodName DEVS -Arguments @{Device_ID=0x0012007F; Control_status=1}

result ReturnValue PSComputerName
------ ----------- --------------
     1        True

PS C:\Windows\system32> Invoke-CimMethod (Get-CimInstance -Namespace root/wmi -ClassName AsusAtkWmi_WMNB) -MethodName DEVS -Arguments @{Device_ID=0x0012007F; Control_status=0}

result ReturnValue PSComputerName
------ ----------- --------------
     1        True

PS C:\Windows\system32> Invoke-CimMethod (Get-CimInstance -Namespace root/wmi -ClassName AsusAtkWmi_WMNB) -MethodName DEVS -Arguments @{Device_ID=0x0012007E; Control_status=1}
Invoke-CimMethod : Generic failure
At line:1 char:1
+ Invoke-CimMethod (Get-CimInstance -Namespace root/wmi -ClassName Asus ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (AsusAtkWmi_WMNB...PNP0C14\ATK_0"):CimInstance) [Invoke-CimMethod], CimException
    + FullyQualifiedErrorId : HRESULT 0x80041001,Microsoft.Management.Infrastructure.CimCmdlets.InvokeCimMethodCommand

PS C:\Windows\system32> Invoke-CimMethod (Get-CimInstance -Namespace root/wmi -ClassName AsusAtkWmi_WMNB) -MethodName DEVS -Arguments @{Device_ID=0x0012007E; Control_status=0}
Invoke-CimMethod : Generic failure
At line:1 char:1
+ Invoke-CimMethod (Get-CimInstance -Namespace root/wmi -ClassName Asus ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (AsusAtkWmi_WMNB...PNP0C14\ATK_0"):CimInstance) [Invoke-CimMethod], CimException
    + FullyQualifiedErrorId : HRESULT 0x80041001,Microsoft.Management.Infrastructure.CimCmdlets.InvokeCimMethodCommand
```PS C:\Windows\system32> Invoke-CimMethod (Get-CimInstance -Namespace root/wmi -ClassName AsusAtkWmi_WMNB) -MethodName DEVS -Arguments @{Device_ID=0x0012007F; Control_status=1}

result ReturnValue PSComputerName
------ ----------- --------------
     1        True

PS C:\Windows\system32> Invoke-CimMethod (Get-CimInstance -Namespace root/wmi -ClassName AsusAtkWmi_WMNB) -MethodName DEVS -Arguments @{Device_ID=0x0012007F; Control_status=0}

result ReturnValue PSComputerName
------ ----------- --------------
     1        True

PS C:\Windows\system32> Invoke-CimMethod (Get-CimInstance -Namespace root/wmi -ClassName AsusAtkWmi_WMNB) -MethodName DEVS -Arguments @{Device_ID=0x0012007E; Control_status=1}
Invoke-CimMethod : Generic failure
At line:1 char:1
+ Invoke-CimMethod (Get-CimInstance -Namespace root/wmi -ClassName Asus ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (AsusAtkWmi_WMNB...PNP0C14\ATK_0"):CimInstance) [Invoke-CimMethod], CimException
    + FullyQualifiedErrorId : HRESULT 0x80041001,Microsoft.Management.Infrastructure.CimCmdlets.InvokeCimMethodCommand

PS C:\Windows\system32> Invoke-CimMethod (Get-CimInstance -Namespace root/wmi -ClassName AsusAtkWmi_WMNB) -MethodName DEVS -Arguments @{Device_ID=0x0012007E; Control_status=0}
Invoke-CimMethod : Generic failure
At line:1 char:1
+ Invoke-CimMethod (Get-CimInstance -Namespace root/wmi -ClassName Asus ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (AsusAtkWmi_WMNB...PNP0C14\ATK_0"):CimInstance) [Invoke-CimMethod], CimException
    + FullyQualifiedErrorId : HRESULT 0x80041001,Microsoft.Management.Infrastructure.CimCmdlets.InvokeCimMethodCommand

There was no visible change in the display, unfortunately.

seerge commented 1 year ago

@AudreyAP oke, thanks for trying. Probably it's something else (mb new power limit ? :)

Well, then for now, it's a bit difficult for me to (remotely and blindly) figure out how does sRGB switch works to be honest.

Mb just save that sRGB color profile somewhere, and try to force / import it again in color management tool ? :/

AudreyAP commented 1 year ago

This may not actually be necessary:

https://support.microsoft.com/en-us/windows/auto-color-management-in-windows-11-64a4de7f-9c93-43ec-bdf1-3b12ffa0870b

This is a new feature, currently in the "beta" or whatever channel Microsoft calls it - this should completely remove the need for profile switching.

This repo seems to have a tool to get it working:

https://github.com/dantmnf/MHC2

We should get this feature in the next big Windows update though?

EDIT: I figured it out. The second link is unrelated to the first. The second link is for MHC, a separate but useful feature that seems to be what ASUS is using here. Nothing is being done in hardware, they simply have a couple different profiles that they load and that MHC manages.

https://learn.microsoft.com/en-us/windows/win32/wcs/display-calibration-mhc

AudreyAP commented 1 year ago

@seerge Would you be at all interested in adding a mechanism to simply load different files into windows color management? The solution here seems to be switching between display modes w/ AC, copying the profiles out, then simply re-applying them after disabling AC.

(EDIT: Profiles are stored in C:\ProgramData\ASUS\GameVisual! No need to switch in AC This profile does not work, but profiles copied from C:\Windows\System32\spool\drivers\color after AC loads them work. I just copied it to my desktop, then added the file to color management. Colors change to match SRGB or P3 when switching it in the Windows display settings. AC seems to be dynamically generating these clamped files based on the input device profile?

image

)

Users could also use https://github.com/dantmnf/MHC2 to generate their own profiles if they have a colorimeter.

In my opinion, the best way to do this would be to add a (default hidden?) second row of buttons below the display refresh rate settings, allow users to enter a "title" for each button, and enter a path to an .icm file for each button. G-Helper simply then needs to use the windows API to load the .ICM file when a button is clicked, just like asus does.

One thing to consider is that you might need to re-apply the profile when switching between igpu and dgpu - ie if a user has selected one profile in dgpu mode, then switched to eco, then changed profiles, when they switch back to dgpu the dgpu "display" would have the first profile selected instead of the second.

You can just do this in windows with the default profile switcher, but opening up the menus is a pain in the butt and would not account for GPU switching. Would be really cool if you could implement it :)

ModrnJosh commented 1 year ago

@AudreyAP Great work looking into all of this! I can confirm that my ArmouryCrate ICM Config folder is also empty. But yeah reading into all that it seems to be what's happening here. If it's on the software-level like that then I hope it can be something that is implemented into G-Helper! Anything would be better than switching in Windows every time. Even opening Armoury Crate and switching there can be a bit tedious, but the feature itself is super useful.

AudreyAP commented 1 year ago

@ModrnJosh the setup process seems to erase some of the eSupport folder... I think I'm going to try to do a cloud recovery, then force shutdown the machine before it can actually unpack anything. That should give me the full esupport download with all of the raw files that Asus seems to delete after installation.

I'm just glad that Microsoft has finally done something about the atrocious color management system... It's unbelievable that it's taken this long!

seerge commented 1 year ago

@AudreyAP @ModrnJosh oke, thanks. I will look into that If I can find a way to "generate" color profiles on it's own (w/o AC)

Otherwise, I can add some option to link your own profiles and let users choose that, but I'm not sure of how many people will be able to use that scenario (i.e. edit configs / prepare profiles / etc).

AudreyAP commented 1 year ago

@seerge personally I would be very happy with just the ability to switch between currently existing profiles - there's no need to make ghelper compute them. Don't bother IMO, huge amount of work for no gain.

User can simply switch the profiles in AC, then copy them from the color folder after Asus generates them. Only need to do it once, then AC can be removed.

ModrnJosh commented 1 year ago

Completely agree with @AudreyAP here. Maybe it can have a quick FAQ or something in the readme on how to use it, but just the switcher itself would be the coolest part.

ModrnJosh commented 1 year ago

Oops, didn’t mean to close! Misinput, haha. But yeah I wouldn’t mind saving my ICC profiles in a separate folder at all if it meant I could switch on the fly in G-Helper. The one-time setup is well worth the benefit!

seerge commented 1 year ago

@ModrnJosh can you post your sRGB profile here? I wanted to check if it will work on 2022 model

AudreyAP commented 1 year ago

@seerge It will function (you will see some colors change) but the colors will probably be wrong. As far as I can tell the profiles are actually per-unit too?

ModrnJosh commented 1 year ago

Here's mine, but yeah @AudreyAP might be right. I wonder if it's tuned per-unit. ASUS_sRGB.zip

AudreyAP commented 1 year ago

After thinking about it, I think that the best way to do this would be to just have the user load profiles into Windows color management as normal and have G-Helper just switch between them just as you would in the windows display settings.

This way, you can keep the profiles available for use in other programs and avoid having to store them somewhere in the user folder - windows copies them to the color folder after they are "installed". All G-helper has to do is switch between the already-loaded profiles. G-helper would just have to have some way of also applying the "matching" profile when switching GPU - maybe user can define "pairs" of profiles, one for igpu and one for dgpu and g-helper can apply them when enabling and disabling?

seerge commented 1 year ago

Long story short, I looked in how to programmatically set set ICC color profiles (from a file) to be default in windows, it's actually not easy to do :)

It uses some ancient windows API https://learn.microsoft.com/en-us/windows/win32/api/icm/nf-icm-wcssetdefaultcolorprofile , and I can't find any good examples of how to use it. Few quick attempts to do that didn't work for me.

I assume if someone works with color, and really needs sRGB, they can simply switch with 2 clicks by running windows "Color Management" app.

Therefore I'm not sure if it's worth to spend like a lot of time, to implement a feature that will be used by one and a half users, while there are still features that will benefit lots of people.

I'm putting this on "hold" for now :)

AudreyAP commented 1 year ago

@seerge Is this example from DisplayCAL useful? You may have already found it...

https://github.com/sgulls/displaycal/blob/main/DisplayCAL/ICCProfile.py#L2268

If that's not helpful, I'm sure I can just map my aura key to open win11 settings to the color tab :)

seerge commented 1 year ago

@AudreyAP they also use that ancient windows api (And same method), but in different language (python) :) so not really useful

If you want to run color management app - just put "colorcpl" into custom command in g-helper settings

This is as close as you can get, without any programming :) I really doubt someone gonna switch between RGB and sRGB in mid-game :)

Screenshot 2023-06-06 221428

seerge commented 1 year ago

@ModrnJosh some update about second thing mentioned in this topic : "Modern Standby"

I don't know what exactly AC does by calling it "modern standby". But windows power plans have lots of hidden features (like disabling CPU boost is one of them).

Another - is to Hibernate (in sleep) after X minutes. You can either enable it for power plan manually via regedit https://www.tenforums.com/tutorials/108391-add-remove-hibernate-after-power-options-windows.html

Or just use G-Helper now ;) I have added control for that field in latest release https://github.com/seerge/g-helper/releases/tag/v0.108

Just set something like 20 or 30 minutes, and you should be good to go ;) Tested on my G14 2022/2023 works fine.

able1214 commented 1 year ago

I think the 8 modes/color gamut switching in GameVisual is related to ASUS Splendid as it used to be a separate application, now a part of ASUS Optimization which is a service installed along with AC. BCW4C5(GOTP@A)V~}2Y@RI3 Yea those 2 things are why I still keep AC, just to switch profiles since I always use Vivid and Display P3 as they are best for me. If these 2 features could be added I can finally remove AC completely.

AudreyAP commented 1 year ago

@able1214 you can just save the ICC files applied by AC, load them into windows color management as normal, and just pick them from the display settings in windows. Does the exact same thing as ac.

able1214 commented 1 year ago

@AudreyAP I tried, the screen color doesn't seem to change properly which AC does, did I do something wrong? Also if you want to change the 8 modes you have to download the separate GameVisual app which is ancient and buggy, it freezes few seconds even when you click anything...

seerge commented 1 year ago

@able1214

  1. Display P3 is a separate ICC profile. You need to select it in AC (not optimization servicve, as it has nothing to do with it), and then just export / save from windows Color management somewhere . And then you can use it.

  2. Vivid (same as all other 8 non color-space related modes) are actually just modified gamma / contrast / color setttings from windows/gpu driver. You can achieve them with Nvidia/AMD settings

able1214 commented 1 year ago

@seerge Yes I loaded them in color management, but setting anyone to default doesn't seem to change the color, in AC you will see the color changes right away W85W1IGI07 T0X2{GCRZEP6

seerge commented 1 year ago

@able1214 on your screenshot P3 is not default :) check what color management app shows when you set P3 in AC ?

able1214 commented 1 year ago

XZBCL8)G7@63I1%@0IHBAFR @seerge Yes, color management changes when I switch profiles in AC, but the thing is if I switch profiles in AC, it automatically deletes all other profiles I just loaded in color management as well as the ones installed in "C:\Windows\System32\spool\drivers\color" folder... If AC was uninstalled and only using color management, as I said at the start, the screen color doesn't change.

AudreyAP commented 1 year ago

@able1214 open windows display settings (right click on desktop) and change the profile to p3. You can't just load them, you need to apply them.

able1214 commented 1 year ago

@AudreyAP Yea I did, didn't work... NAA1)L6$U{M0W~3LMXV(@ 7 Don't know about others, no matter what I did, didn't work, it only works in AC.

seerge commented 1 year ago

@able1214 does SRGB make any difference ? if no - can you zip-upload it here ?

able1214 commented 1 year ago

@seerge icm.zip OK, now I'm actually comparing using testing pictures, switching to sRGB does work, but all the others doesn't, switching to them will be the same as default. I uploded all the profiles icluding the default.

able1214 commented 1 year ago

@seerge So while I was messing around with it, I found out in order to switch profiles, you need "GU604VI_10DE_B8511603.icm" in "C:\ProgramData\ASUS\GameVisual", without this file, AC will give you an error. Deleting all the other icm profiles doesn't seems to affect anyhing, looks like these files are not for my model? GE OQ 2{L2`8NXPCIG72@WI "GU604VI_10DE_B8511603_CMDEF.icm" is copied to "C:\Windows\System32\spool\drivers\color" by AC if you switch to default profile.

seerge commented 1 year ago

@able1214 because as I have mentioned, everything except color-space specific switch (sRGB in your case), is not a color profiles but just different gamma / contrast / saturation settings :)

https://github.com/seerge/g-helper#how-do-i-set-different-visual-styles

Vipxpert commented 11 months ago

Hi Seerge. I've noticed that when you change the gamut inside the Armoury Crate app, the file is actually replaced. For example, if I switch from sRGB, C:\Windows\System32\spool\drivers\color\ASUS_sRGB.icm will turn into C:\Windows\System32\spool\drivers\color\ASUS_DisplayP3.icm

Yep. The file is switched out and the previous profile disappears from the folder. That's why windows's stock profile changer doesn't work. Hope this is helpful

seerge commented 11 months ago

@Vipxpert hello, as pretty much discussed in this topic - you can just save both files, import them (manually) into windows Color Management app and then just switch there (or via settings -> display) :)

MaxLebled commented 10 months ago

Regarding sRGB gamut clamping, while the screen is being driven by a Nvidia dGPU, I would recommend you use this software instead of the ICC/ICM files:

https://github.com/ledoge/novideo_srgb

On my device, I use the color profile file with the iGPU, and this software with the dGPU. I do notice that darker grays tend to be a bit too warm & pinkish with the color profile, while everything looks great with novideo_srgb. Of course, that's very subjective and most likely up to individual units.

However, it also happens to be the only way I've found to bypass the issue of omnipresent black crush while the screen is driven by the Nvidia dGPU (whether it's through "Ultimate" GPU mode, or "Advanced Optimus"). I've written about it in my review of the 2023 G14 here. This issue seems to be affecting other ASUS ROG laptops, and it's there from the get-go with a completely fresh OS install (from ASUS Cloud Recovery)

AudreyAP commented 10 months ago

@MaxLebled Have you tried "automatically manage colour for apps" in advanced display settings? It's relatively new and should result in perfect colours across the board.

blackgold9 commented 8 months ago

@Vipxpert hello, as pretty much discussed in this topic - you can just save both files, import them (manually) into windows Color Management app and then just switch there (or via settings -> display) :)

Does this work for folks? I tried it, I copied all the profiles, but switching between them brings no change i can see, whereas doing it in AC does have an effect.

nathancdy commented 6 months ago

@blackgold9 As also said in previous replies , only the sRGB ICC works for me (Native is always there by default)

seerge commented 6 months ago

@nathancdy correct

Cause (by my observations) only sRGB has a seprate color profile as this is the only "real" different visual mode. Rest are just slightly shifted gamma-settings (like a bit brighter, a bit more contrasty, etc) :)

seerge commented 6 months ago

@ModrnJosh @AudreyAP @nathancdy @MaxLebled @able1214 and others

Actually as a result of doing something else, I have managed to figure out how to install and enable sRGB color profile (the only one that actually changes the way display looks like)

You can try this build with sRGB checkbox in it. If you don't have sRGB profile installed at all, app would use the one from the zip (so make sure to unzip it to the same folder with exe).

sRGB profile I used is from @ModrnJosh (i.e. form G14 2023 with MiniLED)

GHelper.zip

If this works, I will have to face another problem - where to get all those different sRGB profiles for each device. I can host them on Github and let app download them, but it can be a very difficult task tho :)

ModrnJosh commented 6 months ago

@seerge Just tried it and it works. Colors clamp to sRGB correctly. Looks to be the same as when I do it manually in Windows. Great work!

seerge commented 6 months ago

@ModrnJosh @AudreyAP @nathancdy @MaxLebled @able1214 and others

Please find a build that can set all possible gamuts (Native / sRGB / DCIP3 / DisplayP3) and all available Visual Modes

Build will work only if appropriate ICM color profiles are located under C:\ProgramData\ASUS\GameVisual

GHelper.zip

nathancdy commented 6 months ago

@seerge Working for me! DCI-P3 finally works the way it did in AC!