aboutsummaryrefslogtreecommitdiff
path: root/src/Ryujinx.Horizon/Sdk/Sf/RawDataOffsetCalculator.cs
blob: 10e4f90942ee2db97d38a233fdcb6cd2cdd41ddc (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
using Ryujinx.Common;

namespace Ryujinx.Horizon.Sdk.Sf
{
    static class RawDataOffsetCalculator
    {
        public static int[] Calculate(CommandArg[] args)
        {
            int[] offsets = new int[args.Length + 1];

            if (args.Length != 0)
            {
                int argsCount = args.Length;

                int[] sizes  = new int[argsCount];
                int[] aligns = new int[argsCount];
                int[] map    = new int[argsCount];

                for (int i = 0; i < argsCount; i++)
                {
                    sizes[i]  = args[i].ArgSize;
                    aligns[i] = args[i].ArgAlignment;
                    map[i]    = i;
                }

                for (int i = 1; i < argsCount; i++)
                {
                    for (int j = i; j > 0 && aligns[map[j - 1]] > aligns[map[j]]; j--)
                    {
                        (map[j], map[j - 1]) = (map[j - 1], map[j]);
                    }
                }

                int offset = 0;

                foreach (int i in map)
                {
                    offset     = BitUtils.AlignUp(offset, aligns[i]);
                    offsets[i] = offset;
                    offset    += sizes[i];
                }

                offsets[argsCount] = offset;
            }

            return offsets;
        }
    }
}