ShaderDecodeMem.cs 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  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 Texs(ShaderIrBlock Block, long OpCode)
  29. {
  30. //TODO: Support other formats.
  31. ShaderIrNode OperA = GetOperGpr8 (OpCode);
  32. ShaderIrNode OperB = GetOperGpr20 (OpCode);
  33. ShaderIrNode OperC = GetOperGpr28 (OpCode);
  34. ShaderIrNode OperD = GetOperImm13_36(OpCode);
  35. for (int Ch = 0; Ch < 4; Ch++)
  36. {
  37. ShaderIrOp Op = new ShaderIrOp(ShaderIrInst.Texr + Ch, OperA, OperB, OperD);
  38. ShaderIrOperGpr Dst = GetOperGpr0(OpCode);
  39. Dst.Index += Ch;
  40. Block.AddNode(new ShaderIrAsg(Dst, Op));
  41. }
  42. }
  43. }
  44. }