RawDataOffsetCalculator.cs 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. using Ryujinx.Common;
  2. namespace Ryujinx.Horizon.Sdk.Sf
  3. {
  4. static class RawDataOffsetCalculator
  5. {
  6. public static int[] Calculate(CommandArg[] args)
  7. {
  8. int[] offsets = new int[args.Length + 1];
  9. if (args.Length != 0)
  10. {
  11. int argsCount = args.Length;
  12. int[] sizes = new int[argsCount];
  13. int[] aligns = new int[argsCount];
  14. int[] map = new int[argsCount];
  15. for (int i = 0; i < argsCount; i++)
  16. {
  17. sizes[i] = args[i].ArgSize;
  18. aligns[i] = args[i].ArgAlignment;
  19. map[i] = i;
  20. }
  21. for (int i = 1; i < argsCount; i++)
  22. {
  23. for (int j = i; j > 0 && aligns[map[j - 1]] > aligns[map[j]]; j--)
  24. {
  25. var temp = map[j - 1];
  26. map[j - 1] = map[j];
  27. map[j] = temp;
  28. }
  29. }
  30. int offset = 0;
  31. foreach (int i in map)
  32. {
  33. offset = BitUtils.AlignUp(offset, aligns[i]);
  34. offsets[i] = offset;
  35. offset += sizes[i];
  36. }
  37. offsets[argsCount] = offset;
  38. }
  39. return offsets;
  40. }
  41. }
  42. }