ShaderDecodeHelper.cs 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. namespace Ryujinx.Graphics.Gal.Shader
  2. {
  3. static class ShaderDecodeHelper
  4. {
  5. private static readonly ShaderIrOperImmf ImmfZero = new ShaderIrOperImmf(0);
  6. private static readonly ShaderIrOperImmf ImmfOne = new ShaderIrOperImmf(1);
  7. public static ShaderIrNode GetAluFabsFneg(ShaderIrNode Node, bool Abs, bool Neg)
  8. {
  9. return GetAluFneg(GetAluFabs(Node, Abs), Neg);
  10. }
  11. public static ShaderIrNode GetAluFabs(ShaderIrNode Node, bool Abs)
  12. {
  13. return Abs ? new ShaderIrOp(ShaderIrInst.Fabs, Node) : Node;
  14. }
  15. public static ShaderIrNode GetAluFneg(ShaderIrNode Node, bool Neg)
  16. {
  17. return Neg ? new ShaderIrOp(ShaderIrInst.Fneg, Node) : Node;
  18. }
  19. public static ShaderIrNode GetAluFsat(ShaderIrNode Node, bool Sat)
  20. {
  21. return Sat ? new ShaderIrOp(ShaderIrInst.Fclamp, Node, ImmfZero, ImmfOne) : Node;
  22. }
  23. public static ShaderIrNode GetAluIabsIneg(ShaderIrNode Node, bool Abs, bool Neg)
  24. {
  25. return GetAluIneg(GetAluIabs(Node, Abs), Neg);
  26. }
  27. public static ShaderIrNode GetAluIabs(ShaderIrNode Node, bool Abs)
  28. {
  29. return Abs ? new ShaderIrOp(ShaderIrInst.Abs, Node) : Node;
  30. }
  31. public static ShaderIrNode GetAluIneg(ShaderIrNode Node, bool Neg)
  32. {
  33. return Neg ? new ShaderIrOp(ShaderIrInst.Neg, Node) : Node;
  34. }
  35. public static ShaderIrNode GetAluNot(ShaderIrNode Node, bool Not)
  36. {
  37. return Not ? new ShaderIrOp(ShaderIrInst.Not, Node) : Node;
  38. }
  39. public static ShaderIrNode ExtendTo32(ShaderIrNode Node, bool Signed, int Size)
  40. {
  41. int Shift = 32 - Size;
  42. ShaderIrInst RightShift = Signed
  43. ? ShaderIrInst.Asr
  44. : ShaderIrInst.Lsr;
  45. Node = new ShaderIrOp(ShaderIrInst.Lsl, Node, new ShaderIrOperImm(Shift));
  46. Node = new ShaderIrOp(RightShift, Node, new ShaderIrOperImm(Shift));
  47. return Node;
  48. }
  49. public static ShaderIrNode ExtendTo32(ShaderIrNode Node, bool Signed, ShaderIrNode Size)
  50. {
  51. ShaderIrOperImm WordSize = new ShaderIrOperImm(32);
  52. ShaderIrOp Shift = new ShaderIrOp(ShaderIrInst.Sub, WordSize, Size);
  53. ShaderIrInst RightShift = Signed
  54. ? ShaderIrInst.Asr
  55. : ShaderIrInst.Lsr;
  56. Node = new ShaderIrOp(ShaderIrInst.Lsl, Node, Shift);
  57. Node = new ShaderIrOp(RightShift, Node, Shift);
  58. return Node;
  59. }
  60. }
  61. }