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; } } }