mirror of
https://github.com/Maassoft/ColorControl.git
synced 2026-10-21 08:09:49 -05:00
fix LG connection issues, improve color temperature setting, add rBAR driver settings
This commit is contained in:
1 parent
c85b33127b
commit
57a6a36d9b
21 files changed
+296
-64
No files matched your search
@@ -7,11 +7,13 @@
|
||||
public Config Config { get; private set; }
|
||||
|
||||
public StartUpParams StartUpParams { get; private set; }
|
||||
public string DataPath { get; private set; }
|
||||
|
||||
public AppContext(Config config, StartUpParams startUpParams)
|
||||
public AppContext(Config config, StartUpParams startUpParams, string dataPath)
|
||||
{
|
||||
Config = config;
|
||||
StartUpParams = startUpParams;
|
||||
DataPath = dataPath;
|
||||
|
||||
CurrentContext = this;
|
||||
}
|
||||
|
||||
@@ -19,8 +19,8 @@
|
||||
<PublisherName>Maassoft</PublisherName>
|
||||
<Company>Maassoft</Company>
|
||||
<ApplicationRevision>0</ApplicationRevision>
|
||||
<ApplicationVersion>8.3.0.0</ApplicationVersion>
|
||||
<Version>8.3.0.0</Version>
|
||||
<ApplicationVersion>8.4.0.0</ApplicationVersion>
|
||||
<Version>8.4.0.0</Version>
|
||||
<UseApplicationTrust>false</UseApplicationTrust>
|
||||
<PublishWizardCompleted>true</PublishWizardCompleted>
|
||||
<BootstrapperEnabled>false</BootstrapperEnabled>
|
||||
|
||||
Generated
+2
-2
@@ -773,7 +773,6 @@
|
||||
this.lvNvPresets.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3);
|
||||
this.lvNvPresets.MultiSelect = false;
|
||||
this.lvNvPresets.Name = "lvNvPresets";
|
||||
this.lvNvPresets.ShowItemToolTips = true;
|
||||
this.lvNvPresets.Size = new System.Drawing.Size(1098, 415);
|
||||
this.lvNvPresets.TabIndex = 0;
|
||||
this.lvNvPresets.UseCompatibleStateImageBehavior = false;
|
||||
@@ -1836,7 +1835,8 @@
|
||||
"Power on even after manual power off",
|
||||
"Allow triggers to be fired for this device",
|
||||
"Use Windows power settings to power on",
|
||||
"Use Windows power settings to power off"});
|
||||
"Use Windows power settings to power off",
|
||||
"Use secure connection"});
|
||||
this.clbLgPower.Location = new System.Drawing.Point(6, 70);
|
||||
this.clbLgPower.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3);
|
||||
this.clbLgPower.MultiColumn = true;
|
||||
|
||||
+29
-20
@@ -9,6 +9,7 @@ using ColorControl.Services.LG;
|
||||
using ColorControl.Services.NVIDIA;
|
||||
using ColorControl.Svc;
|
||||
using LgTv;
|
||||
using Microsoft.Extensions.DependencyInjection;
|
||||
using NLog;
|
||||
using nspector;
|
||||
using nspector.Common;
|
||||
@@ -193,7 +194,8 @@ namespace ColorControl
|
||||
{
|
||||
//throw new Exception("bla");
|
||||
Logger.Debug("Initializing NVIDIA...");
|
||||
_nvService = new NvService(_dataDir);
|
||||
var appContextProvider = Program.ServiceProvider.GetRequiredService<AppContextProvider>();
|
||||
_nvService = new NvService(appContextProvider);
|
||||
FillNvPresets();
|
||||
Logger.Debug("Initializing NVIDIA...Done.");
|
||||
|
||||
@@ -220,7 +222,8 @@ namespace ColorControl
|
||||
{
|
||||
try
|
||||
{
|
||||
_amdService = new AmdService(_dataDir);
|
||||
var appContextProvider = Program.ServiceProvider.GetRequiredService<AppContextProvider>();
|
||||
_amdService = new AmdService(appContextProvider);
|
||||
FillAmdPresets();
|
||||
|
||||
InitSortState(lvAmdPresets, _config.AmdPresetsSortState);
|
||||
@@ -241,7 +244,8 @@ namespace ColorControl
|
||||
{
|
||||
try
|
||||
{
|
||||
_gameService = new GameService(_dataDir, HandleExternalServiceForLgDevice);
|
||||
var appContextProvider = Program.ServiceProvider.GetRequiredService<AppContextProvider>();
|
||||
_gameService = new GameService(appContextProvider, HandleExternalServiceForLgDevice);
|
||||
FillGamePresets();
|
||||
|
||||
InitSortState(lvGamePresets, _config.GamePresetsSortState);
|
||||
@@ -274,7 +278,9 @@ namespace ColorControl
|
||||
{
|
||||
try
|
||||
{
|
||||
_lgService = new LgService(_dataDir, StartUpParams.RunningFromScheduledTask);
|
||||
var appContextProvider = Program.ServiceProvider.GetRequiredService<AppContextProvider>();
|
||||
|
||||
_lgService = new LgService(appContextProvider, StartUpParams.RunningFromScheduledTask);
|
||||
_lgService.RefreshDevices(afterStartUp: true).ContinueWith((_) => BeginInvoke(() => AfterLgServiceRefreshDevices()));
|
||||
_lgService.SelectedDeviceChangedEvent += _lgService_SelectedDeviceChangedEvent;
|
||||
|
||||
@@ -1933,7 +1939,8 @@ NOTE: installing the service may cause a User Account Control popup.");
|
||||
clbLgPower.SetItemChecked(6, device?.PowerOnAfterManualPowerOff ?? false);
|
||||
clbLgPower.SetItemChecked(7, device?.TriggersEnabled ?? true);
|
||||
clbLgPower.SetItemChecked(8, device?.PowerOffByWindows ?? false);
|
||||
clbLgPower.SetItemChecked(8, device?.PowerOnByWindows ?? false);
|
||||
clbLgPower.SetItemChecked(9, device?.PowerOnByWindows ?? false);
|
||||
clbLgPower.SetItemChecked(10, device?.UseSecureConnection ?? false);
|
||||
}
|
||||
finally
|
||||
{
|
||||
@@ -2123,7 +2130,7 @@ NOTE: installing the service may cause a User Account Control popup.");
|
||||
}
|
||||
try
|
||||
{
|
||||
var result = _nvService.ApplyPreset(preset, Program.AppContext);
|
||||
var result = _nvService.ApplyPreset(preset);
|
||||
if (!result)
|
||||
{
|
||||
throw new Exception("Error while applying NVIDIA preset. At least one setting could not be applied. Check the log for details.");
|
||||
@@ -2476,8 +2483,14 @@ You can also activate this option by using the Expert-button and selecting Wake-
|
||||
device.TriggersEnabled = clbLgPower.GetItemChecked(7);
|
||||
device.PowerOffByWindows = clbLgPower.GetItemChecked(8);
|
||||
device.PowerOnByWindows = clbLgPower.GetItemChecked(9);
|
||||
device.UseSecureConnection = clbLgPower.GetItemChecked(10);
|
||||
|
||||
_lgService.InstallEventHandlers();
|
||||
|
||||
if (e.Index == 10)
|
||||
{
|
||||
_lgService.RefreshDevices().ContinueWith((_) => BeginInvoke(() => FillLgDevices()));
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@@ -2550,10 +2563,15 @@ Do you want to continue?";
|
||||
|
||||
private void MainForm_Activated(object sender, EventArgs e)
|
||||
{
|
||||
UpdateDisplayInfoItems();
|
||||
UpdateDisplayInfoItemsAmd();
|
||||
|
||||
if (tcMain.SelectedTab == tabLog)
|
||||
if (tcMain.SelectedTab == tabNVIDIA)
|
||||
{
|
||||
UpdateDisplayInfoItems();
|
||||
}
|
||||
else if (tcMain.SelectedTab == tabAMD)
|
||||
{
|
||||
UpdateDisplayInfoItemsAmd();
|
||||
}
|
||||
else if (tcMain.SelectedTab == tabLog)
|
||||
{
|
||||
LoadLog();
|
||||
}
|
||||
@@ -4592,26 +4610,17 @@ Currently ColorControl is {(Utils.IsAdministrator() ? "" : "not ")}running as ad
|
||||
point.X += 10;
|
||||
point.Y += 0;
|
||||
|
||||
lvNvPresetsToolTip.Active = false;
|
||||
if (index >= 0)
|
||||
{
|
||||
if (lvNvPresetsToolTip.Active)
|
||||
{
|
||||
lvNvPresetsToolTip.Active = false;
|
||||
}
|
||||
|
||||
lvNvPresetsToolTip.Active = true;
|
||||
lvNvPresetsToolTip.Show("", lvNvPresets, point);
|
||||
lvNvPresetsToolTip.Show(text, lvNvPresets, point);
|
||||
}
|
||||
else
|
||||
{
|
||||
lvNvPresetsToolTip.Active = false;
|
||||
}
|
||||
}
|
||||
|
||||
private void lvNvPresets_MouseLeave(object sender, EventArgs e)
|
||||
{
|
||||
lvNvPresetsToolTip.Active = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
+27
-5
@@ -1,6 +1,7 @@
|
||||
using ColorControl.Common;
|
||||
using ColorControl.Forms;
|
||||
using ColorControl.Services.AMD;
|
||||
using ColorControl.Services.Common;
|
||||
using ColorControl.Services.LG;
|
||||
using ColorControl.Services.NVIDIA;
|
||||
using ColorControl.Svc;
|
||||
@@ -53,8 +54,13 @@ namespace ColorControl
|
||||
Logger.Debug($"Using data path: {DataDir}");
|
||||
//Logger.Debug("Parent process: " + Process.GetCurrentProcess().Parent()?.ProcessName);
|
||||
|
||||
var host = CreateHostBuilder().Build();
|
||||
ServiceProvider = host.Services;
|
||||
|
||||
if (runAsService)
|
||||
{
|
||||
AppContext = new AppContext(null, new StartUpParams(), DataDir);
|
||||
|
||||
Utils.WaitForTask(RunService(args));
|
||||
return;
|
||||
}
|
||||
@@ -76,7 +82,7 @@ namespace ColorControl
|
||||
|
||||
var startUpParams = StartUpParams.Parse(args);
|
||||
|
||||
AppContext = new AppContext(Config, startUpParams);
|
||||
AppContext = new AppContext(Config, startUpParams, DataDir);
|
||||
|
||||
var existingProcess = Utils.GetProcessByName("ColorControl");
|
||||
|
||||
@@ -122,10 +128,10 @@ namespace ColorControl
|
||||
_mainForm = new MainForm(AppContext);
|
||||
Application.Run(_mainForm);
|
||||
|
||||
//if (Debugger.IsAttached && !IsRestarting)
|
||||
//{
|
||||
// Utils.StopService();
|
||||
//}
|
||||
if (Debugger.IsAttached && !IsRestarting)
|
||||
{
|
||||
Utils.StopService();
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
@@ -339,6 +345,16 @@ namespace ColorControl
|
||||
}
|
||||
}
|
||||
|
||||
public static IServiceProvider ServiceProvider { get; private set; }
|
||||
private static IHostBuilder CreateHostBuilder()
|
||||
{
|
||||
return Host.CreateDefaultBuilder()
|
||||
.ConfigureServices((context, services) =>
|
||||
{
|
||||
//services.AddSingleton<NvService>();
|
||||
services.RegisterSharedServices();
|
||||
});
|
||||
}
|
||||
private static async Task RunService(string[] args)
|
||||
{
|
||||
Logger.Debug("RUNNING SERVICE");
|
||||
@@ -350,6 +366,7 @@ namespace ColorControl
|
||||
})
|
||||
.ConfigureServices(services =>
|
||||
{
|
||||
services.RegisterSharedServices();
|
||||
services.AddHostedService<ColorControlBackgroundService>();
|
||||
})
|
||||
.Build();
|
||||
@@ -357,6 +374,11 @@ namespace ColorControl
|
||||
await host.RunAsync();
|
||||
}
|
||||
|
||||
private static void RegisterSharedServices(this IServiceCollection services)
|
||||
{
|
||||
services.AddSingleton<AppContextProvider>();
|
||||
}
|
||||
|
||||
public static int EnumThreadWindows(IntPtr handle, IntPtr param)
|
||||
{
|
||||
NativeMethods.SendMessageW(handle, Utils.WM_BRINGTOFRONT, UIntPtr.Zero, IntPtr.Zero);
|
||||
|
||||
@@ -139,6 +139,8 @@ namespace ATI.ADL
|
||||
/// <summary> ADL Class</summary>
|
||||
internal static class ADL
|
||||
{
|
||||
private static readonly NLog.Logger Logger = NLog.LogManager.GetCurrentClassLogger();
|
||||
|
||||
#region Internal Constant
|
||||
/// <summary> Define the maximum path</summary>
|
||||
internal const int ADL_MAX_PATH = 256;
|
||||
@@ -380,7 +382,10 @@ namespace ATI.ADL
|
||||
}
|
||||
}
|
||||
|
||||
throw new InvalidProgramException("ADL-function not supported");
|
||||
Logger.Error($"ADL-function not supported: {type.Name}");
|
||||
|
||||
return null;
|
||||
//throw new InvalidProgramException("ADL-function not supported");
|
||||
}
|
||||
|
||||
#endregion Export Functions
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
using ATI.ADL;
|
||||
using ColorControl.Common;
|
||||
using ColorControl.Services.Common;
|
||||
using Microsoft.Extensions.DependencyInjection;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
@@ -14,9 +15,11 @@ namespace ColorControl.Services.AMD
|
||||
|
||||
public override string ServiceName => "AMD";
|
||||
|
||||
protected override string PresetsBaseFilename => "AmdPresets.json";
|
||||
|
||||
private ADLDisplayInfo _currentDisplay;
|
||||
|
||||
public AmdService(string dataPath) : base(dataPath, "AmdPresets.json")
|
||||
public AmdService(AppContextProvider appContextProvider) : base(appContextProvider)
|
||||
{
|
||||
LoadPresets();
|
||||
}
|
||||
@@ -25,7 +28,9 @@ namespace ColorControl.Services.AMD
|
||||
{
|
||||
try
|
||||
{
|
||||
var service = new AmdService(Program.DataDir);
|
||||
var appContextProvider = Program.ServiceProvider.GetRequiredService<AppContextProvider>();
|
||||
|
||||
var service = new AmdService(appContextProvider);
|
||||
|
||||
var result = service.ApplyPreset(idOrName);
|
||||
|
||||
|
||||
@@ -0,0 +1,11 @@
|
||||
namespace ColorControl.Services.Common
|
||||
{
|
||||
public class AppContextProvider
|
||||
{
|
||||
public AppContext GetAppContext()
|
||||
{
|
||||
return Program.AppContext;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@@ -14,7 +14,7 @@ namespace ColorControl.Services.Common
|
||||
{
|
||||
private static readonly NLog.Logger Logger = NLog.LogManager.GetCurrentClassLogger();
|
||||
|
||||
public GraphicsService(string dataPath, string presetsBaseFilename) : base(dataPath, presetsBaseFilename)
|
||||
public GraphicsService(AppContextProvider appContextProvider) : base(appContextProvider)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
@@ -16,9 +16,9 @@ namespace ColorControl.Services.Common
|
||||
{
|
||||
get;
|
||||
}
|
||||
protected abstract string PresetsBaseFilename { get; }
|
||||
|
||||
protected string _dataPath;
|
||||
protected string _presetsBaseFilename;
|
||||
protected string _presetsFilename;
|
||||
protected string _presetsBackupFilename;
|
||||
protected bool _initialized = false;
|
||||
@@ -26,12 +26,14 @@ namespace ColorControl.Services.Common
|
||||
protected T _lastAppliedPreset;
|
||||
protected string _loadPresetsError;
|
||||
|
||||
protected AppContextProvider _appContextProvider;
|
||||
|
||||
private List<JsonConverter> _jsonConverters;
|
||||
|
||||
public ServiceBase(string dataPath, string presetsBaseFilename)
|
||||
public ServiceBase(AppContextProvider appContextProvider)
|
||||
{
|
||||
_dataPath = dataPath;
|
||||
_presetsBaseFilename = presetsBaseFilename;
|
||||
_appContextProvider = appContextProvider;
|
||||
_dataPath = appContextProvider.GetAppContext().DataPath;
|
||||
_jsonConverters = new List<JsonConverter>();
|
||||
|
||||
Initialize();
|
||||
@@ -99,8 +101,8 @@ namespace ColorControl.Services.Common
|
||||
|
||||
protected void LoadPresets()
|
||||
{
|
||||
_presetsFilename = Path.Combine(_dataPath, _presetsBaseFilename);
|
||||
_presetsBackupFilename = Path.Combine(_dataPath, $"{_presetsBaseFilename}.backup");
|
||||
_presetsFilename = Path.Combine(_dataPath, PresetsBaseFilename);
|
||||
_presetsBackupFilename = Path.Combine(_dataPath, $"{PresetsBaseFilename}.backup");
|
||||
|
||||
try
|
||||
{
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
using ColorControl.Common;
|
||||
using ColorControl.Services.Common;
|
||||
using Microsoft.Extensions.DependencyInjection;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics;
|
||||
@@ -14,9 +15,11 @@ namespace ColorControl.Services.GameLauncher
|
||||
|
||||
public override string ServiceName => "Game";
|
||||
|
||||
protected override string PresetsBaseFilename => "GamePresets.json";
|
||||
|
||||
private Func<string, string[], bool> _externalServiceHandler;
|
||||
|
||||
public GameService(string dataPath, Func<string, string[], bool> externalServiceHandler = null) : base(dataPath, "GamePresets.json")
|
||||
public GameService(AppContextProvider appContextProvider, Func<string, string[], bool> externalServiceHandler = null) : base(appContextProvider)
|
||||
{
|
||||
LoadPresets();
|
||||
_externalServiceHandler = externalServiceHandler;
|
||||
@@ -26,7 +29,9 @@ namespace ColorControl.Services.GameLauncher
|
||||
{
|
||||
try
|
||||
{
|
||||
var service = new GameService(Program.DataDir);
|
||||
var appContextProvider = Program.ServiceProvider.GetRequiredService<AppContextProvider>();
|
||||
|
||||
var service = new GameService(appContextProvider);
|
||||
|
||||
var result = service.ApplyPreset(idOrName);
|
||||
|
||||
|
||||
@@ -87,6 +87,8 @@ namespace ColorControl.Services.LG
|
||||
public bool TriggersEnabled { get; set; }
|
||||
public int HDMIPortNumber { get; set; }
|
||||
|
||||
public bool UseSecureConnection { get; set; } = true;
|
||||
|
||||
private List<string> _actionsForGameBar;
|
||||
|
||||
public List<string> ActionsOnGameBar
|
||||
@@ -165,7 +167,7 @@ namespace ColorControl.Services.LG
|
||||
AddGenericPictureAction("colorGamut", typeof(ColorGamut), title: "Color Gamut");
|
||||
AddGenericPictureAction("dynamicContrast", typeof(OffToHigh), title: "Dynamic Contrast");
|
||||
AddGenericPictureAction("gamma", typeof(GammaExp));
|
||||
AddGenericPictureAction("colorTemperature", minValue: 0, maxValue: 50, title: "Color Temperature");
|
||||
AddGenericPictureAction("colorTemperature", minValue: -50, maxValue: 50, title: "Color Temperature");
|
||||
AddGenericPictureAction("whiteBalanceColorTemperature", typeof(WhiteBalanceColorTemperature), title: "White Balance Color Temperature");
|
||||
AddGenericPictureAction("eyeComfortMode", typeof(OffToOn), title: "Eye Comfort Mode");
|
||||
//AddGenericPictureAction("dynamicColor", typeof(OffToAuto));
|
||||
@@ -347,7 +349,7 @@ namespace ColorControl.Services.LG
|
||||
try
|
||||
{
|
||||
DisposeConnection();
|
||||
_lgTvApi = await LgTvApi.CreateLgTvApi(IpAddress, retries);
|
||||
_lgTvApi = await LgTvApi.CreateLgTvApi(IpAddress, retries, UseSecureConnection);
|
||||
|
||||
//Test();
|
||||
//_lgTvApi.Test3();
|
||||
|
||||
@@ -3,6 +3,7 @@ using ColorControl.Forms;
|
||||
using ColorControl.Services.Common;
|
||||
using ColorControl.Svc;
|
||||
using LgTv;
|
||||
using Microsoft.Extensions.DependencyInjection;
|
||||
using Microsoft.Win32;
|
||||
using Newtonsoft.Json;
|
||||
using NWin32;
|
||||
@@ -71,6 +72,8 @@ namespace ColorControl.Services.LG
|
||||
public LgServiceConfig Config { get; private set; }
|
||||
public ProcessMonitorContext MonitorContext { get; private set; }
|
||||
|
||||
protected override string PresetsBaseFilename => "LgPresets.json";
|
||||
|
||||
private string _configFilename;
|
||||
private bool _allowPowerOn;
|
||||
private LgDevice _selectedDevice;
|
||||
@@ -85,7 +88,7 @@ namespace ColorControl.Services.LG
|
||||
private LgPreset _lastTriggeredPreset;
|
||||
private RestartDetector _restartDetector;
|
||||
|
||||
public LgService(string dataPath, bool allowPowerOn) : base(dataPath, "LgPresets.json")
|
||||
public LgService(AppContextProvider appContextProvider, bool allowPowerOn) : base(appContextProvider)
|
||||
{
|
||||
_allowPowerOn = allowPowerOn;
|
||||
|
||||
@@ -107,7 +110,9 @@ namespace ColorControl.Services.LG
|
||||
{
|
||||
try
|
||||
{
|
||||
var lgService = new LgService(Program.DataDir, true);
|
||||
var appContextProvider = Program.ServiceProvider.GetRequiredService<AppContextProvider>();
|
||||
|
||||
var lgService = new LgService(appContextProvider, true);
|
||||
await lgService.RefreshDevices(afterStartUp: true);
|
||||
|
||||
var result = await lgService.ApplyPreset(presetName);
|
||||
|
||||
@@ -1,9 +1,13 @@
|
||||
using ColorControl.Common;
|
||||
using ColorControl.Forms;
|
||||
using ColorControl.Services.Common;
|
||||
using ColorControl.Svc;
|
||||
using Microsoft.Extensions.DependencyInjection;
|
||||
using nspector.Common;
|
||||
using nspector.Common.Meta;
|
||||
using NvAPIWrapper.Display;
|
||||
using NvAPIWrapper.GPU;
|
||||
using NvAPIWrapper.Native;
|
||||
using NvAPIWrapper.Native.Display;
|
||||
using NvAPIWrapper.Native.GPU.Structures;
|
||||
using NWin32.NativeTypes;
|
||||
@@ -13,6 +17,8 @@ using System.ComponentModel;
|
||||
using System.Linq;
|
||||
using System.Runtime.InteropServices;
|
||||
using System.Threading;
|
||||
using static NvAPIWrapper.Native.GPU.Structures.PerformanceStates20ClockEntryV1;
|
||||
using static NvAPIWrapper.Native.GPU.Structures.PrivateClockBoostLockV2;
|
||||
|
||||
namespace ColorControl.Services.NVIDIA
|
||||
{
|
||||
@@ -83,6 +89,8 @@ namespace ColorControl.Services.NVIDIA
|
||||
|
||||
public override string ServiceName => "NVIDIA";
|
||||
|
||||
protected override string PresetsBaseFilename => "NvPresets.json";
|
||||
|
||||
private Display _currentDisplay;
|
||||
private string _baseProfileName = "";
|
||||
|
||||
@@ -104,9 +112,29 @@ namespace ColorControl.Services.NVIDIA
|
||||
public const uint DRS_TEXTURE_FILTERING_QUALITY = 0x00CE2691;
|
||||
public const uint DRS_TEXTURE_FILTERING_NEGATIVE_LOD_BIAS = 0x0019BB68;
|
||||
|
||||
private static readonly List<uint> _driverSettingIds = new() { DRS_GSYNC_APPLICATION_MODE, DRS_VSYNC_CONTROL, DRS_PRERENDERED_FRAMES, DRS_FRAME_RATE_LIMITER_V3, DRS_ANISOTROPIC_FILTERING_SETTING, DRS_ANISOTROPIC_FILTER_OPTIMIZATION, DRS_TEXTURE_FILTERING_QUALITY, DRS_TEXTURE_FILTERING_NEGATIVE_LOD_BIAS, DRS_ANISOTROPIC_FILTER_SAMPLE_OPTIMIZATION };
|
||||
public const uint DRS_RBAR_FEATURE = 0X000F00BA;
|
||||
public const uint DRS_RBAR_OPTIONS = 0X000F00BB;
|
||||
public const uint DRS_RBAR_SIZE_LIMIT = 0X000F00FF;
|
||||
|
||||
public NvService(string dataPath) : base(dataPath, "NvPresets.json")
|
||||
private static readonly List<uint> _driverSettingIds = new()
|
||||
{
|
||||
DRS_GSYNC_APPLICATION_MODE,
|
||||
DRS_VSYNC_CONTROL,
|
||||
DRS_PRERENDERED_FRAMES,
|
||||
DRS_FRAME_RATE_LIMITER_V3,
|
||||
DRS_ANISOTROPIC_FILTERING_SETTING,
|
||||
DRS_ANISOTROPIC_FILTER_OPTIMIZATION,
|
||||
DRS_TEXTURE_FILTERING_QUALITY,
|
||||
DRS_TEXTURE_FILTERING_NEGATIVE_LOD_BIAS,
|
||||
DRS_ANISOTROPIC_FILTER_SAMPLE_OPTIMIZATION,
|
||||
DRS_RBAR_FEATURE,
|
||||
DRS_RBAR_OPTIONS,
|
||||
DRS_RBAR_SIZE_LIMIT
|
||||
};
|
||||
|
||||
private static NvService ServiceInstance;
|
||||
|
||||
public NvService(AppContextProvider appContextProvider) : base(appContextProvider)
|
||||
{
|
||||
NvPreset.NvService = this;
|
||||
|
||||
@@ -119,7 +147,9 @@ namespace ColorControl.Services.NVIDIA
|
||||
{
|
||||
try
|
||||
{
|
||||
var nvService = new NvService(Program.DataDir);
|
||||
var appContextProvider = Program.ServiceProvider.GetRequiredService<AppContextProvider>();
|
||||
|
||||
var nvService = new NvService(appContextProvider);
|
||||
|
||||
var result = nvService.ApplyPreset(idOrName);
|
||||
|
||||
@@ -216,7 +246,7 @@ namespace ColorControl.Services.NVIDIA
|
||||
var preset = GetPresetByIdOrName(idOrName);
|
||||
if (preset != null)
|
||||
{
|
||||
return ApplyPreset(preset, Program.AppContext);
|
||||
return ApplyPreset(preset);
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -225,11 +255,6 @@ namespace ColorControl.Services.NVIDIA
|
||||
}
|
||||
|
||||
public override bool ApplyPreset(NvPreset preset)
|
||||
{
|
||||
return ApplyPreset(preset, Program.AppContext);
|
||||
}
|
||||
|
||||
public bool ApplyPreset(NvPreset preset, AppContext appContext)
|
||||
{
|
||||
var result = true;
|
||||
|
||||
@@ -278,6 +303,8 @@ namespace ColorControl.Services.NVIDIA
|
||||
{
|
||||
var colorData = preset.applyColorData ? preset.colorData : display.DisplayDevice.CurrentColorData;
|
||||
|
||||
var appContext = _appContextProvider.GetAppContext();
|
||||
|
||||
SetHDRState(display, newHdrEnabled, colorData, appContext.StartUpParams.NoGui);
|
||||
}
|
||||
|
||||
@@ -309,6 +336,19 @@ namespace ColorControl.Services.NVIDIA
|
||||
return result;
|
||||
}
|
||||
|
||||
public static void ApplyDriverSettings(List<KeyValuePair<uint, string>> settings)
|
||||
{
|
||||
var appContextProvider = Program.ServiceProvider.GetRequiredService<AppContextProvider>();
|
||||
|
||||
if (ServiceInstance == null)
|
||||
{
|
||||
ServiceInstance = new NvService(appContextProvider);
|
||||
ServiceInstance.Initialize();
|
||||
}
|
||||
|
||||
ServiceInstance._drs.StoreSettingsToProfile(ServiceInstance._baseProfileName, settings);
|
||||
}
|
||||
|
||||
private void SetDriverSettings(NvPreset preset)
|
||||
{
|
||||
var settings = new List<KeyValuePair<uint, string>>();
|
||||
@@ -601,7 +641,7 @@ namespace ColorControl.Services.NVIDIA
|
||||
{
|
||||
var settingMeta = GetSettingMeta(setting.SettingId);
|
||||
|
||||
var settingValue = settingMeta.DwordValues.FirstOrDefault(s => s.ValueName == setting.ValueText);
|
||||
var settingValue = settingMeta.DwordValues?.FirstOrDefault(s => s.ValueName == setting.ValueText);
|
||||
|
||||
drsValues.Add($"{settingMeta.SettingName}: {settingValue?.ValueName ?? "Unknown"}");
|
||||
}
|
||||
@@ -676,6 +716,13 @@ namespace ColorControl.Services.NVIDIA
|
||||
|
||||
_drs.GetProfileNames(ref _baseProfileName, false);
|
||||
|
||||
if (!Utils.IsAdministrator())
|
||||
{
|
||||
_drs.ApplySettings += HandleDrsApplySettings;
|
||||
}
|
||||
|
||||
//SetGpuClocks();
|
||||
|
||||
//Task.Run(() =>
|
||||
//{
|
||||
// RefreshProfileSettings();
|
||||
@@ -701,6 +748,18 @@ namespace ColorControl.Services.NVIDIA
|
||||
}
|
||||
}
|
||||
|
||||
private void HandleDrsApplySettings(object sender, DrsEvent drsEvent)
|
||||
{
|
||||
if (Utils.IsAdministrator() || _appContextProvider.GetAppContext()?.Config.ElevationMethod != ElevationMethod.UseService)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
PipeUtils.SendMessage(new SvcNvDriverSettingsMessage { DriverSettings = drsEvent.Settings });
|
||||
|
||||
drsEvent.Handled = true;
|
||||
}
|
||||
|
||||
protected override void Uninitialize()
|
||||
{
|
||||
if (_initialized)
|
||||
@@ -708,5 +767,57 @@ namespace ColorControl.Services.NVIDIA
|
||||
NvAPIWrapper.NVIDIA.Unload();
|
||||
}
|
||||
}
|
||||
|
||||
public void SetGpuClocks()
|
||||
{
|
||||
// TEST ONLY
|
||||
var gpu = PhysicalGPU.GetPhysicalGPUs().FirstOrDefault();
|
||||
|
||||
if (gpu == null)
|
||||
{
|
||||
Logger.Debug("No GPU");
|
||||
return;
|
||||
}
|
||||
|
||||
var handle = gpu.Handle;
|
||||
|
||||
var perf = GPUApi.GetPerformanceStates20(handle);
|
||||
|
||||
var lockv2 = new PrivateClockBoostLockV2(new[] { new ClockBoostLock(NvAPIWrapper.Native.GPU.PublicClockDomain.Graphics, NvAPIWrapper.Native.GPU.ClockLockMode.Manual, 1000000) });
|
||||
|
||||
var bla = GPUApi.GetClockBoostLock(handle);
|
||||
|
||||
//GPUApi.SetClockBoostLock(handle, lockv2);
|
||||
|
||||
//var curve = GPUApi.GetVFPCurve(handle);
|
||||
|
||||
var currentFreq = perf.Clocks.First().Value.First(v => v.DomainId == NvAPIWrapper.Native.GPU.PublicClockDomain.Graphics).SingleFrequency;
|
||||
|
||||
var delta = new PerformanceStates20ParameterDelta(90000);
|
||||
//var delta2 = new PerformanceStates20ParameterDelta(0);
|
||||
//var delta3 = new PerformanceStates20ParameterDelta(0);
|
||||
//var single1 = new PerformanceStates20ClockDependentSingleFrequency(2670000);
|
||||
//var single2 = new PerformanceStates20ClockDependentSingleFrequency(2760000);
|
||||
//var single3 = new PerformanceStates20ClockDependentSingleFrequency(2775000);
|
||||
|
||||
//var clockEntry1 = new PerformanceStates20ClockEntryV1(NvAPIWrapper.Native.GPU.PublicClockDomain.Graphics, delta, single1);
|
||||
//var clockEntry2 = new PerformanceStates20ClockEntryV1(NvAPIWrapper.Native.GPU.PublicClockDomain.Graphics, delta2, single2);
|
||||
//var clockEntry3 = new PerformanceStates20ClockEntryV1(NvAPIWrapper.Native.GPU.PublicClockDomain.Graphics, delta3, single3);
|
||||
|
||||
var range = new PerformanceStates20ClockDependentFrequencyRange(2400000, 3000000, NvAPIWrapper.Native.GPU.PerformanceVoltageDomain.Core, 950000, 1050000);
|
||||
var clockEntry = new PerformanceStates20ClockEntryV1(NvAPIWrapper.Native.GPU.PublicClockDomain.Graphics, delta, range);
|
||||
|
||||
//var range2 = new PerformanceStates20ClockDependentFrequencyRange(2800001, 3000000, NvAPIWrapper.Native.GPU.PerformanceVoltageDomain.Core, 1000000, 1000000);
|
||||
//var clockEntry2 = new PerformanceStates20ClockEntryV1(NvAPIWrapper.Native.GPU.PublicClockDomain.Graphics, delta2, range2);
|
||||
|
||||
var deltaVoltage = new PerformanceStates20ParameterDelta(0);
|
||||
var voltage = new PerformanceStates20BaseVoltageEntryV1(NvAPIWrapper.Native.GPU.PerformanceVoltageDomain.Core, deltaVoltage);
|
||||
|
||||
var state = new PerformanceStates20InfoV1.PerformanceState20(NvAPIWrapper.Native.GPU.PerformanceStateId.P0_3DPerformance, new[] { clockEntry }, new[] { voltage });
|
||||
|
||||
var newPerf = new PerformanceStates20InfoV3(new[] { state }, 1, 1);
|
||||
|
||||
//GPUApi.SetPerformanceStates20(handle, newPerf);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,5 +1,6 @@
|
||||
using ColorControl.Common;
|
||||
using ColorControl.Services.LG;
|
||||
using ColorControl.Services.NVIDIA;
|
||||
using Microsoft.Extensions.Hosting;
|
||||
using Newtonsoft.Json;
|
||||
using NLog;
|
||||
@@ -107,6 +108,7 @@ namespace ColorControl.Svc
|
||||
SvcMessageType.ExecuteRpc => HandleExecuteRpcCommand(message),
|
||||
SvcMessageType.ExecuteUpdate => await HandleExecuteUpdateCommandAsync(JsonConvert.DeserializeObject<SvcInstallUpdateMessage>(json)),
|
||||
SvcMessageType.RestartAfterUpdate => HandleRestartAfterUpdateMessage(),
|
||||
SvcMessageType.ApplyNvidiaDriverSettings => HandleNvDriverSettingsMessage(JsonConvert.DeserializeObject<SvcNvDriverSettingsMessage>(json)),
|
||||
_ => SvcResultMessage.FromResult(false, "Unexpected message type")
|
||||
};
|
||||
|
||||
@@ -180,6 +182,13 @@ namespace ColorControl.Svc
|
||||
return SvcResultMessage.FromResult(true);
|
||||
}
|
||||
|
||||
private SvcResultMessage HandleNvDriverSettingsMessage(SvcNvDriverSettingsMessage message)
|
||||
{
|
||||
NvService.ApplyDriverSettings(message.DriverSettings);
|
||||
|
||||
return SvcResultMessage.FromResult(true);
|
||||
}
|
||||
|
||||
private async Task WakeDevicesAsync()
|
||||
{
|
||||
if (!UserSessionInfo.UserLocalSession)
|
||||
|
||||
@@ -1,4 +1,6 @@
|
||||
namespace ColorControl.Svc
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace ColorControl.Svc
|
||||
{
|
||||
public enum SvcMessageType
|
||||
{
|
||||
@@ -8,6 +10,7 @@
|
||||
ExecuteRpc = 10,
|
||||
ExecuteUpdate = 20,
|
||||
RestartAfterUpdate = 21,
|
||||
ApplyNvidiaDriverSettings = 101,
|
||||
}
|
||||
|
||||
public class SvcMessage
|
||||
@@ -28,4 +31,13 @@
|
||||
public string ClientPath { get; set; }
|
||||
}
|
||||
|
||||
public class SvcNvDriverSettingsMessage : SvcMessage
|
||||
{
|
||||
public SvcNvDriverSettingsMessage()
|
||||
{
|
||||
MessageType = SvcMessageType.ApplyNvidiaDriverSettings;
|
||||
}
|
||||
|
||||
public List<KeyValuePair<uint, string>> DriverSettings { get; set; }
|
||||
}
|
||||
}
|
||||
@@ -282,9 +282,14 @@ namespace LgTv
|
||||
private string _currentPairKey;
|
||||
private string webSocketUri;
|
||||
|
||||
public static async Task<LgTvApi> CreateLgTvApi(string ip, int retries = 1)
|
||||
protected static readonly NLog.Logger Logger = NLog.LogManager.GetCurrentClassLogger();
|
||||
|
||||
public static async Task<LgTvApi> CreateLgTvApi(string ip, int retries = 1, bool useSecureWs = true)
|
||||
{
|
||||
var instance = new LgTvApi(ip, new LgTvApiCore(), new ClientKeyStore(ip));
|
||||
var instance = new LgTvApi(ip, new LgTvApiCore(), new ClientKeyStore(ip), useSecureWs);
|
||||
|
||||
Logger.Debug($"Trying to connect with websocket uri: {instance.webSocketUri}");
|
||||
|
||||
while (retries > 0)
|
||||
{
|
||||
var connected = await instance.Connect();
|
||||
@@ -300,9 +305,9 @@ namespace LgTv
|
||||
return null;
|
||||
}
|
||||
|
||||
private LgTvApi(string ip, LgTvApiCore connection, ClientKeyStore keyStore)
|
||||
private LgTvApi(string ip, LgTvApiCore connection, ClientKeyStore keyStore, bool useSecureWs)
|
||||
{
|
||||
webSocketUri = "ws://" + ip + ":3000";
|
||||
webSocketUri = useSecureWs ? $"wss://{ip}:3001" : $"ws://{ip}:3000";
|
||||
_ip = ip;
|
||||
_connection = connection;
|
||||
_keyStore = keyStore;
|
||||
|
||||
@@ -7,6 +7,7 @@ using System.Collections.Concurrent;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
using Windows.Networking.Sockets;
|
||||
using Windows.Security.Cryptography.Certificates;
|
||||
using Windows.Storage.Streams;
|
||||
|
||||
namespace LgTv
|
||||
@@ -40,6 +41,8 @@ namespace LgTv
|
||||
ConnectionClosed = false;
|
||||
_commandCount = 0;
|
||||
_connection = new MessageWebSocket();
|
||||
_connection.Control.IgnorableServerCertificateErrors.Add(ChainValidationResult.Untrusted);
|
||||
_connection.Control.IgnorableServerCertificateErrors.Add(ChainValidationResult.InvalidName);
|
||||
_connection.Control.MessageType = SocketMessageType.Utf8;
|
||||
_connection.MessageReceived += Connection_MessageReceived;
|
||||
_connection.Closed += Connection_Closed;
|
||||
@@ -53,8 +56,9 @@ namespace LgTv
|
||||
IsConnected?.Invoke(true);
|
||||
return true;
|
||||
}
|
||||
catch (TimeoutException)
|
||||
catch (TimeoutException te)
|
||||
{
|
||||
Logger.Error($"Connect to {uri}: {te.Message}");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
@@ -69,6 +73,8 @@ namespace LgTv
|
||||
// Handle Unknown Error
|
||||
break;
|
||||
}
|
||||
|
||||
Logger.Error($"Connect to {uri}: {e.Message}");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -25,7 +25,7 @@ namespace nspector.Common
|
||||
_customSettings = customSettings;
|
||||
_referenceSettings = referenceSettings;
|
||||
|
||||
ResetMetaCache(true);
|
||||
ResetMetaCache(false);
|
||||
}
|
||||
|
||||
public void ResetMetaCache(bool initOnly = false)
|
||||
|
||||
@@ -7,8 +7,16 @@ using nvw = nspector.Native.NVAPI2.NvapiDrsWrapper;
|
||||
|
||||
namespace nspector.Common
|
||||
{
|
||||
public class DrsEvent : EventArgs
|
||||
{
|
||||
public List<KeyValuePair<uint, string>>? Settings { get; set; }
|
||||
public bool Handled { get; set; }
|
||||
}
|
||||
|
||||
public class DrsSettingsService : DrsSettingsServiceBase
|
||||
{
|
||||
public event EventHandler<DrsEvent>? ApplySettings;
|
||||
public bool ExternalApplySettings => ApplySettings != null;
|
||||
|
||||
public DrsSettingsService(DrsSettingsMetaService metaService, DrsDecrypterService decrpterService)
|
||||
: base(metaService, decrpterService)
|
||||
@@ -300,6 +308,19 @@ namespace nspector.Common
|
||||
|
||||
public int StoreSettingsToProfile(string profileName, List<KeyValuePair<uint, string>> settings)
|
||||
{
|
||||
var drsEvent = new DrsEvent
|
||||
{
|
||||
Settings = settings,
|
||||
Handled = false
|
||||
};
|
||||
|
||||
ApplySettings?.Invoke(this, drsEvent);
|
||||
|
||||
if (drsEvent.Handled)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
DrsSessionScope.DestroyGlobalSession();
|
||||
|
||||
DrsSession((hSession) =>
|
||||
|
||||
@@ -540,7 +540,7 @@ namespace nspector
|
||||
|
||||
private void frmDrvSettings_Load(object sender, EventArgs e)
|
||||
{
|
||||
_highlightUnexposedSettings = !IsAdministrator();
|
||||
_highlightUnexposedSettings = !IsAdministrator() && !_drs.ExternalApplySettings;
|
||||
|
||||
SetupLayout();
|
||||
SetTitleVersion();
|
||||
|
||||
Reference in new issue
Block a user