GlobalMemory.cs 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. using Ryujinx.Graphics.Shader.IntermediateRepresentation;
  2. namespace Ryujinx.Graphics.Shader.Translation
  3. {
  4. static class GlobalMemory
  5. {
  6. private const int StorageDescsBaseOffset = 0x44; // In words.
  7. public const int StorageDescSize = 4; // In words.
  8. public const int StorageMaxCount = 16;
  9. public const int StorageDescsSize = StorageDescSize * StorageMaxCount;
  10. public static bool UsesGlobalMemory(Instruction inst)
  11. {
  12. return (inst.IsAtomic() && IsGlobalMr(inst)) ||
  13. inst == Instruction.LoadGlobal ||
  14. inst == Instruction.StoreGlobal;
  15. }
  16. private static bool IsGlobalMr(Instruction inst)
  17. {
  18. return (inst & Instruction.MrMask) == Instruction.MrGlobal;
  19. }
  20. public static int GetStorageCbOffset(ShaderStage stage, int slot)
  21. {
  22. return GetStorageBaseCbOffset(stage) + slot * StorageDescSize;
  23. }
  24. public static int GetStorageBaseCbOffset(ShaderStage stage)
  25. {
  26. switch (stage)
  27. {
  28. case ShaderStage.Compute: return StorageDescsBaseOffset + 2 * StorageDescsSize;
  29. case ShaderStage.Vertex: return StorageDescsBaseOffset;
  30. case ShaderStage.TessellationControl: return StorageDescsBaseOffset + 1 * StorageDescsSize;
  31. case ShaderStage.TessellationEvaluation: return StorageDescsBaseOffset + 2 * StorageDescsSize;
  32. case ShaderStage.Geometry: return StorageDescsBaseOffset + 3 * StorageDescsSize;
  33. case ShaderStage.Fragment: return StorageDescsBaseOffset + 4 * StorageDescsSize;
  34. }
  35. return 0;
  36. }
  37. }
  38. }