Skip to content

Commit

Permalink
Refactor of GraphicsAdapter into partial class.
Browse files Browse the repository at this point in the history
Implemented GraphicsAdapter for DirectX platforms.
Added unit tests for GraphicsAdapter.
  • Loading branch information
tomspilman committed Jul 23, 2016
1 parent 68513fa commit 9c9fe5c
Show file tree
Hide file tree
Showing 9 changed files with 656 additions and 305 deletions.
10 changes: 9 additions & 1 deletion Build/Projects/MonoGame.Framework.definition
Expand Up @@ -604,7 +604,15 @@
<ExcludePlatforms>Web</ExcludePlatforms>
</Compile>
<Compile Include="Graphics\Effect\SpriteEffect.cs" />
<Compile Include="Graphics\GraphicsAdapter.cs" />
<Compile Include="Graphics\GraphicsAdapter.cs">
<ExcludePlatforms>Android,Angle,iOS,Linux,MacOS,Ouya,WindowsGL,tvOS,Web</ExcludePlatforms>
</Compile>
<Compile Include="Graphics\GraphicsAdapter.DirectX.cs">
<Services>DirectXGraphics</Services>
</Compile>
<Compile Include="Graphics\GraphicsAdapter.Legacy.cs">
<Platforms>Android,Angle,iOS,Linux,MacOS,Ouya,WindowsGL,tvOS,Web</Platforms>
</Compile>
<Compile Include="Graphics\GraphicsCapabilities.cs" />
<Compile Include="Graphics\GraphicsContext.SDL.cs">
<Platforms>WindowsGL,Linux</Platforms>
Expand Down
1 change: 1 addition & 0 deletions Build/Projects/MonoGame.Tests.definition
Expand Up @@ -98,6 +98,7 @@
<Compile Include="Framework\GameTest+Methods.cs" />
<Compile Include="Framework\GameTest+Properties.cs" />
<Compile Include="Framework\GestureRecognizerTest.cs" />
<Compile Include="Framework\GraphicsAdapterTest.cs" />
<Compile Include="Framework\MathHelperTest.cs" />
<Compile Include="Framework\MatrixTest.cs" />
<Compile Include="Framework\MockWindow.cs" />
Expand Down
2 changes: 1 addition & 1 deletion MonoGame.Framework/Graphics/DisplayMode.cs
Expand Up @@ -118,7 +118,7 @@ public override int GetHashCode()

public override string ToString()
{
return "{{Width:" + this.width + " Height:" + this.height + " Format:" + this.Format + "}}";
return "{Width:" + this.width + " Height:" + this.height + " Format:" + this.Format + " AspectRatio:" + this.AspectRatio + "}";
}

#endregion Public Methods
Expand Down
35 changes: 23 additions & 12 deletions MonoGame.Framework/Graphics/DisplayModeCollection.cs
Expand Up @@ -33,38 +33,49 @@ MIT License

namespace Microsoft.Xna.Framework.Graphics
{
public class DisplayModeCollection : IEnumerable<DisplayMode>, IEnumerable
public class DisplayModeCollection : IEnumerable<DisplayMode>
{
private readonly List<DisplayMode> modes;
private readonly List<DisplayMode> _modes;

public IEnumerable<DisplayMode> this[SurfaceFormat format]
{
get {
List<DisplayMode> list = new List<DisplayMode>();
foreach (DisplayMode mode in this.modes)
get
{
var list = new List<DisplayMode>();
foreach (var mode in _modes)
{
if (mode.Format == format)
{
list.Add(mode);
}
}
return list;

}
}

public IEnumerator<DisplayMode> GetEnumerator()
{
return modes.GetEnumerator();
return _modes.GetEnumerator();
}

IEnumerator IEnumerable.GetEnumerator()
{
return modes.GetEnumerator();
return _modes.GetEnumerator();
}

public DisplayModeCollection(List<DisplayMode> setmodes) {
modes = setmodes;
internal DisplayModeCollection(List<DisplayMode> modes)
{
// Sort the modes in a consistent way that happens
// to match XNA behavior on some graphics devices.

modes.Sort(delegate(DisplayMode a, DisplayMode b)
{
if (a == b)
return 0;
if (a.Format <= b.Format && a.Width <= b.Width && a.Height <= b.Height)
return -1;
return 1;
});

_modes = modes;
}
}
}
93 changes: 93 additions & 0 deletions MonoGame.Framework/Graphics/GraphicsAdapter.DirectX.cs
@@ -0,0 +1,93 @@
// MonoGame - Copyright (C) The MonoGame Team
// This file is subject to the terms and conditions defined in
// file 'LICENSE.txt', which is part of this source code package.

using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;

namespace Microsoft.Xna.Framework.Graphics
{
partial class GraphicsAdapter
{
private static void PlatformInitializeAdapters(out ReadOnlyCollection<GraphicsAdapter> adapters)
{
var dxgiFactory = new SharpDX.DXGI.Factory1();

var adapterCount = dxgiFactory.GetAdapterCount();
var adapterList = new List<GraphicsAdapter>(adapterCount);

for (var i = 0; i < adapterCount; i++)
{
var dxgiAdapter = dxgiFactory.GetAdapter1(i);

var outputsCount = dxgiAdapter.GetOutputCount();
for (var j = 0; j < outputsCount; j++)
{
var output = dxgiAdapter.GetOutput(j);

var adapter = CreateAdapter(dxgiAdapter, output);
adapterList.Add(adapter);

output.Dispose();
}

dxgiAdapter.Dispose();
}

dxgiFactory.Dispose();

adapters = new ReadOnlyCollection<GraphicsAdapter>(adapterList);
}

private static readonly Dictionary<SharpDX.DXGI.Format, SurfaceFormat> FormatTranslations = new Dictionary<SharpDX.DXGI.Format, SurfaceFormat>
{
{ SharpDX.DXGI.Format.R8G8B8A8_UNorm, SurfaceFormat.Color },
{ SharpDX.DXGI.Format.B8G8R8A8_UNorm, SurfaceFormat.Color },
{ SharpDX.DXGI.Format.B5G6R5_UNorm, SurfaceFormat.Bgr565 },
};

private static GraphicsAdapter CreateAdapter(SharpDX.DXGI.Adapter1 dxgiAdapter, SharpDX.DXGI.Output output)
{
var adapter = new GraphicsAdapter();

adapter.DeviceName = output.Description.DeviceName;
adapter.Description = dxgiAdapter.Description1.Description;
adapter.DeviceId = dxgiAdapter.Description1.DeviceId;
adapter.Revision = dxgiAdapter.Description1.Revision;
adapter.VendorId = dxgiAdapter.Description1.VendorId;
adapter.SubSystemId = dxgiAdapter.Description1.SubsystemId;
adapter.MonitorHandle = output.Description.MonitorHandle;

var desktopWidth = output.Description.DesktopBounds.Width;
var desktopHeight = output.Description.DesktopBounds.Height;

var modes = new List<DisplayMode>();

foreach (var formatTranslation in FormatTranslations)
{
var displayModes = output.GetDisplayModeList(formatTranslation.Key, 0);
foreach (var displayMode in displayModes)
{
var mode = new DisplayMode(displayMode.Width, displayMode.Height, formatTranslation.Value);

// Skip duplicate modes with the same width/height/formats.
if (modes.Contains(mode))
continue;

modes.Add(mode);

if (mode.Width == desktopWidth && mode.Height == desktopHeight && mode.Format == SurfaceFormat.Color)
{
if (adapter._currentDisplayMode == null)
adapter._currentDisplayMode = mode;
}
}
}

adapter._supportedDisplayModes = new DisplayModeCollection(modes);

return adapter;
}
}
}

0 comments on commit 9c9fe5c

Please sign in to comment.