RawDataOffsetCalculator.cs 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  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. (map[j], map[j - 1]) = (map[j - 1], map[j]);
  26. }
  27. }
  28. int offset = 0;
  29. foreach (int i in map)
  30. {
  31. offset = BitUtils.AlignUp(offset, aligns[i]);
  32. offsets[i] = offset;
  33. offset += sizes[i];
  34. }
  35. offsets[argsCount] = offset;
  36. }
  37. return offsets;
  38. }
  39. }
  40. }