RenderSystem DX10: moved all type translations to a static class

extended the IRenderSystemCreator interface to obtain available GraphicsAdapters of a render system
enumeration of GraphicsAdapters implemented for DirectX 10 RenderSystem
enumeration of DisplayModes implemented for DirectX 10 RenderSystem
improved GraphicsDeviceManager
This commit is contained in:
Glatzemann 2011-11-03 12:37:07 +00:00
parent 536a7d66fc
commit ded4cb1857
16 changed files with 583 additions and 386 deletions

View File

@ -68,6 +68,7 @@
<Compile Include="EffectParameter_DX10.cs" />
<Compile Include="EffectTechnique_DX10.cs" />
<Compile Include="Effect_DX10.cs" />
<Compile Include="FormatConverter.cs" />
<Compile Include="GraphicsDeviceWindowsDX10.cs" />
<Compile Include="IndexBuffer_DX10.cs" />
<Compile Include="NativeMethods.cs" />

View File

@ -140,7 +140,7 @@ namespace ANX.Framework.Windows.DX10
{
set
{
BlendOperation alphaBlendOperation = Translate(value);
BlendOperation alphaBlendOperation = FormatConverter.Translate(value);
if (description.AlphaBlendOperation != alphaBlendOperation)
{
@ -154,7 +154,7 @@ namespace ANX.Framework.Windows.DX10
{
set
{
BlendOperation blendOperation = Translate(value);
BlendOperation blendOperation = FormatConverter.Translate(value);
if (description.BlendOperation != blendOperation)
{
@ -168,7 +168,7 @@ namespace ANX.Framework.Windows.DX10
{
set
{
BlendOption destinationAlphaBlend = Translate(value);
BlendOption destinationAlphaBlend = FormatConverter.Translate(value);
if (description.DestinationAlphaBlend != destinationAlphaBlend)
{
@ -182,7 +182,7 @@ namespace ANX.Framework.Windows.DX10
{
set
{
BlendOption destinationBlend = Translate(value);
BlendOption destinationBlend = FormatConverter.Translate(value);
if (description.DestinationBlend != destinationBlend)
{
@ -196,7 +196,7 @@ namespace ANX.Framework.Windows.DX10
{
set
{
ColorWriteMaskFlags renderTargetWriteMask = Translate(value);
ColorWriteMaskFlags renderTargetWriteMask = FormatConverter.Translate(value);
if (description.RenderTargetWriteMask[0] != renderTargetWriteMask)
{
@ -210,7 +210,7 @@ namespace ANX.Framework.Windows.DX10
{
set
{
ColorWriteMaskFlags renderTargetWriteMask = Translate(value);
ColorWriteMaskFlags renderTargetWriteMask = FormatConverter.Translate(value);
if (description.RenderTargetWriteMask[1] != renderTargetWriteMask)
{
@ -224,7 +224,7 @@ namespace ANX.Framework.Windows.DX10
{
set
{
ColorWriteMaskFlags renderTargetWriteMask = Translate(value);
ColorWriteMaskFlags renderTargetWriteMask = FormatConverter.Translate(value);
if (description.RenderTargetWriteMask[2] != renderTargetWriteMask)
{
@ -238,7 +238,7 @@ namespace ANX.Framework.Windows.DX10
{
set
{
ColorWriteMaskFlags renderTargetWriteMask = Translate(value);
ColorWriteMaskFlags renderTargetWriteMask = FormatConverter.Translate(value);
if (description.RenderTargetWriteMask[3] != renderTargetWriteMask)
{
@ -252,7 +252,7 @@ namespace ANX.Framework.Windows.DX10
{
set
{
BlendOption sourceAlphaBlend = Translate(value);
BlendOption sourceAlphaBlend = FormatConverter.Translate(value);
if (description.SourceAlphaBlend != sourceAlphaBlend)
{
@ -266,7 +266,7 @@ namespace ANX.Framework.Windows.DX10
{
set
{
BlendOption sourceBlend = Translate(value);
BlendOption sourceBlend = FormatConverter.Translate(value);
if (description.SourceBlend != sourceBlend)
{
@ -291,78 +291,5 @@ namespace ANX.Framework.Windows.DX10
this.nativeBlendStateDirty = false;
}
}
private BlendOperation Translate(BlendFunction blendFunction)
{
switch (blendFunction)
{
case BlendFunction.Add:
return BlendOperation.Add;
case BlendFunction.Max:
return BlendOperation.Maximum;
case BlendFunction.Min:
return BlendOperation.Minimum;
case BlendFunction.ReverseSubtract:
return BlendOperation.ReverseSubtract;
case BlendFunction.Subtract:
return BlendOperation.Subtract;
}
throw new NotImplementedException();
}
private BlendOption Translate(Blend blend)
{
switch (blend)
{
case Blend.BlendFactor:
return BlendOption.BlendFactor;
case Blend.DestinationAlpha:
return BlendOption.DestinationAlpha;
case Blend.DestinationColor:
return BlendOption.DestinationColor;
case Blend.InverseBlendFactor:
return BlendOption.InverseBlendFactor;
case Blend.InverseDestinationAlpha:
return BlendOption.InverseDestinationAlpha;
case Blend.InverseDestinationColor:
return BlendOption.InverseDestinationColor;
case Blend.InverseSourceAlpha:
return BlendOption.InverseSourceAlpha;
case Blend.InverseSourceColor:
return BlendOption.InverseSourceColor;
case Blend.One:
return BlendOption.One;
case Blend.SourceAlpha:
return BlendOption.SourceAlpha;
case Blend.SourceAlphaSaturation:
return BlendOption.SourceAlphaSaturate;
case Blend.SourceColor:
return BlendOption.SourceColor;
case Blend.Zero:
return BlendOption.Zero;
}
throw new NotImplementedException();
}
private ColorWriteMaskFlags Translate(ColorWriteChannels colorWriteChannels)
{
switch (colorWriteChannels)
{
case ColorWriteChannels.All:
return ColorWriteMaskFlags.All;
case ColorWriteChannels.Alpha:
return ColorWriteMaskFlags.Alpha;
case ColorWriteChannels.Blue:
return ColorWriteMaskFlags.Blue;
case ColorWriteChannels.Green:
return ColorWriteMaskFlags.Green;
case ColorWriteChannels.Red:
return ColorWriteMaskFlags.Red;
}
throw new NotImplementedException();
}
}
}

View File

@ -128,7 +128,7 @@ namespace ANX.Framework.Windows.DX10
Height = height,
MipLevels = mipCount,
ArraySize = mipCount,
Format = Translate(surfaceFormat),
Format = FormatConverter.Translate(surfaceFormat),
SampleDescription = new SharpDX.DXGI.SampleDescription(1, 0),
Usage = SharpDX.Direct3D10.ResourceUsage.Dynamic,
BindFlags = SharpDX.Direct3D10.BindFlags.ShaderResource,
@ -231,21 +231,6 @@ namespace ANX.Framework.Windows.DX10
return new SamplerState_DX10();
}
private SharpDX.DXGI.Format Translate(SurfaceFormat surfaceFormat)
{
switch (surfaceFormat)
{
case SurfaceFormat.Color:
return SharpDX.DXGI.Format.R8G8B8A8_UNorm;
case SurfaceFormat.Dxt3:
return SharpDX.DXGI.Format.BC2_UNorm;
case SurfaceFormat.Dxt5:
return SharpDX.DXGI.Format.BC3_UNorm;
}
throw new Exception("can't translate SurfaceFormat: " + surfaceFormat.ToString());
}
private static int FormatSize(SurfaceFormat format)
{
switch (format)
@ -288,5 +273,58 @@ namespace ANX.Framework.Windows.DX10
{
factory.AddCreator(this);
}
public System.Collections.ObjectModel.ReadOnlyCollection<GraphicsAdapter> GetAdapterList()
{
SharpDX.DXGI.Factory factory = new Factory();
List<GraphicsAdapter> adapterList = new List<GraphicsAdapter>();
DisplayModeCollection displayModeCollection = new DisplayModeCollection();
for (int i = 0; i < factory.GetAdapterCount(); i++)
{
using (Adapter adapter = factory.GetAdapter(i))
{
GraphicsAdapter ga = new GraphicsAdapter();
//ga.CurrentDisplayMode = ;
//ga.Description = ;
ga.DeviceId = adapter.Description.DeviceId;
ga.DeviceName = adapter.Description.Description;
ga.IsDefaultAdapter = i == 0; //TODO: how to set default adapter?
//ga.IsWideScreen = ;
//ga.MonitorHandle = ;
ga.Revision = adapter.Description.Revision;
ga.SubSystemId = adapter.Description.SubsystemId;
//ga.SupportedDisplayModes = ;
ga.VendorId = adapter.Description.VendorId;
using (Output adapterOutput = adapter.GetOutput(0))
{
foreach (ModeDescription modeDescription in adapterOutput.GetDisplayModeList(Format.R8G8B8A8_UNorm, DisplayModeEnumerationFlags.Interlaced))
{
DisplayMode displayMode = new DisplayMode()
{
Format = FormatConverter.Translate(modeDescription.Format),
Width = modeDescription.Width,
Height = modeDescription.Height,
AspectRatio = (float)modeDescription.Width / (float)modeDescription.Height,
TitleSafeArea = new Rectangle(0, 0, modeDescription.Width, modeDescription.Height), //TODO: calculate this for real
};
displayModeCollection[displayMode.Format] = new DisplayMode[] { displayMode };
}
}
ga.SupportedDisplayModes = displayModeCollection;
adapterList.Add(ga);
}
}
factory.Dispose();
return new System.Collections.ObjectModel.ReadOnlyCollection<GraphicsAdapter>(adapterList);
}
}
}

View File

@ -63,7 +63,7 @@ namespace ANX.Framework.Windows.DX10
{
set
{
SharpDX.Direct3D10.StencilOperation operation = Translate(value);
SharpDX.Direct3D10.StencilOperation operation = FormatConverter.Translate(value);
if (description.BackFace.DepthFailOperation != operation)
{
@ -77,7 +77,7 @@ namespace ANX.Framework.Windows.DX10
{
set
{
SharpDX.Direct3D10.StencilOperation operation = Translate(value);
SharpDX.Direct3D10.StencilOperation operation = FormatConverter.Translate(value);
if (description.BackFace.FailOperation != operation)
{
@ -91,7 +91,7 @@ namespace ANX.Framework.Windows.DX10
{
set
{
SharpDX.Direct3D10.Comparison comparison = Translate(value);
SharpDX.Direct3D10.Comparison comparison = FormatConverter.Translate(value);
if (description.BackFace.Comparison != comparison)
{
@ -105,7 +105,7 @@ namespace ANX.Framework.Windows.DX10
{
set
{
SharpDX.Direct3D10.StencilOperation operation = Translate(value);
SharpDX.Direct3D10.StencilOperation operation = FormatConverter.Translate(value);
if (description.BackFace.PassOperation != operation)
{
@ -131,7 +131,7 @@ namespace ANX.Framework.Windows.DX10
{
set
{
SharpDX.Direct3D10.Comparison comparison = Translate(value);
SharpDX.Direct3D10.Comparison comparison = FormatConverter.Translate(value);
if (description.DepthComparison != comparison)
{
@ -171,7 +171,7 @@ namespace ANX.Framework.Windows.DX10
{
set
{
SharpDX.Direct3D10.StencilOperation operation = Translate(value);
SharpDX.Direct3D10.StencilOperation operation = FormatConverter.Translate(value);
if (description.FrontFace.DepthFailOperation != operation)
{
@ -197,7 +197,7 @@ namespace ANX.Framework.Windows.DX10
{
set
{
SharpDX.Direct3D10.StencilOperation operation = Translate(value);
SharpDX.Direct3D10.StencilOperation operation = FormatConverter.Translate(value);
if (description.FrontFace.FailOperation != operation)
{
@ -211,7 +211,7 @@ namespace ANX.Framework.Windows.DX10
{
set
{
SharpDX.Direct3D10.Comparison comparison = Translate(value);
SharpDX.Direct3D10.Comparison comparison = FormatConverter.Translate(value);
if (description.FrontFace.Comparison != comparison)
{
@ -238,8 +238,8 @@ namespace ANX.Framework.Windows.DX10
public Graphics.StencilOperation StencilPass
{
set
{
SharpDX.Direct3D10.StencilOperation operation = Translate(value);
{
SharpDX.Direct3D10.StencilOperation operation = FormatConverter.Translate(value);
if (description.FrontFace.PassOperation != operation)
{
@ -286,56 +286,5 @@ namespace ANX.Framework.Windows.DX10
this.nativeDepthStencilStateDirty = false;
}
}
private SharpDX.Direct3D10.StencilOperation Translate(ANX.Framework.Graphics.StencilOperation stencilOperation)
{
switch (stencilOperation)
{
case Graphics.StencilOperation.Decrement:
return StencilOperation.Decrement;
case Graphics.StencilOperation.DecrementSaturation:
return StencilOperation.DecrementAndClamp;
case Graphics.StencilOperation.Increment:
return StencilOperation.Increment;
case Graphics.StencilOperation.IncrementSaturation:
return StencilOperation.IncrementAndClamp;
case Graphics.StencilOperation.Invert:
return StencilOperation.Invert;
case Graphics.StencilOperation.Keep:
return StencilOperation.Keep;
case Graphics.StencilOperation.Replace:
return StencilOperation.Replace;
case Graphics.StencilOperation.Zero:
return StencilOperation.Zero;
}
throw new NotImplementedException("unknown StencilOperation");
}
private Comparison Translate(ANX.Framework.Graphics.CompareFunction compareFunction)
{
switch (compareFunction)
{
case ANX.Framework.Graphics.CompareFunction.Always:
return Comparison.Always;
case ANX.Framework.Graphics.CompareFunction.Equal:
return Comparison.Equal;
case ANX.Framework.Graphics.CompareFunction.Greater:
return Comparison.Greater;
case ANX.Framework.Graphics.CompareFunction.GreaterEqual:
return Comparison.GreaterEqual;
case ANX.Framework.Graphics.CompareFunction.Less:
return Comparison.Less;
case ANX.Framework.Graphics.CompareFunction.LessEqual:
return Comparison.LessEqual;
case ANX.Framework.Graphics.CompareFunction.Never:
return Comparison.Never;
case ANX.Framework.Graphics.CompareFunction.NotEqual:
return Comparison.NotEqual;
}
throw new NotImplementedException("unknown CompareFunction");
}
}
}

View File

@ -0,0 +1,328 @@
#region Using Statements
using System;
using ANX.Framework.Graphics;
using SharpDX.Direct3D10;
using SharpDX.Direct3D;
using SharpDX.DXGI;
#endregion // Using Statements
#region License
//
// This file is part of the ANX.Framework created by the "ANX.Framework developer group".
//
// This file is released under the Ms-PL license.
//
//
//
// Microsoft Public License (Ms-PL)
//
// This license governs use of the accompanying software. If you use the software, you accept this license.
// If you do not accept the license, do not use the software.
//
// 1.Definitions
// The terms "reproduce," "reproduction," "derivative works," and "distribution" have the same meaning
// here as under U.S. copyright law.
// A "contribution" is the original software, or any additions or changes to the software.
// A "contributor" is any person that distributes its contribution under this license.
// "Licensed patents" are a contributor's patent claims that read directly on its contribution.
//
// 2.Grant of Rights
// (A) Copyright Grant- Subject to the terms of this license, including the license conditions and limitations
// in section 3, each contributor grants you a non-exclusive, worldwide, royalty-free copyright license to
// reproduce its contribution, prepare derivative works of its contribution, and distribute its contribution
// or any derivative works that you create.
// (B) Patent Grant- Subject to the terms of this license, including the license conditions and limitations in
// section 3, each contributor grants you a non-exclusive, worldwide, royalty-free license under its licensed
// patents to make, have made, use, sell, offer for sale, import, and/or otherwise dispose of its contribution
// in the software or derivative works of the contribution in the software.
//
// 3.Conditions and Limitations
// (A) No Trademark License- This license does not grant you rights to use any contributors' name, logo, or trademarks.
// (B) If you bring a patent claim against any contributor over patents that you claim are infringed by the software, your
// patent license from such contributor to the software ends automatically.
// (C) If you distribute any portion of the software, you must retain all copyright, patent, trademark, and attribution
// notices that are present in the software.
// (D) If you distribute any portion of the software in source code form, you may do so only under this license by including
// a complete copy of this license with your distribution. If you distribute any portion of the software in compiled or
// object code form, you may only do so under a license that complies with this license.
// (E) The software is licensed "as-is." You bear the risk of using it. The contributors give no express warranties, guarantees,
// or conditions. You may have additional consumer rights under your local laws which this license cannot change. To the
// extent permitted under your local laws, the contributors exclude the implied warranties of merchantability, fitness for a
// particular purpose and non-infringement.
#endregion // License
namespace ANX.Framework.Windows.DX10
{
internal class FormatConverter
{
public static SharpDX.DXGI.Format Translate(SurfaceFormat surfaceFormat)
{
switch (surfaceFormat)
{
case SurfaceFormat.Color:
return SharpDX.DXGI.Format.R8G8B8A8_UNorm;
case SurfaceFormat.Dxt3:
return SharpDX.DXGI.Format.BC2_UNorm;
case SurfaceFormat.Dxt5:
return SharpDX.DXGI.Format.BC3_UNorm;
}
throw new Exception("can't translate SurfaceFormat: " + surfaceFormat.ToString());
}
public static SurfaceFormat Translate(SharpDX.DXGI.Format format)
{
switch (format)
{
case SharpDX.DXGI.Format.R8G8B8A8_UNorm:
return SurfaceFormat.Color;
case SharpDX.DXGI.Format.BC2_UNorm:
return SurfaceFormat.Dxt3;
case SharpDX.DXGI.Format.BC3_UNorm:
return SurfaceFormat.Dxt5;
}
throw new Exception("can't translate Format: " + format.ToString());
}
public static Filter Translate(TextureFilter filter)
{
switch (filter)
{
case TextureFilter.Anisotropic:
return Filter.Anisotropic;
case TextureFilter.Linear:
return Filter.MinMagMipLinear;
case TextureFilter.LinearMipPoint:
return Filter.MinMagMipPoint;
case TextureFilter.MinLinearMagPointMipLinear:
return Filter.MinLinearMagPointMipLinear;
case TextureFilter.MinLinearMagPointMipPoint:
return Filter.MinLinearMagMipPoint;
case TextureFilter.MinPointMagLinearMipLinear:
return Filter.MinPointMagMipLinear;
case TextureFilter.MinPointMagLinearMipPoint:
return Filter.MinPointMagLinearMipPoint;
case TextureFilter.Point:
return Filter.MinMagMipPoint;
case TextureFilter.PointMipLinear:
return Filter.MinMagPointMipLinear;
}
throw new NotImplementedException();
}
public static SharpDX.Direct3D10.TextureAddressMode Translate(ANX.Framework.Graphics.TextureAddressMode addressMode)
{
switch (addressMode)
{
case Graphics.TextureAddressMode.Clamp:
return SharpDX.Direct3D10.TextureAddressMode.Clamp;
case Graphics.TextureAddressMode.Mirror:
return SharpDX.Direct3D10.TextureAddressMode.Mirror;
case Graphics.TextureAddressMode.Wrap:
return SharpDX.Direct3D10.TextureAddressMode.Wrap;
}
return SharpDX.Direct3D10.TextureAddressMode.Clamp;
}
public static PrimitiveTopology Translate(PrimitiveType primitiveType)
{
switch (primitiveType)
{
case PrimitiveType.LineList:
return PrimitiveTopology.LineList;
case PrimitiveType.LineStrip:
return PrimitiveTopology.LineStrip;
case PrimitiveType.TriangleList:
return PrimitiveTopology.TriangleList;
case PrimitiveType.TriangleStrip:
return PrimitiveTopology.TriangleStrip;
default:
throw new InvalidOperationException("unknown PrimitiveType: " + primitiveType.ToString());
}
}
public static SharpDX.DXGI.Format Translate(IndexElementSize indexElementSize)
{
switch (indexElementSize)
{
case IndexElementSize.SixteenBits:
return Format.R16_UInt;
case IndexElementSize.ThirtyTwoBits:
return Format.R32_UInt;
default:
throw new InvalidOperationException("unknown IndexElementSize: " + indexElementSize.ToString());
}
}
public static string Translate(VertexElementUsage usage)
{
//TODO: map the other Usages
if (usage == VertexElementUsage.TextureCoordinate)
{
return "TEXCOORD";
}
else
{
return usage.ToString().ToUpperInvariant();
}
}
public static BlendOperation Translate(BlendFunction blendFunction)
{
switch (blendFunction)
{
case BlendFunction.Add:
return BlendOperation.Add;
case BlendFunction.Max:
return BlendOperation.Maximum;
case BlendFunction.Min:
return BlendOperation.Minimum;
case BlendFunction.ReverseSubtract:
return BlendOperation.ReverseSubtract;
case BlendFunction.Subtract:
return BlendOperation.Subtract;
}
throw new NotImplementedException();
}
public static BlendOption Translate(Blend blend)
{
switch (blend)
{
case Blend.BlendFactor:
return BlendOption.BlendFactor;
case Blend.DestinationAlpha:
return BlendOption.DestinationAlpha;
case Blend.DestinationColor:
return BlendOption.DestinationColor;
case Blend.InverseBlendFactor:
return BlendOption.InverseBlendFactor;
case Blend.InverseDestinationAlpha:
return BlendOption.InverseDestinationAlpha;
case Blend.InverseDestinationColor:
return BlendOption.InverseDestinationColor;
case Blend.InverseSourceAlpha:
return BlendOption.InverseSourceAlpha;
case Blend.InverseSourceColor:
return BlendOption.InverseSourceColor;
case Blend.One:
return BlendOption.One;
case Blend.SourceAlpha:
return BlendOption.SourceAlpha;
case Blend.SourceAlphaSaturation:
return BlendOption.SourceAlphaSaturate;
case Blend.SourceColor:
return BlendOption.SourceColor;
case Blend.Zero:
return BlendOption.Zero;
}
throw new NotImplementedException();
}
public static ColorWriteMaskFlags Translate(ColorWriteChannels colorWriteChannels)
{
switch (colorWriteChannels)
{
case ColorWriteChannels.All:
return ColorWriteMaskFlags.All;
case ColorWriteChannels.Alpha:
return ColorWriteMaskFlags.Alpha;
case ColorWriteChannels.Blue:
return ColorWriteMaskFlags.Blue;
case ColorWriteChannels.Green:
return ColorWriteMaskFlags.Green;
case ColorWriteChannels.Red:
return ColorWriteMaskFlags.Red;
}
throw new NotImplementedException();
}
public static SharpDX.Direct3D10.StencilOperation Translate(ANX.Framework.Graphics.StencilOperation stencilOperation)
{
switch (stencilOperation)
{
case Graphics.StencilOperation.Decrement:
return SharpDX.Direct3D10.StencilOperation.Decrement;
case Graphics.StencilOperation.DecrementSaturation:
return SharpDX.Direct3D10.StencilOperation.DecrementAndClamp;
case Graphics.StencilOperation.Increment:
return SharpDX.Direct3D10.StencilOperation.Increment;
case Graphics.StencilOperation.IncrementSaturation:
return SharpDX.Direct3D10.StencilOperation.IncrementAndClamp;
case Graphics.StencilOperation.Invert:
return SharpDX.Direct3D10.StencilOperation.Invert;
case Graphics.StencilOperation.Keep:
return SharpDX.Direct3D10.StencilOperation.Keep;
case Graphics.StencilOperation.Replace:
return SharpDX.Direct3D10.StencilOperation.Replace;
case Graphics.StencilOperation.Zero:
return SharpDX.Direct3D10.StencilOperation.Zero;
}
throw new NotImplementedException("unknown StencilOperation");
}
public static Comparison Translate(ANX.Framework.Graphics.CompareFunction compareFunction)
{
switch (compareFunction)
{
case ANX.Framework.Graphics.CompareFunction.Always:
return Comparison.Always;
case ANX.Framework.Graphics.CompareFunction.Equal:
return Comparison.Equal;
case ANX.Framework.Graphics.CompareFunction.Greater:
return Comparison.Greater;
case ANX.Framework.Graphics.CompareFunction.GreaterEqual:
return Comparison.GreaterEqual;
case ANX.Framework.Graphics.CompareFunction.Less:
return Comparison.Less;
case ANX.Framework.Graphics.CompareFunction.LessEqual:
return Comparison.LessEqual;
case ANX.Framework.Graphics.CompareFunction.Never:
return Comparison.Never;
case ANX.Framework.Graphics.CompareFunction.NotEqual:
return Comparison.NotEqual;
}
throw new NotImplementedException("unknown CompareFunction");
}
public static SharpDX.Direct3D10.CullMode Translate(ANX.Framework.Graphics.CullMode cullMode)
{
if (cullMode == Graphics.CullMode.CullClockwiseFace)
{
return SharpDX.Direct3D10.CullMode.Front;
}
else if (cullMode == Graphics.CullMode.CullCounterClockwiseFace)
{
return SharpDX.Direct3D10.CullMode.Back;
}
else
{
return SharpDX.Direct3D10.CullMode.None;
}
}
public static SharpDX.Direct3D10.FillMode Translate(ANX.Framework.Graphics.FillMode fillMode)
{
if (fillMode == Graphics.FillMode.WireFrame)
{
return SharpDX.Direct3D10.FillMode.Wireframe;
}
else
{
return SharpDX.Direct3D10.FillMode.Solid;
}
}
}
}

View File

@ -199,7 +199,7 @@ namespace ANX.Framework.Windows.DX10
SetupInputLayout(passSignature);
// Prepare All the stages
device.InputAssembler.PrimitiveTopology = Translate(primitiveType);
device.InputAssembler.PrimitiveTopology = FormatConverter.Translate(primitiveType);
device.Rasterizer.SetViewports(currentViewport);
device.OutputMerger.SetTargets(this.renderView);
@ -219,7 +219,7 @@ namespace ANX.Framework.Windows.DX10
SetupInputLayout(passSignature);
// Prepare All the stages
device.InputAssembler.PrimitiveTopology = Translate(primitiveType);
device.InputAssembler.PrimitiveTopology = FormatConverter.Translate(primitiveType);
device.Rasterizer.SetViewports(currentViewport);
device.OutputMerger.SetTargets(this.renderView);
@ -243,7 +243,7 @@ namespace ANX.Framework.Windows.DX10
if (nativeIndexBuffer != null)
{
device.InputAssembler.SetIndexBuffer(nativeIndexBuffer.NativeBuffer, Translate(indexBuffer.IndexElementSize), 0);
device.InputAssembler.SetIndexBuffer(nativeIndexBuffer.NativeBuffer, FormatConverter.Translate(indexBuffer.IndexElementSize), 0);
}
else
{
@ -287,48 +287,6 @@ namespace ANX.Framework.Windows.DX10
this.currentViewport = new SharpDX.Direct3D10.Viewport(viewport.X, viewport.Y, viewport.Width, viewport.Height, viewport.MinDepth, viewport.MaxDepth);
}
private Filter Translate(TextureFilter filter)
{
switch (filter)
{
case TextureFilter.Anisotropic:
return Filter.Anisotropic;
case TextureFilter.Linear:
return Filter.MinMagMipLinear;
case TextureFilter.LinearMipPoint:
return Filter.MinMagMipPoint;
case TextureFilter.MinLinearMagPointMipLinear:
return Filter.MinLinearMagPointMipLinear;
case TextureFilter.MinLinearMagPointMipPoint:
return Filter.MinLinearMagMipPoint;
case TextureFilter.MinPointMagLinearMipLinear:
return Filter.MinPointMagMipLinear;
case TextureFilter.MinPointMagLinearMipPoint:
return Filter.MinPointMagLinearMipPoint;
case TextureFilter.Point:
return Filter.MinMagMipPoint;
case TextureFilter.PointMipLinear:
return Filter.MinMagPointMipLinear;
}
throw new NotImplementedException();
}
private SharpDX.Direct3D10.TextureAddressMode Translate(ANX.Framework.Graphics.TextureAddressMode addressMode)
{
switch (addressMode)
{
case Graphics.TextureAddressMode.Clamp:
return SharpDX.Direct3D10.TextureAddressMode.Clamp;
case Graphics.TextureAddressMode.Mirror:
return SharpDX.Direct3D10.TextureAddressMode.Mirror;
case Graphics.TextureAddressMode.Wrap:
return SharpDX.Direct3D10.TextureAddressMode.Wrap;
}
return SharpDX.Direct3D10.TextureAddressMode.Clamp;
}
/// <summary>
/// This method creates a InputLayout which is needed by DirectX 10 for rendering primitives. The VertexDeclaration of ANX/XNA needs to be mapped
/// to the DirectX 10 types. This is what this method is for.
@ -350,7 +308,7 @@ namespace ANX.Framework.Windows.DX10
private InputElement CreateInputElementFromVertexElement(VertexElement vertexElement)
{
string elementName = Translate(vertexElement.VertexElementUsage);
string elementName = FormatConverter.Translate(vertexElement.VertexElementUsage);
Format elementFormat;
switch (vertexElement.VertexElementFormat)
@ -373,48 +331,5 @@ namespace ANX.Framework.Windows.DX10
return new InputElement(elementName, vertexElement.UsageIndex, elementFormat, vertexElement.Offset, 0);
}
private PrimitiveTopology Translate(PrimitiveType primitiveType)
{
switch (primitiveType)
{
case PrimitiveType.LineList:
return PrimitiveTopology.LineList;
case PrimitiveType.LineStrip:
return PrimitiveTopology.LineStrip;
case PrimitiveType.TriangleList:
return PrimitiveTopology.TriangleList;
case PrimitiveType.TriangleStrip:
return PrimitiveTopology.TriangleStrip;
default:
throw new InvalidOperationException("unknown PrimitiveType: " + primitiveType.ToString());
}
}
private SharpDX.DXGI.Format Translate(IndexElementSize indexElementSize)
{
switch (indexElementSize)
{
case IndexElementSize.SixteenBits:
return Format.R16_UInt;
case IndexElementSize.ThirtyTwoBits:
return Format.R32_UInt;
default:
throw new InvalidOperationException("unknown IndexElementSize: " + indexElementSize.ToString());
}
}
private string Translate(VertexElementUsage usage)
{
//TODO: map the other Usages
if (usage == VertexElementUsage.TextureCoordinate)
{
return "TEXCOORD";
}
else
{
return usage.ToString().ToUpperInvariant();
}
}
}
}

View File

@ -116,7 +116,7 @@ namespace ANX.Framework.Windows.DX10
{
set
{
SharpDX.Direct3D10.CullMode cullMode = Translate(value);
SharpDX.Direct3D10.CullMode cullMode = FormatConverter.Translate(value);
if (description.CullMode != cullMode)
{
@ -147,7 +147,7 @@ namespace ANX.Framework.Windows.DX10
{
set
{
SharpDX.Direct3D10.FillMode fillMode = Translate(value);
SharpDX.Direct3D10.FillMode fillMode = FormatConverter.Translate(value);
if (description.FillMode != fillMode)
{
@ -208,33 +208,5 @@ namespace ANX.Framework.Windows.DX10
this.nativeRasterizerStateDirty = false;
}
}
private SharpDX.Direct3D10.CullMode Translate(ANX.Framework.Graphics.CullMode cullMode)
{
if (cullMode == Graphics.CullMode.CullClockwiseFace)
{
return SharpDX.Direct3D10.CullMode.Front;
}
else if (cullMode == Graphics.CullMode.CullCounterClockwiseFace)
{
return SharpDX.Direct3D10.CullMode.Back;
}
else
{
return SharpDX.Direct3D10.CullMode.None;
}
}
private SharpDX.Direct3D10.FillMode Translate(ANX.Framework.Graphics.FillMode fillMode)
{
if (fillMode == Graphics.FillMode.WireFrame)
{
return SharpDX.Direct3D10.FillMode.Wireframe;
}
else
{
return SharpDX.Direct3D10.FillMode.Solid;
}
}
}
}

View File

@ -100,7 +100,7 @@ namespace ANX.Framework.Windows.DX10
{
set
{
SharpDX.Direct3D10.TextureAddressMode mode = Translate(value);
SharpDX.Direct3D10.TextureAddressMode mode = FormatConverter.Translate(value);
if (description.AddressU != mode)
{
@ -114,7 +114,7 @@ namespace ANX.Framework.Windows.DX10
{
set
{
SharpDX.Direct3D10.TextureAddressMode mode = Translate(value);
SharpDX.Direct3D10.TextureAddressMode mode = FormatConverter.Translate(value);
if (description.AddressV != mode)
{
@ -128,7 +128,7 @@ namespace ANX.Framework.Windows.DX10
{
set
{
SharpDX.Direct3D10.TextureAddressMode mode = Translate(value);
SharpDX.Direct3D10.TextureAddressMode mode = FormatConverter.Translate(value);
if (description.AddressW != mode)
{
@ -142,7 +142,7 @@ namespace ANX.Framework.Windows.DX10
{
set
{
SharpDX.Direct3D10.Filter filter = Translate(value);
SharpDX.Direct3D10.Filter filter = FormatConverter.Translate(value);
if (description.Filter != filter)
{
@ -212,48 +212,5 @@ namespace ANX.Framework.Windows.DX10
this.nativeSamplerStateDirty = false;
}
}
private SharpDX.Direct3D10.TextureAddressMode Translate(ANX.Framework.Graphics.TextureAddressMode addressMode)
{
switch (addressMode)
{
case Graphics.TextureAddressMode.Clamp:
return SharpDX.Direct3D10.TextureAddressMode.Clamp;
case Graphics.TextureAddressMode.Mirror:
return SharpDX.Direct3D10.TextureAddressMode.Mirror;
case Graphics.TextureAddressMode.Wrap:
return SharpDX.Direct3D10.TextureAddressMode.Wrap;
}
return SharpDX.Direct3D10.TextureAddressMode.Clamp;
}
private Filter Translate(TextureFilter filter)
{
switch (filter)
{
case TextureFilter.Anisotropic:
return SharpDX.Direct3D10.Filter.Anisotropic;
case TextureFilter.Linear:
return SharpDX.Direct3D10.Filter.MinMagMipLinear;
case TextureFilter.LinearMipPoint:
return SharpDX.Direct3D10.Filter.MinMagMipPoint;
case TextureFilter.MinLinearMagPointMipLinear:
return SharpDX.Direct3D10.Filter.MinLinearMagPointMipLinear;
case TextureFilter.MinLinearMagPointMipPoint:
return SharpDX.Direct3D10.Filter.MinLinearMagMipPoint;
case TextureFilter.MinPointMagLinearMipLinear:
return SharpDX.Direct3D10.Filter.MinPointMagMipLinear;
case TextureFilter.MinPointMagLinearMipPoint:
return SharpDX.Direct3D10.Filter.MinPointMagLinearMipPoint;
case TextureFilter.Point:
return SharpDX.Direct3D10.Filter.MinMagMipPoint;
case TextureFilter.PointMipLinear:
return SharpDX.Direct3D10.Filter.MinMagPointMipLinear;
}
throw new NotImplementedException();
}
}
}

View File

@ -223,5 +223,11 @@ namespace ANX.Framework.Windows.GL3
}
}
#endregion
}
public System.Collections.ObjectModel.ReadOnlyCollection<GraphicsAdapter> GetAdapterList()
{
throw new NotImplementedException();
}
}
}

View File

@ -56,42 +56,32 @@ namespace ANX.Framework.Graphics
{
public float AspectRatio
{
get
{
throw new NotImplementedException();
}
get;
set;
}
public SurfaceFormat Format
{
get
{
throw new NotImplementedException();
}
get;
set;
}
public int Height
{
get
{
throw new NotImplementedException();
}
get;
set;
}
public Rectangle TitleSafeArea
{
get
{
throw new NotImplementedException();
}
get;
set;
}
public int Width
{
get
{
throw new NotImplementedException();
}
get;
set;
}
public override string ToString()

View File

@ -56,6 +56,7 @@ namespace ANX.Framework.Graphics
{
public class DisplayModeCollection : IEnumerable<DisplayMode>, IEnumerable
{
private List<DisplayMode> displayModes = new List<DisplayMode>();
public IEnumerator<DisplayMode> GetEnumerator()
{
@ -71,7 +72,20 @@ namespace ANX.Framework.Graphics
{
get
{
throw new NotImplementedException();
foreach (DisplayMode mode in displayModes)
{
if (mode.Format == format)
{
yield return mode;
}
}
}
set
{
foreach (DisplayMode mode in value)
{
displayModes.Add(mode);
}
}
}

View File

@ -4,6 +4,7 @@ using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections.ObjectModel;
using ANX.Framework.NonXNA;
#endregion // Using Statements
@ -58,12 +59,22 @@ namespace ANX.Framework.Graphics
{
public sealed class GraphicsAdapter
{
private static List<GraphicsAdapter> adapters;
private DisplayModeCollection supportedDisplayModes;
static GraphicsAdapter()
{
adapters = new List<GraphicsAdapter>();
IRenderSystemCreator renderSystemCreator = AddInSystemFactory.Instance.GetCurrentCreator<IRenderSystemCreator>();
adapters.AddRange(renderSystemCreator.GetAdapterList());
}
public static ReadOnlyCollection<GraphicsAdapter> Adapters
{
get
{
throw new NotImplementedException();
return new ReadOnlyCollection<GraphicsAdapter>(adapters);
}
}
@ -71,7 +82,8 @@ namespace ANX.Framework.Graphics
{
get
{
throw new NotImplementedException();
GraphicsAdapter defaultAdapter = adapters.Where(a => a.IsDefaultAdapter).First<GraphicsAdapter>();
return defaultAdapter;
}
}
@ -105,26 +117,20 @@ namespace ANX.Framework.Graphics
public int DeviceId
{
get
{
throw new NotImplementedException();
}
get;
set;
}
public string DeviceName
{
get
{
throw new NotImplementedException();
}
get;
set;
}
public bool IsDefaultAdapter
{
get
{
throw new NotImplementedException();
}
get;
set;
}
public bool IsWideScreen
@ -145,34 +151,32 @@ namespace ANX.Framework.Graphics
public int Revision
{
get
{
throw new NotImplementedException();
}
get;
set;
}
public int SubSystemId
{
get
{
throw new NotImplementedException();
}
get;
set;
}
public DisplayModeCollection SupportedDisplayModes
{
get
{
throw new NotImplementedException();
return this.supportedDisplayModes;
}
set
{
this.supportedDisplayModes = value;
}
}
public int VendorId
{
get
{
throw new NotImplementedException();
}
get;
set;
}
public bool IsProfileSupported(GraphicsProfile graphicsProfile)

View File

@ -66,9 +66,14 @@ namespace ANX.Framework.Graphics
private BlendState blendState;
private RasterizerState rasterizerState;
private DepthStencilState depthStencilState;
private GraphicsAdapter currentAdapter;
private PresentationParameters currentPresentationParameters;
public GraphicsDevice(PresentationParameters presentationParameters)
public GraphicsDevice(GraphicsAdapter adapter, GraphicsProfile graphicsProfile, PresentationParameters presentationParameters)
{
this.currentAdapter = adapter;
this.currentPresentationParameters = presentationParameters;
this.viewport = new Viewport(0, 0, presentationParameters.BackBufferWidth, presentationParameters.BackBufferHeight);
nativeDevice = AddInSystemFactory.Instance.GetCurrentCreator<IRenderSystemCreator>().CreateGraphicsDevice(presentationParameters);
@ -148,6 +153,21 @@ namespace ANX.Framework.Graphics
nativeDevice.SetVertexBuffers(vertexBuffers);
}
public void Reset()
{
this.Reset(this.currentPresentationParameters, this.currentAdapter);
}
public void Reset(PresentationParameters presentationParameters)
{
this.Reset(presentationParameters, this.currentAdapter);
}
public void Reset(PresentationParameters presentationParameters, GraphicsAdapter adapter)
{
throw new NotImplementedException();
}
public void Dispose()
{
throw new NotImplementedException();

View File

@ -61,6 +61,7 @@ namespace ANX.Framework
#region Private Members
private Game game;
private GraphicsDevice graphicsDevice;
private DepthFormat depthStencilFormat = DepthFormat.Depth24;
public static readonly int DefaultBackBufferWidth = 800;
public static readonly int DefaultBackBufferHeight = 600; //TODO: this is 480 in the original XNA
@ -76,14 +77,45 @@ namespace ANX.Framework
public GraphicsDeviceManager(Game game)
{
//TODO: check arguments for null
if (game == null)
{
throw new ArgumentNullException("game");
}
this.game = game;
//TODO: check for duplicates
if (game.Services.GetService(typeof(IGraphicsDeviceManager)) != null)
{
throw new ArgumentException("The GraphicsDeviceManager was already registered to the game class");
}
game.Services.AddService(typeof(IGraphicsDeviceManager), this);
if (game.Services.GetService(typeof(IGraphicsDeviceService)) != null)
{
throw new ArgumentException("The GraphicsDeviceService was already registered to the game class");
}
game.Services.AddService(typeof(IGraphicsDeviceService), this);
game.Window.ClientSizeChanged += new EventHandler<EventArgs>(Window_ClientSizeChanged);
game.Window.ScreenDeviceNameChanged += new EventHandler<EventArgs>(Window_ScreenDeviceNameChanged);
game.Window.OrientationChanged += new EventHandler<EventArgs>(Window_OrientationChanged);
//TODO: read graphics profile type from manifest resource stream
}
void Window_OrientationChanged(object sender, EventArgs e)
{
throw new NotImplementedException();
}
void Window_ScreenDeviceNameChanged(object sender, EventArgs e)
{
throw new NotImplementedException();
}
void Window_ClientSizeChanged(object sender, EventArgs e)
{
throw new NotImplementedException();
}
public bool BeginDraw()
@ -92,6 +124,11 @@ namespace ANX.Framework
}
public void CreateDevice()
{
ApplyChanges();
}
private void CreateDevice(GraphicsDeviceInformation deviceInformation)
{
if (this.graphicsDevice != null)
{
@ -101,11 +138,13 @@ namespace ANX.Framework
//TODO: validate graphics device
PresentationParameters presentationParameters = new PresentationParameters();
presentationParameters.DeviceWindowHandle = game.Window.Handle;
presentationParameters.BackBufferWidth = DefaultBackBufferWidth; //TODO: set real default sizes
presentationParameters.BackBufferHeight = DefaultBackBufferHeight;
this.graphicsDevice = new GraphicsDevice(presentationParameters);
//TODO: this should be set somewhere else
deviceInformation.PresentationParameters.DeviceWindowHandle = game.Window.Handle;
deviceInformation.PresentationParameters.BackBufferWidth = DefaultBackBufferWidth; //TODO: set real default sizes
deviceInformation.PresentationParameters.BackBufferHeight = DefaultBackBufferHeight;
this.graphicsDevice = new GraphicsDevice(deviceInformation.Adapter, deviceInformation.GraphicsProfile, deviceInformation.PresentationParameters);
OnDeviceCreated(this, EventArgs.Empty);
//TODO: hookup events
}
@ -117,7 +156,31 @@ namespace ANX.Framework
public void ApplyChanges()
{
throw new NotImplementedException();
GraphicsDeviceInformation graphicsDeviceInformation = FindBestDevice(true);
OnPreparingDeviceSettings(this, new PreparingDeviceSettingsEventArgs(graphicsDeviceInformation));
if (graphicsDevice != null)
{
if (this.CanResetDevice(graphicsDeviceInformation))
{
OnDeviceResetting(this, EventArgs.Empty);
this.graphicsDevice.Reset(graphicsDeviceInformation.PresentationParameters, graphicsDeviceInformation.Adapter);
OnDeviceReset(this, EventArgs.Empty);
}
else
{
graphicsDevice.Dispose();
graphicsDevice = null;
}
}
if (graphicsDevice == null)
{
CreateDevice(graphicsDeviceInformation);
}
}
public void ToggleFullScreen()
@ -132,7 +195,8 @@ namespace ANX.Framework
protected GraphicsDeviceInformation FindBestDevice(bool anySuitableDevice)
{
throw new NotImplementedException();
//TODO: implement
return new GraphicsDeviceInformation();
}
protected virtual bool CanResetDevice(GraphicsDeviceInformation newDeviceInfo)
@ -204,7 +268,10 @@ namespace ANX.Framework
public DepthFormat PreferredDepthStencilFormat
{
get { throw new NotImplementedException(); }
get
{
return this.depthStencilFormat;
}
set { throw new NotImplementedException(); }
}

View File

@ -3,6 +3,7 @@ using System;
using ANX.Framework.Graphics;
using System.IO;
using ANX.Framework.NonXNA;
using System.Collections.ObjectModel;
#endregion // Using Statements
@ -76,5 +77,7 @@ namespace ANX.Framework
INativeSamplerState CreateSamplerState();
byte[] GetShaderByteCode(PreDefinedShader type);
ReadOnlyCollection<GraphicsAdapter> GetAdapterList();
}
}

View File

@ -217,5 +217,11 @@ namespace ANX.RenderSystem.Windows.DX11_1
{
throw new NotImplementedException();
}
public System.Collections.ObjectModel.ReadOnlyCollection<GraphicsAdapter> GetAdapterList()
{
throw new NotImplementedException();
}
}
}