forked from MeloNX/MeloNX
remove usage of reflection in device state
This commit is contained in:
parent
c3a3adbaeb
commit
cea50d80c9
@ -33,13 +33,22 @@ namespace Ryujinx.Graphics.Device
|
|||||||
}
|
}
|
||||||
|
|
||||||
var fields = typeof(TState).GetFields();
|
var fields = typeof(TState).GetFields();
|
||||||
|
var t = typeof(TState);
|
||||||
int offset = 0;
|
int offset = 0;
|
||||||
|
|
||||||
for (int fieldIndex = 0; fieldIndex < fields.Length; fieldIndex++)
|
for (int fieldIndex = 0; fieldIndex < fields.Length; fieldIndex++)
|
||||||
{
|
{
|
||||||
var field = fields[fieldIndex];
|
var field = fields[fieldIndex];
|
||||||
|
|
||||||
int sizeOfField = SizeCalculator.SizeOf(field.FieldType);
|
var cuurentFieldOffset = (int)Marshal.OffsetOf<TState>(field.Name);
|
||||||
|
var nextFieldOffset = fieldIndex + 1 == fields.Length ? Unsafe.SizeOf<TState>() : (int)Marshal.OffsetOf<TState>(fields[fieldIndex + 1].Name);
|
||||||
|
|
||||||
|
int sizeOfField = nextFieldOffset - cuurentFieldOffset;
|
||||||
|
|
||||||
|
if(sizeOfField == 0)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
for (int i = 0; i < ((sizeOfField + 3) & ~3); i += 4)
|
for (int i = 0; i < ((sizeOfField + 3) & ~3); i += 4)
|
||||||
{
|
{
|
||||||
|
@ -1,63 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.Reflection;
|
|
||||||
|
|
||||||
namespace Ryujinx.Graphics.Device
|
|
||||||
{
|
|
||||||
public static class SizeCalculator
|
|
||||||
{
|
|
||||||
public static int SizeOf(Type type)
|
|
||||||
{
|
|
||||||
// Is type a enum type?
|
|
||||||
if (type.IsEnum)
|
|
||||||
{
|
|
||||||
type = type.GetEnumUnderlyingType();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Is type a pointer type?
|
|
||||||
if (type.IsPointer || type == typeof(IntPtr) || type == typeof(UIntPtr))
|
|
||||||
{
|
|
||||||
return IntPtr.Size;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Is type a struct type?
|
|
||||||
if (type.IsValueType && !type.IsPrimitive)
|
|
||||||
{
|
|
||||||
// Check if the struct has a explicit size, if so, return that.
|
|
||||||
if (type.StructLayoutAttribute.Size != 0)
|
|
||||||
{
|
|
||||||
return type.StructLayoutAttribute.Size;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Otherwise we calculate the sum of the sizes of all fields.
|
|
||||||
int size = 0;
|
|
||||||
var fields = type.GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);
|
|
||||||
|
|
||||||
for (int fieldIndex = 0; fieldIndex < fields.Length; fieldIndex++)
|
|
||||||
{
|
|
||||||
size += SizeOf(fields[fieldIndex].FieldType);
|
|
||||||
}
|
|
||||||
|
|
||||||
return size;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Primitive types.
|
|
||||||
return (Type.GetTypeCode(type)) switch
|
|
||||||
{
|
|
||||||
TypeCode.SByte => sizeof(sbyte),
|
|
||||||
TypeCode.Byte => sizeof(byte),
|
|
||||||
TypeCode.Int16 => sizeof(short),
|
|
||||||
TypeCode.UInt16 => sizeof(ushort),
|
|
||||||
TypeCode.Int32 => sizeof(int),
|
|
||||||
TypeCode.UInt32 => sizeof(uint),
|
|
||||||
TypeCode.Int64 => sizeof(long),
|
|
||||||
TypeCode.UInt64 => sizeof(ulong),
|
|
||||||
TypeCode.Char => sizeof(char),
|
|
||||||
TypeCode.Single => sizeof(float),
|
|
||||||
TypeCode.Double => sizeof(double),
|
|
||||||
TypeCode.Decimal => sizeof(decimal),
|
|
||||||
TypeCode.Boolean => sizeof(bool),
|
|
||||||
_ => throw new ArgumentException($"Length for type \"{type.Name}\" is unknown."),
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -79,7 +79,10 @@ namespace Ryujinx.Graphics.Gpu.Engine.Threed
|
|||||||
{
|
{
|
||||||
var field = fields[fieldIndex];
|
var field = fields[fieldIndex];
|
||||||
|
|
||||||
int sizeOfField = SizeCalculator.SizeOf(field.FieldType);
|
var cuurentFieldOffset = (int)Marshal.OffsetOf<TState>(field.Name);
|
||||||
|
var nextFieldOffset = fieldIndex + 1 == fields.Length ? Unsafe.SizeOf<TState>() : (int)Marshal.OffsetOf<TState>(fields[fieldIndex + 1].Name);
|
||||||
|
|
||||||
|
int sizeOfField = nextFieldOffset - cuurentFieldOffset;
|
||||||
|
|
||||||
if (fieldToDelegate.TryGetValue(field.Name, out int entryIndex))
|
if (fieldToDelegate.TryGetValue(field.Name, out int entryIndex))
|
||||||
{
|
{
|
||||||
|
Loading…
x
Reference in New Issue
Block a user