SND\AstrorEnales_cp cfe19d5c4a - Implemented a dynamic parameter buffer for shader parameters
- Updated the Metro shader generator
- Fixed the metro resolution being correctly set to the graphics device
2012-08-19 14:38:58 +00:00

80 lines
1.8 KiB
C#

using System;
using System.Runtime.InteropServices;
// 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.RenderSystem.Windows.Metro.Shader
{
public static class UnionArraySerializer
{
#region Union (private helper struct)
[StructLayout(LayoutKind.Explicit)]
private struct Union
{
[FieldOffset(0)]
public byte[] bytes;
[FieldOffset(0)]
public float[] floats;
[FieldOffset(0)]
public int[] ints;
}
#endregion
#region Private
private static readonly UIntPtr BYTE_ARRAY;
private static unsafe readonly int PTR_SIZE = sizeof(UIntPtr);
#endregion
#region Constructor
static unsafe UnionArraySerializer()
{
var byteArray = new byte[1];
fixed (byte* pBytes = byteArray)
{
BYTE_ARRAY = *(UIntPtr*)(pBytes - 2 * PTR_SIZE);
}
}
#endregion
#region Unify (float[])
public static unsafe byte[] Unify(float[] floats)
{
var union = new Union();
union.floats = floats;
fixed (float* pValues = union.floats)
UpdatePointers((byte*)pValues, floats.Length * 4);
return union.bytes;
}
#endregion
#region Unify (int[])
public static unsafe byte[] Unify(int[] ints)
{
var union = new Union();
union.ints = ints;
fixed (int* pValues = union.ints)
UpdatePointers((byte*)pValues, ints.Length * 4);
return union.bytes;
}
#endregion
#region UpdatePointers
private static unsafe void UpdatePointers(byte* pBytes, int byteSize)
{
var pSize = (UIntPtr*)(pBytes - PTR_SIZE);
var pArrayType = (UIntPtr*)(pBytes - 2 * PTR_SIZE);
*pSize = (UIntPtr)byteSize;
*pArrayType = BYTE_ARRAY;
}
#endregion
}
}