Konstantin Koch 3cd7efbba4 Migrated StencilBuffer example and removed memory leaks for DX10 and DX11
Remove build message saying that a content file is still valid and will
be skipped.
Use OnApply for Effects, instead of an internal PreBindSetParameters.
Removed unnecessary dependencies from EffectParameterCollection and
EffectTechniqueCollection.
Moved Apply from INativeEffect to INativeEffectPass as Apply can only be
called on an EffectPass.
Added IDisposable to many Native object interfaces.
Added an InputLayoutManager so the InputLayouts don't get created on
every call.
Increased the amount of shared code for the GraphicsDevice between DX10
and DX11.
Simplified the amount of stuff the Draw calls do.
It's possible to use specific renderPasses when drawing and the drawing
methods of the GraphicsDevice don't draw all effectPasses of an effec
anymore.
Fixed the bug that a DynamicVertexBuffer created a staging buffer when
setting Elements for DX10 and DX11, which was unnecessary. Also it
didn't create a staging before for normal VertexBuffers which made it
not possible to set data there.
Implement EffectAnnotations for DX10.
Fixed SetRenderTargets for DX11.
2015-10-14 23:59:27 +02:00

280 lines
9.4 KiB
C#

#region Using Statements
using System;
using ANX.Framework.Graphics;
using SharpDX.D3DCompiler;
using SharpDX.Direct3D;
using SharpDX.DXGI;
#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
#if DX10
namespace ANX.RenderSystem.Windows.DX10
#endif
#if DX11
namespace ANX.RenderSystem.Windows.DX11
#endif
{
public static class DxFormatConverter
{
#region FormatSize (SurfaceFormat)
public static int FormatSize(SurfaceFormat format)
{
// description of texture formats of DX10: http://msdn.microsoft.com/en-us/library/bb694531(v=VS.85).aspx
// more helpfull information on DX10 textures: http://msdn.microsoft.com/en-us/library/windows/desktop/bb205131(v=vs.85).aspx
switch (format)
{
case SurfaceFormat.Vector4:
return 16;
//case SurfaceFormat.Vector3:
// return 12;
case SurfaceFormat.Vector2:
return 8;
case SurfaceFormat.Single:
case SurfaceFormat.Color:
//case SurfaceFormat.RGBA1010102:
//case SurfaceFormat.RG32:
return 4;
//case SurfaceFormat.BGR565:
//case SurfaceFormat.BGRA5551:
// return 2;
case SurfaceFormat.Alpha8:
return 1;
}
throw new ArgumentException("Invalid format '" + format + "'.");
}
#endregion
public static int FormatSize(VertexElementFormat format)
{
switch (format)
{
case VertexElementFormat.Byte4:
return 4;
case VertexElementFormat.Color:
return 4;
case VertexElementFormat.HalfVector2:
return 4;
case VertexElementFormat.HalfVector4:
return 8;
case VertexElementFormat.NormalizedShort2:
return 4;
case VertexElementFormat.NormalizedShort4:
return 8;
case VertexElementFormat.Short2:
return 4;
case VertexElementFormat.Short4:
return 8;
case VertexElementFormat.Single:
return 4;
case VertexElementFormat.Vector2:
return 8;
case VertexElementFormat.Vector3:
return 12;
case VertexElementFormat.Vector4:
return 16;
}
throw new ArgumentException("Invalid format '" + format + "'.");
}
#region Translate (SurfaceFormat)
public static SharpDX.DXGI.Format Translate(SurfaceFormat surfaceFormat)
{
switch (surfaceFormat)
{
case SurfaceFormat.Color:
return SharpDX.DXGI.Format.R8G8B8A8_UNorm;
case SurfaceFormat.Dxt1:
return SharpDX.DXGI.Format.BC1_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);
}
#endregion
#region Translate (DepthFormat)
public static Format Translate(DepthFormat depthFormat)
{
switch (depthFormat)
{
case DepthFormat.Depth16:
return Format.D16_UNorm;
case DepthFormat.Depth24:
//TODO: no DirectX10 24Bit depth format???
case DepthFormat.Depth24Stencil8:
return Format.D24_UNorm_S8_UInt;
case DepthFormat.None:
return Format.Unknown;
}
throw new Exception("can't translate DepthFormat: " + depthFormat.ToString());
}
#endregion
#region Translate (Format)
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());
}
#endregion
#region Translate (PrimitiveType)
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;
}
throw new InvalidOperationException("unknown PrimitiveType: " + primitiveType);
}
#endregion
#region Translate (IndexElementSize)
public static SharpDX.DXGI.Format Translate(IndexElementSize indexElementSize)
{
switch (indexElementSize)
{
case IndexElementSize.SixteenBits:
return Format.R16_UInt;
case IndexElementSize.ThirtyTwoBits:
return Format.R32_UInt;
}
throw new InvalidOperationException("unknown IndexElementSize: " + indexElementSize);
}
#endregion
#region Translate (VertexElement)
public static string Translate(ref VertexElement element)
{
//TODO: map the other Usages
if (element.VertexElementUsage == VertexElementUsage.TextureCoordinate)
return "TEXCOORD";
return element.VertexElementUsage.ToString().ToUpperInvariant();
}
#endregion
#region CalculateVertexCount
public static int CalculateVertexCount(PrimitiveType type, int primitiveCount)
{
switch (type)
{
case PrimitiveType.TriangleList:
return primitiveCount * 3;
case PrimitiveType.LineList:
return primitiveCount * 2;
case PrimitiveType.LineStrip:
return primitiveCount + 1;
case PrimitiveType.TriangleStrip:
return primitiveCount + 2;
}
throw new NotImplementedException("Couldn't calculate vertex count for PrimitiveType '" + type + "'.");
}
#endregion
#region ConvertVertexElementFormat
public static Format ConvertVertexElementFormat(VertexElementFormat format)
{
switch (format)
{
case VertexElementFormat.Vector2:
return Format.R32G32_Float;
case VertexElementFormat.Vector3:
return Format.R32G32B32_Float;
case VertexElementFormat.Vector4:
return Format.R32G32B32A32_Float;
case VertexElementFormat.Color:
return Format.R8G8B8A8_UNorm;
case VertexElementFormat.Single:
return Format.R32_Float;
// TODO: validate
case VertexElementFormat.Short2:
return Format.R16G16_SInt;
case VertexElementFormat.Short4:
return Format.R16G16B16A16_SInt;
}
throw new Exception("Can't map '" + format + "' to DXGI.Format in Dx10 CreateInputElementFromVertexElement.");
}
#endregion
public static ANX.Framework.Graphics.EffectParameterClass Translate(this ShaderVariableClass variableClass)
{
switch (variableClass)
{
case ShaderVariableClass.Vector:
return Framework.Graphics.EffectParameterClass.Vector;
case ShaderVariableClass.Struct:
return Framework.Graphics.EffectParameterClass.Struct;
case ShaderVariableClass.Scalar:
return Framework.Graphics.EffectParameterClass.Scalar;
case ShaderVariableClass.Object:
return Framework.Graphics.EffectParameterClass.Object;
case ShaderVariableClass.MatrixColumns:
case ShaderVariableClass.MatrixRows:
return Framework.Graphics.EffectParameterClass.Matrix;
default:
return (Framework.Graphics.EffectParameterClass)(-1);
}
}
public static ANX.Framework.Graphics.EffectParameterType Translate(this ShaderVariableType variableType)
{
switch (variableType)
{
case ShaderVariableType.Bool:
return Framework.Graphics.EffectParameterType.Bool;
case ShaderVariableType.Int:
return Framework.Graphics.EffectParameterType.Int32;
case ShaderVariableType.Float:
return Framework.Graphics.EffectParameterType.Single;
case ShaderVariableType.String:
return Framework.Graphics.EffectParameterType.String;
case ShaderVariableType.Texture:
return Framework.Graphics.EffectParameterType.Texture;
case ShaderVariableType.Texture1D:
return Framework.Graphics.EffectParameterType.Texture1D;
case ShaderVariableType.Texture2D:
return Framework.Graphics.EffectParameterType.Texture2D;
case ShaderVariableType.Texture3D:
return Framework.Graphics.EffectParameterType.Texture3D;
case ShaderVariableType.TextureCube:
return Framework.Graphics.EffectParameterType.TextureCube;
case ShaderVariableType.Void:
return Framework.Graphics.EffectParameterType.Void;
default:
return (Framework.Graphics.EffectParameterType)(-1);
}
}
}
}