Added INativeGraphicsAdapter

This commit is contained in:
Konstantin Koch 2015-10-24 19:26:27 +02:00
parent 4381ef7c82
commit 32b43c2a82
12 changed files with 435 additions and 146 deletions

View File

@ -449,6 +449,7 @@
<Compile Include="NonXNA\PreloadAttribute.cs" />
<Compile Include="NonXNA\Reflection\AssemblyLoader.cs" />
<Compile Include="NonXNA\RenderSystem\INativeConstantBuffer.cs" />
<Compile Include="NonXNA\RenderSystem\INativeGraphicsAdapter.cs" />
<Compile Include="NonXNA\RenderSystem\IOcclusionQuery.cs" />
<Compile Include="NonXNA\RenderSystem\INativeEffectAnnotation.cs" />
<Compile Include="NonXNA\RenderSystem\VertexTypeHelper.cs" />

View File

@ -11,12 +11,25 @@ using ANX.Framework.NonXNA.Development;
namespace ANX.Framework.Graphics
{
[PercentageComplete(50)]
[Developer("Glatzemann")]
[PercentageComplete(100)]
[Developer("Glatzemann, KorsarNek")]
[TestState(TestStateAttribute.TestState.Untested)]
public sealed class GraphicsAdapter
{
public static ReadOnlyCollection<GraphicsAdapter> Adapters { get; private set; }
private static ReadOnlyCollection<GraphicsAdapter> _adapters;
public static ReadOnlyCollection<GraphicsAdapter> Adapters
{
get
{
if (_adapters == null)
{
var creator = AddInSystemFactory.Instance.GetDefaultCreator<IRenderSystemCreator>();
_adapters = new ReadOnlyCollection<GraphicsAdapter>(creator.GetAdapterList().Select((x) => new GraphicsAdapter(x)).ToArray());
}
return _adapters;
}
}
public static GraphicsAdapter DefaultAdapter
{
@ -24,49 +37,100 @@ namespace ANX.Framework.Graphics
}
public static bool UseNullDevice { get; set; }
public static bool UseReferenceDevice { get; set; }
public int DeviceId { get; set; }
public string DeviceName { get; set; }
public bool IsDefaultAdapter { get; set; }
public int Revision { get; set; }
public int SubSystemId { get; set; }
public int VendorId { get; set; }
public string Description { get; set; }
public DisplayMode CurrentDisplayMode { get; set; }
public DisplayModeCollection SupportedDisplayModes { get; set; }
public IntPtr MonitorHandle { get; set; }
public static bool UseReferenceDevice { get; set; }
public bool IsWideScreen
{
get
{
throw new NotImplementedException();
}
}
private INativeGraphicsAdapter nativeAdapter;
static GraphicsAdapter()
{
var creator = AddInSystemFactory.Instance.GetDefaultCreator<IRenderSystemCreator>();
Adapters = new ReadOnlyCollection<GraphicsAdapter>(creator.GetAdapterList());
#region Public
public int DeviceId
{
get { return nativeAdapter.DeviceId; }
}
public string DeviceName
{
get { return nativeAdapter.DeviceName; }
}
public bool IsDefaultAdapter
{
get { return nativeAdapter.IsDefaultAdapter; }
}
public int Revision
{
get { return nativeAdapter.Revision; }
}
public int SubSystemId
{
get { return nativeAdapter.SubSystemId; }
}
public int VendorId
{
get { return nativeAdapter.VendorId; }
}
public string Description
{
get { return nativeAdapter.Description; }
}
public DisplayMode CurrentDisplayMode
{
get { return nativeAdapter.CurrentDisplayMode; }
}
public DisplayModeCollection SupportedDisplayModes
{
get { return nativeAdapter.SupportedDisplayModes; }
}
public IntPtr MonitorHandle
{
get { return nativeAdapter.MonitorHandle; }
}
public bool IsWideScreen
{
get
{
return this.CurrentDisplayMode.AspectRatio > (16 / 10);
}
}
#endregion
internal INativeGraphicsAdapter NativeAdapter
{
get { return nativeAdapter; }
}
internal GraphicsAdapter(INativeGraphicsAdapter nativeAdapter)
{
if (nativeAdapter == null)
throw new ArgumentNullException("nativeAdapter");
this.nativeAdapter = nativeAdapter;
}
public bool IsProfileSupported(GraphicsProfile graphicsProfile)
{
throw new NotImplementedException();
return nativeAdapter.IsProfileSupported(graphicsProfile);
}
public bool QueryBackBufferFormat(GraphicsProfile graphicsProfile, SurfaceFormat format, DepthFormat depthFormat,
int multiSampleCount, out SurfaceFormat selectedFormat, out DepthFormat selectedDepthFormat,
out int selectedMultiSampleCount)
int multiSampleCount, out SurfaceFormat selectedFormat, out DepthFormat selectedDepthFormat,
out int selectedMultiSampleCount)
{
throw new NotImplementedException();
return nativeAdapter.QueryBackBufferFormat(graphicsProfile, format, depthFormat, multiSampleCount, out selectedFormat, out selectedDepthFormat, out selectedMultiSampleCount);
}
public bool QueryRenderTargetFormat(GraphicsProfile graphicsProfile, SurfaceFormat format, DepthFormat depthFormat,
int multiSampleCount, out SurfaceFormat selectedFormat, out DepthFormat selectedDepthFormat,
out int selectedMultiSampleCount)
int multiSampleCount, out SurfaceFormat selectedFormat, out DepthFormat selectedDepthFormat,
out int selectedMultiSampleCount)
{
throw new NotImplementedException();
return nativeAdapter.QueryRenderTargetFormat(graphicsProfile, format, depthFormat, multiSampleCount, out selectedFormat, out selectedDepthFormat, out selectedMultiSampleCount);
}
}
}

View File

@ -0,0 +1,35 @@
#region Using Statements
using ANX.Framework.Graphics;
using System;
#endregion
// This file is part of the ANX.Framework created by the
// "ANX.Framework developer group" and released under the Ms-PL license.
// For details see: http://anxframework.codeplex.com/license
namespace ANX.Framework.NonXNA
{
public interface INativeGraphicsAdapter
{
IntPtr MonitorHandle { get; }
bool IsDefaultAdapter { get; }
int Revision { get; }
int SubSystemId { get; }
int DeviceId { get; }
int VendorId { get; }
string DeviceName { get; }
string Description { get; }
DisplayMode CurrentDisplayMode { get; }
DisplayModeCollection SupportedDisplayModes { get; }
bool IsProfileSupported(GraphicsProfile graphicsProfile);
bool QueryBackBufferFormat(GraphicsProfile graphicsProfile, SurfaceFormat format, DepthFormat depthFormat,
int multiSampleCount, out SurfaceFormat selectedFormat, out DepthFormat selectedDepthFormat,
out int selectedMultiSampleCount);
bool QueryRenderTargetFormat(GraphicsProfile graphicsProfile, SurfaceFormat format, DepthFormat depthFormat,
int multiSampleCount, out SurfaceFormat selectedFormat, out DepthFormat selectedDepthFormat,
out int selectedMultiSampleCount);
}
}

View File

@ -47,7 +47,7 @@ namespace ANX.Framework.NonXNA
byte[] GetShaderByteCode(PreDefinedShader type);
EffectSourceLanguage GetStockShaderSourceLanguage { get; }
ReadOnlyCollection<GraphicsAdapter> GetAdapterList();
ReadOnlyCollection<INativeGraphicsAdapter> GetAdapterList();
void SetTextureSampler(int index, Texture value);
}

View File

@ -43,6 +43,7 @@
<ItemGroup>
<Compile Include="BlendStateGL3.cs" />
<Compile Include="Creator.cs" />
<Compile Include="GraphicsAdapterGL3.cs" />
<Compile Include="Helpers\DatatypesMapping.cs" />
<Compile Include="DepthStencilStateGL3.cs" />
<Compile Include="EffectGL3.cs" />

View File

@ -262,48 +262,31 @@ namespace ANX.RenderSystem.GL3
/// Get a list of available graphics adapter information.
/// </summary>
/// <returns>List of graphics adapters.</returns>
public ReadOnlyCollection<GraphicsAdapter> GetAdapterList()
public ReadOnlyCollection<INativeGraphicsAdapter> GetAdapterList()
{
AddInSystemFactory.Instance.PreventSystemChange(AddInType.RenderSystem);
var result = new List<GraphicsAdapter>();
foreach (DisplayDevice device in DisplayDevice.AvailableDisplays)
AddInSystemFactory.Instance.PreventSystemChange(AddInType.RenderSystem);
var result = new List<INativeGraphicsAdapter>();
foreach (DisplayDevice device in DisplayDevice.AvailableDisplays)
{
var resultingModes = new List<DisplayMode>();
foreach (string format in Enum.GetNames(typeof(SurfaceFormat)))
{
SurfaceFormat surfaceFormat = (SurfaceFormat)Enum.Parse(typeof(SurfaceFormat), format);
foreach (string format in Enum.GetNames(typeof(SurfaceFormat)))
{
SurfaceFormat surfaceFormat = (SurfaceFormat)Enum.Parse(typeof(SurfaceFormat), format);
// TODO: device.BitsPerPixel
if (surfaceFormat != SurfaceFormat.Color)//adapter.Supports(surfaceFormat) == false)
{
continue;
}
// TODO: device.BitsPerPixel
if (surfaceFormat != SurfaceFormat.Color)//adapter.Supports(surfaceFormat) == false)
{
continue;
}
}
foreach (DisplayResolution res in device.AvailableResolutions)
resultingModes.Add(new DisplayMode(res.Width, res.Height, surfaceFormat));
}
var newAdapter = new GraphicsAdapterGL3(device, SurfaceFormat.Color);
DisplayDevice dev = DisplayDevice.GetDisplay(DisplayIndex.Default);
result.Add(newAdapter);
}
var newAdapter = new GraphicsAdapter
{
SupportedDisplayModes = new DisplayModeCollection(resultingModes),
IsDefaultAdapter = device.IsPrimary,
// TODO:
DeviceId = 0,
DeviceName = "",
Revision = 0,
SubSystemId = 0,
VendorId = 0,
CurrentDisplayMode = new DisplayMode(dev.Width, dev.Height, SurfaceFormat.Color)
};
result.Add(newAdapter);
}
return new ReadOnlyCollection<GraphicsAdapter>(result);
return new ReadOnlyCollection<INativeGraphicsAdapter>(result);
}
#endregion

View File

@ -0,0 +1,102 @@
using ANX.Framework.Graphics;
using ANX.Framework.NonXNA;
using OpenTK;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ANX.RenderSystem.GL3
{
public class GraphicsAdapterGL3 : INativeGraphicsAdapter
{
SurfaceFormat surfaceFormat;
public IntPtr MonitorHandle
{
get { throw new NotImplementedException(); }
}
public bool IsDefaultAdapter
{
get { return this.DisplayDevice.IsPrimary; }
}
public int Revision
{
get { throw new NotImplementedException(); }
}
public int SubSystemId
{
get { throw new NotImplementedException(); }
}
public int DeviceId
{
get { throw new NotImplementedException(); }
}
public int VendorId
{
get { throw new NotImplementedException(); }
}
public string DeviceName
{
get { throw new NotImplementedException(); }
}
public string Description
{
get { throw new NotImplementedException(); }
}
public DisplayDevice DisplayDevice
{
get;
private set;
}
public GraphicsAdapterGL3(DisplayDevice device, SurfaceFormat surfaceFormat)
{
this.DisplayDevice = device;
this.surfaceFormat = surfaceFormat;
List<DisplayMode> modes = new List<DisplayMode>();
foreach (DisplayResolution res in device.AvailableResolutions)
modes.Add(new DisplayMode(res.Width, res.Height, surfaceFormat));
this.SupportedDisplayModes = new DisplayModeCollection(modes);
}
public Framework.Graphics.DisplayMode CurrentDisplayMode
{
get
{
return new DisplayMode(this.DisplayDevice.Width, this.DisplayDevice.Height, surfaceFormat);
}
}
public Framework.Graphics.DisplayModeCollection SupportedDisplayModes
{
get;
private set;
}
public bool IsProfileSupported(Framework.Graphics.GraphicsProfile graphicsProfile)
{
throw new NotImplementedException();
}
public bool QueryBackBufferFormat(Framework.Graphics.GraphicsProfile graphicsProfile, Framework.Graphics.SurfaceFormat format, Framework.Graphics.DepthFormat depthFormat, int multiSampleCount, out Framework.Graphics.SurfaceFormat selectedFormat, out Framework.Graphics.DepthFormat selectedDepthFormat, out int selectedMultiSampleCount)
{
throw new NotImplementedException();
}
public bool QueryRenderTargetFormat(Framework.Graphics.GraphicsProfile graphicsProfile, Framework.Graphics.SurfaceFormat format, Framework.Graphics.DepthFormat depthFormat, int multiSampleCount, out Framework.Graphics.SurfaceFormat selectedFormat, out Framework.Graphics.DepthFormat selectedDepthFormat, out int selectedMultiSampleCount)
{
throw new NotImplementedException();
}
}
}

View File

@ -0,0 +1,155 @@
using System;
using SharpDX.D3DCompiler;
using System.IO;
using System.Linq;
using ANX.Framework.Graphics;
using ANX.Framework.NonXNA;
using SharpDX.DXGI;
using System.Collections.Generic;
#if DX10
using Dx = SharpDX.Direct3D10;
#elif DX11
using Dx = SharpDX.Direct3D11;
#endif
// This file is part of the ANX.Framework created by the
// "ANX.Framework developer group" and released under the Ms-PL license.
// For details see: http://anxframework.codeplex.com/license
#if DX10
namespace ANX.RenderSystem.Windows.DX10
#elif DX11
namespace ANX.RenderSystem.Windows.DX11
#endif
{
public partial class DirectXGraphicsAdapter : INativeGraphicsAdapter
{
Output _output;
Adapter _adapter;
bool _isDefaultAdapter;
#region Public
public IntPtr MonitorHandle
{
get { return _output.Description.MonitorHandle; }
}
public bool IsDefaultAdapter
{
get { return _isDefaultAdapter; }
}
public int Revision
{
get { return _adapter.Description.Revision; }
}
public int SubSystemId
{
get { return _adapter.Description.SubsystemId; }
}
public int DeviceId
{
get { return _adapter.Description.DeviceId; }
}
public int VendorId
{
get { return _adapter.Description.VendorId; }
}
public string DeviceName
{
get { return _output.Description.DeviceName; }
}
public string Description
{
get { return _adapter.Description.Description; }
}
public DisplayMode CurrentDisplayMode
{
get
{
//Display mode can change when changing resolutions.
//The output description will be automatically updated it seems, we only have the return the correct display mode.
return new DisplayMode(_output.Description.DesktopBounds.Width, _output.Description.DesktopBounds.Height, SurfaceFormat.Color);
}
}
public DisplayModeCollection SupportedDisplayModes
{
get;
private set;
}
public Output Output
{
get { return _output; }
}
public Adapter Adapter
{
get { return _adapter; }
}
public ModeDescription CurrentModeDescription
{
get
{
return _output.GetDisplayModeList(Format.R8G8B8A8_UNorm, DisplayModeEnumerationFlags.Interlaced).Where(
(x) =>
{
var bounds = _output.Description.DesktopBounds;
return x.Width == bounds.Width && x.Height == bounds.Height; //TODO: Check refreshRate too.
}).FirstOrDefault();
}
}
#endregion
#region Constructors
public DirectXGraphicsAdapter(Adapter adapter, Output output, bool isDefaultAdapter)
{
this._adapter = adapter;
this._output = output;
this._isDefaultAdapter = isDefaultAdapter;
List<DisplayMode> supportedModes = new List<DisplayMode>();
var modeList = output.GetDisplayModeList(Format.R8G8B8A8_UNorm, DisplayModeEnumerationFlags.Interlaced);
foreach (ModeDescription modeDescription in modeList)
{
var displayMode = new DisplayMode(modeDescription.Width, modeDescription.Height, DxFormatConverter.Translate(modeDescription.Format));
supportedModes.Add(displayMode);
}
this.SupportedDisplayModes = new DisplayModeCollection(supportedModes);
}
#endregion
public ModeDescription GetClosestMatchingMode(Dx.Device device, int width, int height)
{
ModeDescription closestMatch;
_output.GetClosestMatchingMode(device, new ModeDescription(width, height, new Rational(0, 0), Format.R8G8B8A8_UNorm), out closestMatch);
return closestMatch;
}
public bool IsProfileSupported(GraphicsProfile graphicsProfile)
{
throw new NotImplementedException();
}
public bool QueryBackBufferFormat(GraphicsProfile graphicsProfile, SurfaceFormat format, DepthFormat depthFormat, int multiSampleCount, out SurfaceFormat selectedFormat, out DepthFormat selectedDepthFormat, out int selectedMultiSampleCount)
{
throw new NotImplementedException();
}
public bool QueryRenderTargetFormat(GraphicsProfile graphicsProfile, SurfaceFormat format, DepthFormat depthFormat, int multiSampleCount, out SurfaceFormat selectedFormat, out DepthFormat selectedDepthFormat, out int selectedMultiSampleCount)
{
throw new NotImplementedException();
}
}
}

View File

@ -66,6 +66,9 @@
<Compile Include="..\ANX.RenderSystem.DX.SharedSources\ResourceMapping.cs">
<Link>ResourceMapping.cs</Link>
</Compile>
<Compile Include="..\ANX.RenderSystem.DX.SharedSources\SharedGraphicsAdapter.cs">
<Link>SharedGraphicsAdapter.cs</Link>
</Compile>
<Compile Include="BlendState_DX10.cs" />
<Compile Include="Buffer.cs" />
<Compile Include="Creator.cs" />

View File

@ -182,56 +182,27 @@ namespace ANX.RenderSystem.Windows.DX10
#endregion
#region GetAdapterList
public ReadOnlyCollection<GraphicsAdapter> GetAdapterList()
public ReadOnlyCollection<INativeGraphicsAdapter> GetAdapterList()
{
PreventSystemChange();
PreventSystemChange();
var adapterList = new List<GraphicsAdapter>();
var resultingModes = new List<DisplayMode>();
var adapterList = new List<INativeGraphicsAdapter>();
bool firstOutput = true;
using (Factory factory = new Factory())
{
for (int i = 0; i < factory.GetAdapterCount(); i++)
foreach (Adapter adapter in factory.Adapters)
{
using (Adapter adapter = factory.GetAdapter(i))
foreach (Output output in adapter.Outputs)
{
var ga = new GraphicsAdapter();
ga.Description = adapter.Description.Description;
ga.DeviceId = adapter.Description.DeviceId;
ga.DeviceName = adapter.Description.Description;
ga.IsDefaultAdapter = i == 0; //TODO: how to set default adapter?
//ga.IsWideScreen = ;
ga.Revision = adapter.Description.Revision;
ga.SubSystemId = adapter.Description.SubsystemId;
ga.VendorId = adapter.Description.VendorId;
resultingModes.Clear();
if (adapter.Outputs.Length >= 1)
{
using (Output adapterOutput = adapter.Outputs[0])
{
var modeList = adapterOutput.GetDisplayModeList(Format.R8G8B8A8_UNorm, DisplayModeEnumerationFlags.Interlaced);
foreach (ModeDescription modeDescription in modeList)
{
var displayMode = new DisplayMode(modeDescription.Width, modeDescription.Height, DxFormatConverter.Translate(modeDescription.Format));
resultingModes.Add(displayMode);
}
ga.CurrentDisplayMode = new DisplayMode(adapterOutput.Description.DesktopBounds.Width, adapterOutput.Description.DesktopBounds.Height, SurfaceFormat.Color);
ga.MonitorHandle = adapterOutput.Description.MonitorHandle;
}
}
ga.SupportedDisplayModes = new DisplayModeCollection(resultingModes);
adapterList.Add(ga);
//By definition, the first returned output is always the default adapter.
adapterList.Add(new DirectXGraphicsAdapter(adapter, output, firstOutput));
firstOutput = false;
}
}
}
return new ReadOnlyCollection<GraphicsAdapter>(adapterList);
return new ReadOnlyCollection<INativeGraphicsAdapter>(adapterList);
}
#endregion

View File

@ -79,6 +79,9 @@
<Compile Include="..\ANX.RenderSystem.DX.SharedSources\ResourceMapping.cs">
<Link>ResourceMapping.cs</Link>
</Compile>
<Compile Include="..\ANX.RenderSystem.DX.SharedSources\SharedGraphicsAdapter.cs">
<Link>SharedGraphicsAdapter.cs</Link>
</Compile>
<Compile Include="BlendState_DX11.cs" />
<Compile Include="Buffer.cs" />
<Compile Include="Creator.cs" />

View File

@ -187,56 +187,27 @@ namespace ANX.RenderSystem.Windows.DX11
#endregion
#region GetAdapterList
public ReadOnlyCollection<GraphicsAdapter> GetAdapterList()
public ReadOnlyCollection<INativeGraphicsAdapter> GetAdapterList()
{
PreventSystemChange();
PreventSystemChange();
var adapterList = new List<GraphicsAdapter>();
var resultingModes = new List<DisplayMode>();
var adapterList = new List<INativeGraphicsAdapter>();
bool firstOutput = true;
using (Factory factory = new Factory())
{
for (int i = 0; i < factory.GetAdapterCount(); i++)
foreach (Adapter adapter in factory.Adapters)
{
using (Adapter adapter = factory.GetAdapter(i))
foreach (Output output in adapter.Outputs)
{
GraphicsAdapter ga = new GraphicsAdapter();
ga.Description = adapter.Description.Description;
ga.DeviceId = adapter.Description.DeviceId;
ga.DeviceName = adapter.Description.Description;
ga.IsDefaultAdapter = i == 0; //TODO: how to set default adapter?
//ga.IsWideScreen = ;
ga.Revision = adapter.Description.Revision;
ga.SubSystemId = adapter.Description.SubsystemId;
ga.VendorId = adapter.Description.VendorId;
resultingModes.Clear();
if (adapter.Outputs.Length >= 1)
{
using (Output adapterOutput = adapter.Outputs[0])
{
var modeList = adapterOutput.GetDisplayModeList(Format.R8G8B8A8_UNorm, DisplayModeEnumerationFlags.Interlaced);
foreach (ModeDescription modeDescription in modeList)
{
var displayMode = new DisplayMode(modeDescription.Width, modeDescription.Height, DxFormatConverter.Translate(modeDescription.Format));
resultingModes.Add(displayMode);
}
ga.CurrentDisplayMode = new DisplayMode(adapterOutput.Description.DesktopBounds.Width, adapterOutput.Description.DesktopBounds.Height, SurfaceFormat.Color);
ga.MonitorHandle = adapterOutput.Description.MonitorHandle;
}
}
ga.SupportedDisplayModes = new DisplayModeCollection(resultingModes);
adapterList.Add(ga);
//By definition, the first returned output is always the default adapter.
adapterList.Add(new DirectXGraphicsAdapter(adapter, output, firstOutput));
firstOutput = false;
}
}
}
return new System.Collections.ObjectModel.ReadOnlyCollection<GraphicsAdapter>(adapterList);
return new ReadOnlyCollection<INativeGraphicsAdapter>(adapterList);
}
#endregion