ShaderDecodeHelper.cs 2.2 KB

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