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. }