ShaderDecodeMem.cs 2.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. using static Ryujinx.Graphics.Gal.Shader.ShaderDecodeHelper;
  2. namespace Ryujinx.Graphics.Gal.Shader
  3. {
  4. static partial class ShaderDecode
  5. {
  6. public static void Ld_A(ShaderIrBlock Block, long OpCode)
  7. {
  8. ShaderIrNode[] Opers = GetOperAbuf20(OpCode);
  9. int Index = 0;
  10. foreach (ShaderIrNode OperA in Opers)
  11. {
  12. ShaderIrOperGpr OperD = GetOperGpr0(OpCode);
  13. OperD.Index += Index++;
  14. Block.AddNode(GetPredNode(new ShaderIrAsg(OperD, OperA), OpCode));
  15. }
  16. }
  17. public static void St_A(ShaderIrBlock Block, long OpCode)
  18. {
  19. ShaderIrNode[] Opers = GetOperAbuf20(OpCode);
  20. int Index = 0;
  21. foreach (ShaderIrNode OperA in Opers)
  22. {
  23. ShaderIrOperGpr OperD = GetOperGpr0(OpCode);
  24. OperD.Index += Index++;
  25. Block.AddNode(GetPredNode(new ShaderIrAsg(OperA, OperD), OpCode));
  26. }
  27. }
  28. public static void Texq(ShaderIrBlock Block, long OpCode)
  29. {
  30. ShaderIrNode OperD = GetOperGpr0(OpCode);
  31. ShaderIrNode OperA = GetOperGpr8(OpCode);
  32. ShaderTexqInfo Info = (ShaderTexqInfo)((OpCode >> 22) & 0x1f);
  33. ShaderIrMetaTexq Meta0 = new ShaderIrMetaTexq(Info, 0);
  34. ShaderIrMetaTexq Meta1 = new ShaderIrMetaTexq(Info, 1);
  35. ShaderIrNode OperC = GetOperImm13_36(OpCode);
  36. ShaderIrOp Op0 = new ShaderIrOp(ShaderIrInst.Texq, OperA, null, OperC, Meta0);
  37. ShaderIrOp Op1 = new ShaderIrOp(ShaderIrInst.Texq, OperA, null, OperC, Meta1);
  38. Block.AddNode(GetPredNode(new ShaderIrAsg(OperD, Op0), OpCode));
  39. Block.AddNode(GetPredNode(new ShaderIrAsg(OperA, Op1), OpCode)); //Is this right?
  40. }
  41. public static void Texs(ShaderIrBlock Block, long OpCode)
  42. {
  43. EmitTex(Block, OpCode, ShaderIrInst.Texs);
  44. }
  45. public static void Tlds(ShaderIrBlock Block, long OpCode)
  46. {
  47. EmitTex(Block, OpCode, ShaderIrInst.Txlf);
  48. }
  49. private static void EmitTex(ShaderIrBlock Block, long OpCode, ShaderIrInst Inst)
  50. {
  51. //TODO: Support other formats.
  52. ShaderIrNode OperA = GetOperGpr8 (OpCode);
  53. ShaderIrNode OperB = GetOperGpr20 (OpCode);
  54. ShaderIrNode OperC = GetOperImm13_36(OpCode);
  55. for (int Ch = 0; Ch < 4; Ch++)
  56. {
  57. ShaderIrOperGpr Dst = (Ch >> 1) != 0
  58. ? GetOperGpr28(OpCode)
  59. : GetOperGpr0 (OpCode);
  60. Dst.Index += Ch & 1;
  61. ShaderIrMetaTex Meta = new ShaderIrMetaTex(Ch);
  62. ShaderIrOp Op = new ShaderIrOp(Inst, OperA, OperB, OperC, Meta);
  63. Block.AddNode(GetPredNode(new ShaderIrAsg(Dst, Op), OpCode));
  64. }
  65. }
  66. }
  67. }