[WIP] Part work on new Profile data structs

Moving to a situation where each library has
it's own ProfileData structure which will require
me to break the existing Profile structure.
This will be better once finished, but it could
be a month before I get this rewrite finished :/
This commit is contained in:
Terry MacDonald 2021-06-20 17:13:21 +12:00
parent 7efd4f0349
commit d654b80377
2 changed files with 64 additions and 21 deletions

View File

@ -28,14 +28,25 @@ namespace DisplayMagicianShared.AMD
private IntPtr _adlContextHandle = IntPtr.Zero; private IntPtr _adlContextHandle = IntPtr.Zero;
// Struct to be used as the AMD Profile // Struct to be used as the AMD Profile
public struct AMDProfile internal struct AMDProfile
{ {
ADLMode DisplayMode; internal List<AMDAdapter> Adapters;
int XPos;
int YPos;
} }
// Struct to store the Display
internal struct AMDAdapter
{
internal ADLAdapterInfoX2 AdapterInfoX2;
internal List<AMDDisplay> Displays;
}
// Struct to store the Display
internal struct AMDDisplay
{
internal List<ADLMode> DisplayModes;
}
static AMDLibrary() { } static AMDLibrary() { }
public AMDLibrary() public AMDLibrary()
{ {
@ -1020,7 +1031,7 @@ namespace DisplayMagicianShared.AMD
} }
} }
public AMDProfile GetActiveProfile() internal AMDProfile GetActiveProfile()
{ {
SharedLogger.logger.Trace($"AMDLibrary/GetActiveProfile: Getting AMD active adapter count"); SharedLogger.logger.Trace($"AMDLibrary/GetActiveProfile: Getting AMD active adapter count");
@ -1030,6 +1041,7 @@ namespace DisplayMagicianShared.AMD
List<string> displayIdentifiers = new List<string>(); List<string> displayIdentifiers = new List<string>();
AMDProfile profileToCreate = new AMDProfile(); AMDProfile profileToCreate = new AMDProfile();
if (null != ADL.ADL2_Adapter_NumberOfAdapters_Get) if (null != ADL.ADL2_Adapter_NumberOfAdapters_Get)
{ {
ADL.ADL2_Adapter_NumberOfAdapters_Get(_adlContextHandle, ref NumberOfAdapters); ADL.ADL2_Adapter_NumberOfAdapters_Get(_adlContextHandle, ref NumberOfAdapters);
@ -1038,7 +1050,7 @@ namespace DisplayMagicianShared.AMD
if (NumberOfAdapters > 0) if (NumberOfAdapters > 0)
{ {
profileToCreate.Adapters = new List<AMDAdapter>();
IntPtr AdapterBuffer = IntPtr.Zero; IntPtr AdapterBuffer = IntPtr.Zero;
if (ADL.ADL2_Adapter_AdapterInfoX4_Get != null) if (ADL.ADL2_Adapter_AdapterInfoX4_Get != null)
{ {
@ -1096,6 +1108,12 @@ namespace DisplayMagicianShared.AMD
SharedLogger.logger.Trace($"AMDLibrary/GetActiveProfile: AMD Adapter #{oneAdapter.AdapterIndex.ToString()} is active! ({oneAdapter.AdapterName})."); SharedLogger.logger.Trace($"AMDLibrary/GetActiveProfile: AMD Adapter #{oneAdapter.AdapterIndex.ToString()} is active! ({oneAdapter.AdapterName}).");
// Store the Adapter information for later
AMDAdapter adapterToCreate = new AMDAdapter();
adapterToCreate.AdapterInfoX2 = oneAdapter;
adapterToCreate.Displays = new List<AMDDisplay>();
SharedLogger.logger.Trace($"AMDLibrary/GetActiveProfile: ### Adapter Info for Adapter #{oneAdapter.AdapterIndex} ###"); SharedLogger.logger.Trace($"AMDLibrary/GetActiveProfile: ### Adapter Info for Adapter #{oneAdapter.AdapterIndex} ###");
SharedLogger.logger.Trace($"AMDLibrary/GetActiveProfile: Adapter AdapterIndex = {oneAdapter.AdapterIndex}"); SharedLogger.logger.Trace($"AMDLibrary/GetActiveProfile: Adapter AdapterIndex = {oneAdapter.AdapterIndex}");
SharedLogger.logger.Trace($"AMDLibrary/GetActiveProfile: Adapter AdapterName = {oneAdapter.AdapterName}"); SharedLogger.logger.Trace($"AMDLibrary/GetActiveProfile: Adapter AdapterName = {oneAdapter.AdapterName}");
@ -1132,6 +1150,9 @@ namespace DisplayMagicianShared.AMD
SharedLogger.logger.Trace($"AMDLibrary/GetActiveProfile: Adapter Num of GL Sync Connectors = {AdapterCapabilities.NumOfGLSyncConnectors}"); SharedLogger.logger.Trace($"AMDLibrary/GetActiveProfile: Adapter Num of GL Sync Connectors = {AdapterCapabilities.NumOfGLSyncConnectors}");
SharedLogger.logger.Trace($"AMDLibrary/GetActiveProfile: Adapter Num of Overlays = {AdapterCapabilities.NumOverlays}"); SharedLogger.logger.Trace($"AMDLibrary/GetActiveProfile: Adapter Num of Overlays = {AdapterCapabilities.NumOverlays}");
// Store the Adapters Info for later
profileToCreate.Adapters.Add(adapterToCreate);
if (ADL.ADL2_Display_DisplayInfo_Get != null) if (ADL.ADL2_Display_DisplayInfo_Get != null)
{ {
IntPtr DisplayBuffer = IntPtr.Zero; IntPtr DisplayBuffer = IntPtr.Zero;
@ -1143,10 +1164,10 @@ namespace DisplayMagicianShared.AMD
try try
{ {
ADLDisplayInfo oneDisplayInfo = new ADLDisplayInfo();
for (int displayLoop = 0; displayLoop < numDisplays; displayLoop++) for (int displayLoop = 0; displayLoop < numDisplays; displayLoop++)
{ {
ADLDisplayInfo oneDisplayInfo = new ADLDisplayInfo();
oneDisplayInfo = (ADLDisplayInfo)Marshal.PtrToStructure(new IntPtr(DisplayBuffer.ToInt64() + (displayLoop * Marshal.SizeOf(oneDisplayInfo))), oneDisplayInfo.GetType()); oneDisplayInfo = (ADLDisplayInfo)Marshal.PtrToStructure(new IntPtr(DisplayBuffer.ToInt64() + (displayLoop * Marshal.SizeOf(oneDisplayInfo))), oneDisplayInfo.GetType());
// Is the display mapped to this adapter? If not we skip it! // Is the display mapped to this adapter? If not we skip it!
@ -1174,6 +1195,11 @@ namespace DisplayMagicianShared.AMD
SharedLogger.logger.Trace($"AMDLibrary/GetActiveProfile: AMD Adapter #{oneAdapter.AdapterIndex.ToString()} ({oneAdapter.AdapterName}) AdapterID display ID#{oneDisplayInfo.DisplayID.DisplayLogicalIndex} is connected and mapped in Windows OS"); SharedLogger.logger.Trace($"AMDLibrary/GetActiveProfile: AMD Adapter #{oneAdapter.AdapterIndex.ToString()} ({oneAdapter.AdapterName}) AdapterID display ID#{oneDisplayInfo.DisplayID.DisplayLogicalIndex} is connected and mapped in Windows OS");
// Store the Display information for later
AMDDisplay displayToCreate = new AMDDisplay();
displayToCreate.DisplayModes = new List<ADLMode>();
ADL.ADLDisplayConnectionType displayConnector = (ADL.ADLDisplayConnectionType)oneDisplayInfo.DisplayConnector; ADL.ADLDisplayConnectionType displayConnector = (ADL.ADLDisplayConnectionType)oneDisplayInfo.DisplayConnector;
SharedLogger.logger.Trace($"AMDLibrary/GetActiveprofile: ### Display Info for Display #{oneDisplayInfo.DisplayID.DisplayLogicalIndex} on Adapter #{oneAdapter.AdapterIndex} ###"); SharedLogger.logger.Trace($"AMDLibrary/GetActiveprofile: ### Display Info for Display #{oneDisplayInfo.DisplayID.DisplayLogicalIndex} on Adapter #{oneAdapter.AdapterIndex} ###");
@ -1207,7 +1233,6 @@ namespace DisplayMagicianShared.AMD
SharedLogger.logger.Trace($"AMDLibrary/GetActiveprofile: Display Info Value NONLOCAL = {displayInfoValue.NONLOCAL}"); SharedLogger.logger.Trace($"AMDLibrary/GetActiveprofile: Display Info Value NONLOCAL = {displayInfoValue.NONLOCAL}");
SharedLogger.logger.Trace($"AMDLibrary/GetActiveprofile: Display Info Value SHOWTYPE_PROJECTOR = {displayInfoValue.SHOWTYPE_PROJECTOR}"); SharedLogger.logger.Trace($"AMDLibrary/GetActiveprofile: Display Info Value SHOWTYPE_PROJECTOR = {displayInfoValue.SHOWTYPE_PROJECTOR}");
ADLMode oneDisplayMode = new ADLMode();
IntPtr displayModeBuffer = IntPtr.Zero; IntPtr displayModeBuffer = IntPtr.Zero;
int numModes = 0; int numModes = 0;
if (ADL.ADL2_Display_Modes_Get != null) if (ADL.ADL2_Display_Modes_Get != null)
@ -1216,10 +1241,13 @@ namespace DisplayMagicianShared.AMD
ADLRet = ADL.ADL2_Display_Modes_Get(_adlContextHandle, oneAdapter.AdapterIndex, oneDisplayInfo.DisplayID.DisplayPhysicalIndex, out numModes, out displayModeBuffer); ADLRet = ADL.ADL2_Display_Modes_Get(_adlContextHandle, oneAdapter.AdapterIndex, oneDisplayInfo.DisplayID.DisplayPhysicalIndex, out numModes, out displayModeBuffer);
if (ADLRet == ADL.ADL_OK) if (ADLRet == ADL.ADL_OK)
{ {
for (int displayModeLoop = 0; displayModeLoop < numDisplays; displayModeLoop++) for (int displayModeLoop = 0; displayModeLoop < numModes; displayModeLoop++)
{ {
ADLMode oneDisplayMode = new ADLMode();
oneDisplayMode = (ADLMode)Marshal.PtrToStructure(new IntPtr(displayModeBuffer.ToInt64() + (displayModeLoop * Marshal.SizeOf(oneDisplayMode))), oneDisplayMode.GetType()); oneDisplayMode = (ADLMode)Marshal.PtrToStructure(new IntPtr(displayModeBuffer.ToInt64() + (displayModeLoop * Marshal.SizeOf(oneDisplayMode))), oneDisplayMode.GetType());
displayToCreate.DisplayModes.Add(oneDisplayMode);
//displayConnectionType = (ADL.ADLDisplayConnectionType)displayConfig.ConnectorType; //displayConnectionType = (ADL.ADLDisplayConnectionType)displayConfig.ConnectorType;
ConvertedDisplayModeFlags displayModeFlag = ADL.ConvertDisplayModeFlags(oneDisplayMode.ModeFlag); ConvertedDisplayModeFlags displayModeFlag = ADL.ConvertDisplayModeFlags(oneDisplayMode.ModeFlag);
ConvertedDisplayModeFlags displayModeMask = ADL.ConvertDisplayModeFlags(oneDisplayMode.ModeMask); ConvertedDisplayModeFlags displayModeMask = ADL.ConvertDisplayModeFlags(oneDisplayMode.ModeMask);
@ -1323,6 +1351,10 @@ namespace DisplayMagicianShared.AMD
{ {
SharedLogger.logger.Warn($"AMDLibrary/GetActiveprofile: Error running ADL2_Display_DDCInfo2_Get on Display #{oneDisplayInfo.DisplayID.DisplayLogicalIndex} on Adapter #{oneAdapter.AdapterIndex}: {ADL.ConvertADLReturnValueIntoWords(ADLRet)}"); SharedLogger.logger.Warn($"AMDLibrary/GetActiveprofile: Error running ADL2_Display_DDCInfo2_Get on Display #{oneDisplayInfo.DisplayID.DisplayLogicalIndex} on Adapter #{oneAdapter.AdapterIndex}: {ADL.ConvertADLReturnValueIntoWords(ADLRet)}");
} }
// Add the things we learnt about the Display to the AMDProfile.
adapterToCreate.Displays.Add(displayToCreate);
} }
int HDRSupported = 0; int HDRSupported = 0;
@ -1498,19 +1530,19 @@ namespace DisplayMagicianShared.AMD
return profileToCreate; return profileToCreate;
} }
public void SetActiveProfile(AMDProfile profileToUse) internal bool SetActiveProfile(AMDProfile profileToUse)
{ {
return true;
} }
public void IsActiveProfile(AMDProfile profileToTest) internal bool IsActiveProfile(AMDProfile profileToTest)
{ {
return true;
} }
public void IsValidProfile(AMDProfile profileToTest) internal bool IsValidProfile(AMDProfile profileToTest)
{ {
return true;
} }
} }
} }

View File

@ -556,16 +556,27 @@ namespace DisplayMagicianShared
public static void UpdateActiveProfile() public static void UpdateActiveProfile()
{ {
AMDLibrary amdLibrary = AMDLibrary.GetLibrary();
ProfileItem activeProfile;
// If we're
AMDLibrary amdLibrary = AMDLibrary.GetLibrary();
if (amdLibrary.IsInstalled) if (amdLibrary.IsInstalled)
{ {
amdLibrary.GetActiveProfile(); AMDLibrary.AMDProfile thisOne = amdLibrary.GetActiveProfile();
activeProfile = new ProfileItem
{
Name = "Current Display Profile",
//Driver = "AMD",
//ProfileData = amdLibrary.GetActiveProfile()
//ProfileDisplayIdentifiers = ProfileRepository.GenerateProfileDisplayIdentifiers()
};
activeProfile.ProfileIcon = new ProfileIcon(activeProfile);
} }
SharedLogger.logger.Debug($"ProfileRepository/UpdateActiveProfile: Updating the profile currently active (in use now)."); SharedLogger.logger.Debug($"ProfileRepository/UpdateActiveProfile: Updating the profile currently active (in use now).");
ProfileItem activeProfile = new ProfileItem activeProfile = new ProfileItem
{ {
Name = "Current Display Profile", Name = "Current Display Profile",
Paths = PathInfo.GetActivePaths().Select(info => new DisplayMagicianShared.Topology.Path(info)).ToArray(), Paths = PathInfo.GetActivePaths().Select(info => new DisplayMagicianShared.Topology.Path(info)).ToArray(),