InstEmitWarp.cs 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. using Ryujinx.Graphics.Shader.Decoders;
  2. using Ryujinx.Graphics.Shader.IntermediateRepresentation;
  3. using Ryujinx.Graphics.Shader.Translation;
  4. using static Ryujinx.Graphics.Shader.Instructions.InstEmitHelper;
  5. using static Ryujinx.Graphics.Shader.IntermediateRepresentation.OperandHelper;
  6. namespace Ryujinx.Graphics.Shader.Instructions
  7. {
  8. static partial class InstEmit
  9. {
  10. public static void Fswzadd(EmitterContext context)
  11. {
  12. InstFswzadd op = context.GetOp<InstFswzadd>();
  13. Operand srcA = GetSrcReg(context, op.SrcA);
  14. Operand srcB = GetSrcReg(context, op.SrcB);
  15. Operand dest = GetDest(op.Dest);
  16. context.Copy(dest, context.FPSwizzleAdd(srcA, srcB, op.PnWord));
  17. InstEmitAluHelper.SetFPZnFlags(context, dest, op.WriteCC);
  18. }
  19. public static void Shfl(EmitterContext context)
  20. {
  21. InstShfl op = context.GetOp<InstShfl>();
  22. Operand pred = Register(op.DestPred, RegisterType.Predicate);
  23. Operand srcA = GetSrcReg(context, op.SrcA);
  24. Operand srcB = op.BFixShfl ? Const(op.SrcBImm) : GetSrcReg(context, op.SrcB);
  25. Operand srcC = op.CFixShfl ? Const(op.SrcCImm) : GetSrcReg(context, op.SrcC);
  26. (Operand res, Operand valid) = op.ShflMode switch
  27. {
  28. ShflMode.Idx => context.Shuffle(srcA, srcB, srcC),
  29. ShflMode.Up => context.ShuffleUp(srcA, srcB, srcC),
  30. ShflMode.Down => context.ShuffleDown(srcA, srcB, srcC),
  31. ShflMode.Bfly => context.ShuffleXor(srcA, srcB, srcC),
  32. _ => (null, null)
  33. };
  34. context.Copy(GetDest(op.Dest), res);
  35. context.Copy(pred, valid);
  36. }
  37. public static void Vote(EmitterContext context)
  38. {
  39. InstVote op = context.GetOp<InstVote>();
  40. Operand pred = GetPredicate(context, op.SrcPred, op.SrcPredInv);
  41. Operand res = null;
  42. switch (op.VoteMode)
  43. {
  44. case VoteMode.All:
  45. res = context.VoteAll(pred);
  46. break;
  47. case VoteMode.Any:
  48. res = context.VoteAny(pred);
  49. break;
  50. case VoteMode.Eq:
  51. res = context.VoteAllEqual(pred);
  52. break;
  53. }
  54. if (res != null)
  55. {
  56. context.Copy(Register(op.VpDest, RegisterType.Predicate), res);
  57. }
  58. else
  59. {
  60. context.Config.GpuAccessor.Log($"Invalid vote operation: {op.VoteMode}.");
  61. }
  62. if (op.Dest != RegisterConsts.RegisterZeroIndex)
  63. {
  64. context.Copy(GetDest(op.Dest), context.Ballot(pred));
  65. }
  66. }
  67. }
  68. }