-
Notifications
You must be signed in to change notification settings - Fork 44
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
remember tv selection, fix minor bugs, add first AMD controller code …
…(not finished yet)
- Loading branch information
Showing
14 changed files
with
1,311 additions
and
140 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Large diffs are not rendered by default.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,172 @@ | ||
using ATI.ADL; | ||
using System; | ||
using System.Collections.Generic; | ||
using System.Linq; | ||
using System.Runtime.InteropServices; | ||
using System.Text; | ||
using System.Threading.Tasks; | ||
|
||
namespace ColorControl | ||
{ | ||
class ADLWrapper | ||
{ | ||
public static bool Initialize() | ||
{ | ||
int ADLRet = -1; | ||
|
||
if (null != ADL.ADL_Main_Control_Create) | ||
{ | ||
// Second parameter is 1: Get only the present adapters | ||
ADLRet = ADL.ADL_Main_Control_Create(ADL.ADL_Main_Memory_Alloc, 1); | ||
} | ||
return (ADL.ADL_SUCCESS == ADLRet); | ||
} | ||
|
||
public static void Uninitialze() | ||
{ | ||
if (null != ADL.ADL_Main_Control_Destroy) | ||
{ | ||
ADL.ADL_Main_Control_Destroy(); | ||
} | ||
} | ||
|
||
public static ADLAdapterInfoArray? GetAdapters() | ||
{ | ||
int ADLRet = -1; | ||
int NumberOfAdapters = 0; | ||
|
||
if (null != ADL.ADL_Adapter_NumberOfAdapters_Get) | ||
{ | ||
ADL.ADL_Adapter_NumberOfAdapters_Get(ref NumberOfAdapters); | ||
} | ||
Console.WriteLine("Number Of Adapters: " + NumberOfAdapters.ToString() + "\n"); | ||
|
||
if (NumberOfAdapters > 0) | ||
{ | ||
// Get OS adpater info from ADL | ||
ADLAdapterInfoArray OSAdapterInfoData; | ||
OSAdapterInfoData = new ADLAdapterInfoArray(); | ||
|
||
if (null != ADL.ADL_Adapter_AdapterInfo_Get) | ||
{ | ||
IntPtr AdapterBuffer = IntPtr.Zero; | ||
int size = Marshal.SizeOf(OSAdapterInfoData); | ||
AdapterBuffer = Marshal.AllocCoTaskMem((int)size); | ||
Marshal.StructureToPtr(OSAdapterInfoData, AdapterBuffer, false); | ||
|
||
if (null != ADL.ADL_Adapter_AdapterInfo_Get) | ||
{ | ||
ADLRet = ADL.ADL_Adapter_AdapterInfo_Get(AdapterBuffer, size); | ||
if (ADL.ADL_SUCCESS == ADLRet) | ||
{ | ||
OSAdapterInfoData = (ADLAdapterInfoArray)Marshal.PtrToStructure(AdapterBuffer, OSAdapterInfoData.GetType()); | ||
int IsActive = 0; | ||
|
||
for (int i = 0; i < NumberOfAdapters; i++) | ||
{ | ||
// Check if the adapter is active | ||
if (null != ADL.ADL_Adapter_Active_Get) | ||
ADLRet = ADL.ADL_Adapter_Active_Get(OSAdapterInfoData.ADLAdapterInfo[i].AdapterIndex, ref IsActive); | ||
|
||
if (ADL.ADL_SUCCESS == ADLRet) | ||
{ | ||
|
||
} | ||
} | ||
} | ||
else | ||
{ | ||
Console.WriteLine("ADL_Adapter_AdapterInfo_Get() returned error code " + ADLRet.ToString()); | ||
} | ||
} | ||
// Release the memory for the AdapterInfo structure | ||
if (IntPtr.Zero != AdapterBuffer) | ||
{ | ||
Marshal.FreeCoTaskMem(AdapterBuffer); | ||
} | ||
} | ||
return OSAdapterInfoData; | ||
} | ||
return null; | ||
} | ||
|
||
public static List<ADLDisplayInfo> GetAllDisplays() | ||
{ | ||
int ADLRet; | ||
int NumberOfDisplays = 0; | ||
|
||
var DisplayInfoData = new List<ADLDisplayInfo>(); | ||
|
||
var OSAdapterInfoData = GetAdapters(); | ||
if (OSAdapterInfoData == null || !OSAdapterInfoData.Value.ADLAdapterInfo.Any()) | ||
{ | ||
return DisplayInfoData; | ||
} | ||
var primaryAdapter = OSAdapterInfoData.Value.ADLAdapterInfo.First(); | ||
|
||
ADLDisplayInfo oneDisplayInfo = new ADLDisplayInfo(); | ||
|
||
if (null != ADL.ADL_Display_DisplayInfo_Get) | ||
{ | ||
IntPtr DisplayBuffer = IntPtr.Zero; | ||
int j = 0; | ||
|
||
// Force the display detection and get the Display Info. Use 0 as last parameter to NOT force detection | ||
ADLRet = ADL.ADL_Display_DisplayInfo_Get(primaryAdapter.AdapterIndex, ref NumberOfDisplays, out DisplayBuffer, 1); | ||
if (ADL.ADL_SUCCESS == ADLRet) | ||
{ | ||
for (j = 0; j < NumberOfDisplays; j++) | ||
{ | ||
oneDisplayInfo = (ADLDisplayInfo)Marshal.PtrToStructure(new IntPtr(DisplayBuffer.ToInt32() + j * Marshal.SizeOf(oneDisplayInfo)), oneDisplayInfo.GetType()); | ||
DisplayInfoData.Add(oneDisplayInfo); | ||
} | ||
Console.WriteLine("\nTotal Number of Displays supported: " + NumberOfDisplays.ToString()); | ||
Console.WriteLine("\nDispID AdpID Type OutType CnctType Connected Mapped InfoValue DisplayName "); | ||
|
||
for (j = 0; j < NumberOfDisplays; j++) | ||
{ | ||
int InfoValue = DisplayInfoData[j].DisplayInfoValue; | ||
string StrConnected = (1 == (InfoValue & 1)) ? "Yes" : "No "; | ||
string StrMapped = (2 == (InfoValue & 2)) ? "Yes" : "No "; | ||
int AdpID = DisplayInfoData[j].DisplayID.DisplayLogicalAdapterIndex; | ||
string StrAdpID = (AdpID < 0) ? "--" : AdpID.ToString("d2"); | ||
|
||
Console.WriteLine(DisplayInfoData[j].DisplayID.DisplayLogicalIndex.ToString() + " " + | ||
StrAdpID + " " + | ||
DisplayInfoData[j].DisplayType.ToString() + " " + | ||
DisplayInfoData[j].DisplayOutputType.ToString() + " " + | ||
DisplayInfoData[j].DisplayConnector.ToString() + " " + | ||
StrConnected + " " + | ||
StrMapped + " " + | ||
InfoValue.ToString("x4") + " " + | ||
DisplayInfoData[j].DisplayName.ToString()); | ||
} | ||
Console.WriteLine(); | ||
} | ||
else | ||
{ | ||
Console.WriteLine("ADL_Display_DisplayInfo_Get() returned error code " + ADLRet.ToString()); | ||
} | ||
// Release the memory for the DisplayInfo structure | ||
if (IntPtr.Zero != DisplayBuffer) | ||
Marshal.FreeCoTaskMem(DisplayBuffer); | ||
} | ||
return DisplayInfoData; | ||
} | ||
|
||
public static bool GetDisplayResolution(string displayName, ref int horizontal, ref int vertical) | ||
{ | ||
var displays = GetAllDisplays(); | ||
var display = displays.FirstOrDefault(d => d.DisplayName.Equals(displayName, StringComparison.OrdinalIgnoreCase)); | ||
if (display.DisplayID.DisplayPhysicalIndex >= 0 && ADL.ADL_Display_Size_Get != null) | ||
{ | ||
int lpDefaultWidth, lpDefaultHeight, lpMinWidth, lpMinHeight, lpMaxWidth, lpMaxHeight, lpStepWidth, lpStepHeight; | ||
lpDefaultWidth = lpDefaultHeight = lpMinWidth = lpMinHeight = lpMaxWidth = lpMaxHeight = lpStepWidth = lpStepHeight = 0; | ||
var ADLRet = ADL.ADL_Display_Size_Get(display.DisplayID.DisplayPhysicalAdapterIndex, display.DisplayID.DisplayPhysicalIndex, ref horizontal, ref vertical, ref lpDefaultWidth, ref lpDefaultHeight, ref lpMinWidth, ref lpMinHeight, ref lpMaxWidth, ref lpMaxHeight, ref lpStepWidth, ref lpStepHeight); | ||
|
||
return ADLRet == ADL.ADL_SUCCESS; | ||
} | ||
return false; | ||
} | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,186 @@ | ||
using NvAPIWrapper.Display; | ||
using NvAPIWrapper.Native.Display; | ||
using System; | ||
using System.Collections.Generic; | ||
using System.Text; | ||
|
||
namespace ColorControl | ||
{ | ||
class AmdPreset : PresetBase | ||
{ | ||
public bool applyColorData { get; set; } | ||
public ColorData colorData { get; set; } | ||
public bool applyHDR { get; set; } | ||
public bool HDREnabled { get; set; } | ||
public bool toggleHDR { get; set; } | ||
public bool applyDithering { get; set; } | ||
public bool ditheringEnabled { get; set; } | ||
public bool applyRefreshRate { get; set; } | ||
public uint refreshRate { get; set; } | ||
public bool primaryDisplay { get; set; } | ||
public string displayName { get; set; } | ||
|
||
public AmdPreset() | ||
{ | ||
applyColorData = true; | ||
applyDithering = false; | ||
ditheringEnabled = true; | ||
applyHDR = false; | ||
HDREnabled = false; | ||
toggleHDR = false; | ||
applyRefreshRate = false; | ||
refreshRate = 60; | ||
primaryDisplay = true; | ||
} | ||
|
||
public AmdPreset(ColorData colorData) : this() | ||
{ | ||
id = GetNewId(); | ||
this.colorData = colorData; | ||
} | ||
|
||
public AmdPreset(AmdPreset preset): this() | ||
{ | ||
id = GetNewId(); | ||
|
||
primaryDisplay = preset.primaryDisplay; | ||
displayName = preset.displayName; | ||
|
||
var colorData = preset.colorData; | ||
this.colorData = new ColorData(colorData.ColorFormat, dynamicRange: colorData.DynamicRange, colorDepth: colorData.ColorDepth, colorSelectionPolicy: colorData.SelectionPolicy); | ||
applyColorData = preset.applyColorData; | ||
|
||
applyHDR = preset.applyHDR; | ||
HDREnabled = preset.HDREnabled; | ||
toggleHDR = preset.toggleHDR; | ||
applyDithering = preset.applyDithering; | ||
ditheringEnabled = preset.ditheringEnabled; | ||
applyRefreshRate = preset.applyRefreshRate; | ||
refreshRate = preset.refreshRate; | ||
} | ||
|
||
public AmdPreset Clone() | ||
{ | ||
var preset = new AmdPreset(this); | ||
|
||
return preset; | ||
} | ||
|
||
public static string[] GetColumnNames() | ||
{ | ||
//return new[] { "BPC", "Format", "Dynamic range", "Toggle HDR", "Shortcut" }; | ||
return new[] { "Display|140", "Color settings (BPC, format, dyn. range, color space)|260", "Refresh rate|100", "Dithering", "HDR", "Shortcut" }; | ||
} | ||
|
||
public List<string> GetDisplayValues() | ||
{ | ||
var values = new List<string>(); | ||
|
||
var display = string.Format("{0}", primaryDisplay ? "Primary" : displayName); | ||
values.Add(display); | ||
|
||
var colorSettings = string.Format("{0}: {1}, {2}, {3}, {4}", applyColorData ? "Included" : "Excluded", colorData.ColorDepth, colorData.ColorFormat, colorData.DynamicRange, colorData.Colorimetry); | ||
|
||
values.Add(colorSettings); | ||
values.Add(string.Format("{0}: {1}Hz", applyRefreshRate ? "Included" : "Excluded", refreshRate)); | ||
values.Add(string.Format("{0}: {1}", applyDithering ? "Included" : "Excluded", ditheringEnabled ? "Enabled" : "Disabled")); | ||
values.Add(string.Format("{0}: {1}", applyHDR ? "Included" : "Excluded", toggleHDR ? "Toggle" : HDREnabled ? "Enabled" : "Disabled")); | ||
|
||
//values.Add(colorData.ColorDepth.ToString()); | ||
//values.Add(colorData.ColorFormat.ToString()); | ||
//values.Add(colorData.DynamicRange.ToString()); | ||
//values.Add(toggleHDR.ToString()); | ||
values.Add(shortcut); | ||
|
||
return values; | ||
} | ||
|
||
public static List<AmdPreset> GetDefaultPresets() | ||
{ | ||
var presets = new List<AmdPreset>(); | ||
|
||
presets.Add(new AmdPreset(new ColorData(ColorDataFormat.Auto, dynamicRange: ColorDataDynamicRange.Auto, colorDepth: ColorDataDepth.Default, colorSelectionPolicy: ColorDataSelectionPolicy.BestQuality))); | ||
|
||
for (var dynamicRange = ColorDataDynamicRange.VESA; dynamicRange <= ColorDataDynamicRange.CEA; dynamicRange++) | ||
{ | ||
presets.Add(new AmdPreset(new ColorData(ColorDataFormat.RGB, dynamicRange: dynamicRange, colorDepth: ColorDataDepth.BPC8, colorSelectionPolicy: ColorDataSelectionPolicy.User))); | ||
presets.Add(new AmdPreset(new ColorData(ColorDataFormat.RGB, dynamicRange: dynamicRange, colorDepth: ColorDataDepth.BPC10, colorSelectionPolicy: ColorDataSelectionPolicy.User))); | ||
presets.Add(new AmdPreset(new ColorData(ColorDataFormat.RGB, dynamicRange: dynamicRange, colorDepth: ColorDataDepth.BPC12, colorSelectionPolicy: ColorDataSelectionPolicy.User))); | ||
} | ||
|
||
for (var format = ColorDataFormat.YUV422; format <= ColorDataFormat.YUV420; format++) | ||
{ | ||
presets.Add(new AmdPreset(new ColorData(format, dynamicRange: ColorDataDynamicRange.Auto, colorDepth: ColorDataDepth.BPC8, colorSelectionPolicy: ColorDataSelectionPolicy.User))); | ||
presets.Add(new AmdPreset(new ColorData(format, dynamicRange: ColorDataDynamicRange.Auto, colorDepth: ColorDataDepth.BPC10, colorSelectionPolicy: ColorDataSelectionPolicy.User))); | ||
presets.Add(new AmdPreset(new ColorData(format, dynamicRange: ColorDataDynamicRange.Auto, colorDepth: ColorDataDepth.BPC12, colorSelectionPolicy: ColorDataSelectionPolicy.User))); | ||
} | ||
|
||
return presets; | ||
} | ||
|
||
public string GetTextForMenuItem() | ||
{ | ||
var sb = new StringBuilder(); | ||
if (displayName != null) | ||
{ | ||
sb.AppendFormat("Display: {0} / ", displayName); | ||
} | ||
if (applyColorData) | ||
{ | ||
var colorSettings = string.Format("Format: {0}, {1}, {2}", colorData.ColorDepth, colorData.ColorFormat, colorData.DynamicRange); | ||
sb.Append(colorSettings); | ||
sb.Append(" / "); | ||
} | ||
if (applyRefreshRate) | ||
{ | ||
sb.AppendFormat("{0}Hz", refreshRate); | ||
sb.Append(" / "); | ||
} | ||
if (applyDithering) | ||
{ | ||
sb.AppendFormat("Dithering: {0}", ditheringEnabled ? "Yes" : "No"); | ||
sb.Append(" / "); | ||
} | ||
if (applyHDR) | ||
{ | ||
sb.AppendFormat("HDR: {0}", toggleHDR ? "Toggle" : HDREnabled ? "Enabled" : "Disabled"); | ||
sb.Append(" / "); | ||
} | ||
|
||
return sb.ToString(0, Math.Max(0, sb.Length - 3)); | ||
} | ||
|
||
public static ColorData GenerateColorData(IDictionary<string, object> dictionary) | ||
{ | ||
var format = ColorDataFormat.RGB; | ||
var dynamicRange = ColorDataDynamicRange.VESA; | ||
var colorDepth = ColorDataDepth.BPC8; | ||
var colorimetry = ColorDataColorimetry.Auto; | ||
var selectionPolicy = ColorDataSelectionPolicy.User; | ||
object value; | ||
if (dictionary.TryGetValue("ColorFormat", out value)) | ||
{ | ||
format = (ColorDataFormat)Enum.ToObject(typeof(ColorDataFormat), value); | ||
} | ||
if (dictionary.TryGetValue("ColorDepth", out value)) | ||
{ | ||
colorDepth = (ColorDataDepth)Enum.ToObject(typeof(ColorDataDepth), value); | ||
} | ||
if (dictionary.TryGetValue("Colorimetry", out value)) | ||
{ | ||
colorimetry = (ColorDataColorimetry)Enum.ToObject(typeof(ColorDataColorimetry), value); | ||
} | ||
if (dictionary.TryGetValue("DynamicRange", out value)) | ||
{ | ||
dynamicRange = (ColorDataDynamicRange)Enum.ToObject(typeof(ColorDataDynamicRange), value); | ||
} | ||
if (dictionary.TryGetValue("SelectionPolicy", out value)) | ||
{ | ||
selectionPolicy = (ColorDataSelectionPolicy)Enum.ToObject(typeof(ColorDataSelectionPolicy), value); | ||
} | ||
return new ColorData(format, dynamicRange: dynamicRange, colorimetry: colorimetry, colorDepth: colorDepth, colorSelectionPolicy: selectionPolicy); | ||
} | ||
|
||
} | ||
} | ||
|
Oops, something went wrong.