First fully working AMD Eyefinity implementation.

AMD Eyefinity now works just as well as the NVIDIA implementation... probably even more robustly than the NVIDIA one. Fixes #37 and #21. I'll now start on some other bugfixing and features in preparation for DisplayMagician v2.0.0
This commit is contained in:
Terry MacDonald 2021-09-21 21:21:10 +12:00
parent 5a1960720a
commit e0bb774fde

View File

@ -1139,147 +1139,98 @@ namespace DisplayMagicianShared
return _screens; return _screens;
} }
// Now we need to check for Spanned screens // Now we need to check for Spanned screens
if (_nvidiaDisplayConfig.MosaicConfig.IsMosaicEnabled) if (_amdDisplayConfig.SlsConfig.IsSlsEnabled)
{ {
// TODO: Make the NVIDIA displays show the individual screens and overlap! for (int i = 0; i < _amdDisplayConfig.DisplayMaps.Count; i++)
// Create a dictionary of all the screen sizes we want
//Dictionary<string,SpannedScreenPosition> MosaicScreens = new Dictionary<string,SpannedScreenPosition>();
for (int i = 0; i < _nvidiaDisplayConfig.MosaicConfig.MosaicGridCount; i++)
{ {
ScreenPosition screen = new ScreenPosition(); ScreenPosition screen = new ScreenPosition();
screen.Library = "NVIDIA"; screen.Library = "AMD";
screen.Colour = normalScreenColor; screen.Colour = normalScreenColor;
if (_nvidiaDisplayConfig.MosaicConfig.MosaicGridTopos[i].DisplayCount > 1) // This is multiple screens
screen.SpannedScreens = new List<SpannedScreenPosition>();
screen.Name = "AMD Eyefinity";
//screen.IsSpanned = true;
screen.SpannedRows = _amdDisplayConfig.SlsConfig.SLSMapConfigs[i].SLSMap.Grid.SLSGridRow;
screen.SpannedColumns = _amdDisplayConfig.SlsConfig.SLSMapConfigs[i].SLSMap.Grid.SLSGridColumn;
screen.Colour = spannedScreenColor;
// This is a combined surround/mosaic screen
// We need to build the size of the screen to match it later so we check the MosaicViewports
/*int minX = 0;
int minY = 0;
int maxX = 0;
int maxY = 0;
int overallX = 0;
int overallY = 0;
int overallWidth = 0;
int overallHeight = 0;
for (int j = 0; j < _amdDisplayConfig.SlsConfig.SLSMapConfigs[i].SLSTargets.Count; j++)
{ {
// Set some basics about the screen SpannedScreenPosition spannedScreen = new SpannedScreenPosition();
screen.SpannedScreens = new List<SpannedScreenPosition>(); spannedScreen.Name = $"Display #{_amdDisplayConfig.SlsConfig.SLSMapConfigs[i].SLSTargets[j].DisplayTarget.DisplayID.DisplayLogicalIndex} on Adapter #{_amdDisplayConfig.SlsConfig.SLSMapConfigs[i].SLSTargets[j].DisplayTarget.DisplayID.DisplayLogicalAdapterIndex}";
screen.Name = "NVIDIA Surround/Mosaic"; spannedScreen.Colour = spannedScreenColor;
screen.IsSpanned = true;
screen.SpannedRows = (int)_nvidiaDisplayConfig.MosaicConfig.MosaicGridTopos[i].Rows;
screen.SpannedColumns = (int)_nvidiaDisplayConfig.MosaicConfig.MosaicGridTopos[i].Columns;
screen.Colour = spannedScreenColor;
// This is a combined surround/mosaic screen // Calculate screen size
// We need to build the size of the screen to match it later so we check the MosaicViewports spannedScreen.ScreenX = (int)_amdDisplayConfig.SlsConfig.SLSMapConfigs[i].SLSTargets[j].ViewSize.XPos;
uint minX = 0; spannedScreen.ScreenY = (int)_amdDisplayConfig.SlsConfig.SLSMapConfigs[i].SLSTargets[j].ViewSize.YPos;
uint minY = 0; spannedScreen.ScreenWidth = (int)_amdDisplayConfig.SlsConfig.SLSMapConfigs[i].SLSTargets[j].ViewSize.XRes;
uint maxX = 0; spannedScreen.ScreenHeight = (int)_amdDisplayConfig.SlsConfig.SLSMapConfigs[i].SLSTargets[j].ViewSize.YRes;
uint maxY = 0;
uint overallX = 0; if (spannedScreen.ScreenX < minX)
uint overallY = 0;
int overallWidth = 0;
int overallHeight = 0;
for (int j = 0; j < _nvidiaDisplayConfig.MosaicConfig.MosaicGridTopos[i].DisplayCount; j++)
{ {
SpannedScreenPosition spannedScreen = new SpannedScreenPosition(); minX = spannedScreen.ScreenX;
spannedScreen.Name = _nvidiaDisplayConfig.MosaicConfig.MosaicGridTopos[i].Displays[j].DisplayId.ToString(); }
spannedScreen.Colour = spannedScreenColor; if (spannedScreen.ScreenY < minY)
{
// Calculate screen size minY = spannedScreen.ScreenY;
NV_RECT viewRect = _nvidiaDisplayConfig.MosaicConfig.MosaicViewports[i][j]; }
if (viewRect.Left < minX) if (spannedScreen.ScreenX + spannedScreen.ScreenWidth > maxX)
{ {
minX = viewRect.Left; maxX = spannedScreen.ScreenX + spannedScreen.ScreenWidth;
} }
if (viewRect.Top < minY) if (spannedScreen.ScreenY + spannedScreen.ScreenHeight > maxY)
{ {
minY = viewRect.Top; maxY = spannedScreen.ScreenY + spannedScreen.ScreenHeight;
}
if (viewRect.Right > maxX)
{
maxX = viewRect.Right;
}
if (viewRect.Bottom > maxY)
{
maxY = viewRect.Bottom;
}
uint width = viewRect.Right - viewRect.Left + 1;
uint height = viewRect.Bottom - viewRect.Top + 1;
spannedScreen.ScreenX = (int)viewRect.Left;
spannedScreen.ScreenY = (int)viewRect.Top;
spannedScreen.ScreenWidth = (int)width;
spannedScreen.ScreenHeight = (int)height;
// Figure out the overall figures for the screen
if (viewRect.Left < overallX)
{
overallX = viewRect.Left;
}
if (viewRect.Top < overallY)
{
overallY = viewRect.Top;
}
overallWidth = (int)maxX - (int)minX + 1;
overallHeight = (int)maxY - (int)minY + 1;
spannedScreen.Row = i + 1;
spannedScreen.Column = j + 1;
// Add the spanned screen to the screen
screen.SpannedScreens.Add(spannedScreen);
} }
//screen.Name = targetId.ToString(); // Figure out the overall figures for the screen
//screen.DisplayConnector = displayMode.DisplayConnector; if (spannedScreen.ScreenX < overallX)
screen.ScreenX = (int)overallX;
screen.ScreenY = (int)overallY;
screen.ScreenWidth = (int)overallWidth;
screen.ScreenHeight = (int)overallHeight;
// If we're at the 0,0 coordinate then we're the primary monitor
if (screen.ScreenX == 0 && screen.ScreenY == 0)
{ {
// Record we're primary screen overallX = spannedScreen.ScreenX;
screen.IsPrimary = true; }
// Change the colour to be the primary colour, but only if it isn't a surround screen if (spannedScreen.ScreenY < overallY)
if (screen.Colour != spannedScreenColor) {
{ overallY = spannedScreen.ScreenY;
screen.Colour = primaryScreenColor;
}
} }
} overallWidth = (int)maxX - (int)minX + 1;
else if (_nvidiaDisplayConfig.MosaicConfig.MosaicGridTopos[i].DisplayCount == 1) overallHeight = (int)maxY - (int)minY + 1;
spannedScreen.Row = _amdDisplayConfig.SlsConfig.SLSMapConfigs[i].SLSTargets[j].SLSGridPositionY;
spannedScreen.Column = _amdDisplayConfig.SlsConfig.SLSMapConfigs[i].SLSTargets[j].SLSGridPositionX;
// Add the spanned screen to the screen
screen.SpannedScreens.Add(spannedScreen);
}*/
//screen.Name = targetId.ToString();
//screen.DisplayConnector = displayMode.DisplayConnector;
screen.ScreenX = _amdDisplayConfig.DisplayMaps[i].DisplayMode.XPos;
screen.ScreenY = _amdDisplayConfig.DisplayMaps[i].DisplayMode.YPos;
screen.ScreenWidth = _amdDisplayConfig.DisplayMaps[i].DisplayMode.XRes;
screen.ScreenHeight = _amdDisplayConfig.DisplayMaps[i].DisplayMode.YRes;
// If we're at the 0,0 coordinate then we're the primary monitor
if (screen.ScreenX == 0 && screen.ScreenY == 0)
{ {
// This is a single screen with an adjoining mosaic screen // Record we're primary screen
// Set some basics about the screen screen.IsPrimary = true;
uint displayId = _nvidiaDisplayConfig.MosaicConfig.MosaicGridTopos[i].Displays[0].DisplayId; // Change the colour to be the primary colour, but only if it isn't a surround screen
string windowsDisplayName = _nvidiaDisplayConfig.DisplayNames[displayId]; if (screen.Colour != spannedScreenColor)
uint sourceIndex = _windowsDisplayConfig.DisplaySources[windowsDisplayName];
for (int x = 0; x < _windowsDisplayConfig.DisplayConfigModes.Length; x++)
{ {
// Skip this if its not a source info config type
if (_windowsDisplayConfig.DisplayConfigModes[x].InfoType != DISPLAYCONFIG_MODE_INFO_TYPE.DISPLAYCONFIG_MODE_INFO_TYPE_SOURCE)
{
continue;
}
// If the source index matches the index of the source info object we're looking at, then process it!
if (_windowsDisplayConfig.DisplayConfigModes[x].Id == sourceIndex)
{
screen.Name = displayId.ToString();
screen.ScreenX = (int)_windowsDisplayConfig.DisplayConfigModes[x].SourceMode.Position.X;
screen.ScreenY = (int)_windowsDisplayConfig.DisplayConfigModes[x].SourceMode.Position.Y;
screen.ScreenWidth = (int)_windowsDisplayConfig.DisplayConfigModes[x].SourceMode.Width;
screen.ScreenHeight = (int)_windowsDisplayConfig.DisplayConfigModes[x].SourceMode.Height;
break;
}
}
// If we're at the 0,0 coordinate then we're the primary monitor
if (screen.ScreenX == 0 && screen.ScreenY == 0)
{
screen.IsPrimary = true;
screen.Colour = primaryScreenColor; screen.Colour = primaryScreenColor;
} }
}
}
_screens.Add(screen); _screens.Add(screen);
} }
@ -1293,7 +1244,7 @@ namespace DisplayMagicianShared
{ {
// Set some basics about the screen // Set some basics about the screen
ScreenPosition screen = new ScreenPosition(); ScreenPosition screen = new ScreenPosition();
screen.Library = "NVIDIA"; screen.Library = "AMD";
screen.IsSpanned = false; screen.IsSpanned = false;
screen.Colour = normalScreenColor; // this is the default unless overridden by the primary screen screen.Colour = normalScreenColor; // this is the default unless overridden by the primary screen