aboutsummaryrefslogtreecommitdiff
path: root/Ryujinx.Graphics.Device/SizeCalculator.cs
diff options
context:
space:
mode:
authorgdkchan <gab.dark.100@gmail.com>2020-07-12 00:07:01 -0300
committerGitHub <noreply@github.com>2020-07-12 05:07:01 +0200
commit4d02a2d2c0451b4de1f6de3bbce54c457cacebe2 (patch)
tree120fe4fb8cfa1ac1c6ef4c97d92be47e955e8c0f /Ryujinx.Graphics.Device/SizeCalculator.cs
parent38b26cf4242999fa7d8c550993ac0940cd03d55f (diff)
New NVDEC and VIC implementation (#1384)
* Initial NVDEC and VIC implementation * Update FFmpeg.AutoGen to 4.3.0 * Add nvdec dependencies for Windows * Unify some VP9 structures * Rename VP9 structure fields * Improvements to Video API * XML docs for Common.Memory * Remove now unused or redundant overloads from MemoryAccessor * NVDEC UV surface read/write scalar paths * Add FIXME comments about hacky things/stuff that will need to be fixed in the future * Cleaned up VP9 memory allocation * Remove some debug logs * Rename some VP9 structs * Remove unused struct * No need to compile Ryujinx.Graphics.Host1x with unsafe anymore * Name AsyncWorkQueue threads to make debugging easier * Make Vp9PictureInfo a ref struct * LayoutConverter no longer needs the depth argument (broken by rebase) * Pooling of VP9 buffers, plus fix a memory leak on VP9 * Really wish VS could rename projects properly... * Address feedback * Remove using * Catch OperationCanceledException * Add licensing informations * Add THIRDPARTY.md to release too Co-authored-by: Thog <me@thog.eu>
Diffstat (limited to 'Ryujinx.Graphics.Device/SizeCalculator.cs')
-rw-r--r--Ryujinx.Graphics.Device/SizeCalculator.cs63
1 files changed, 63 insertions, 0 deletions
diff --git a/Ryujinx.Graphics.Device/SizeCalculator.cs b/Ryujinx.Graphics.Device/SizeCalculator.cs
new file mode 100644
index 00000000..7cc48915
--- /dev/null
+++ b/Ryujinx.Graphics.Device/SizeCalculator.cs
@@ -0,0 +1,63 @@
+using System;
+using System.Reflection;
+
+namespace Ryujinx.Graphics.Device
+{
+ 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.")
+ };
+ }
+ }
+}