OpCodeSuatom.cs 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. using Ryujinx.Graphics.Shader.Instructions;
  2. namespace Ryujinx.Graphics.Shader.Decoders
  3. {
  4. class OpCodeSuatom : OpCodeTextureBase
  5. {
  6. public Register Rd { get; }
  7. public Register Ra { get; }
  8. public Register Rb { get; }
  9. public Register Rc { get; }
  10. public ReductionType Type { get; }
  11. public AtomicOp AtomicOp { get; }
  12. public ImageDimensions Dimensions { get; }
  13. public ClampMode ClampMode { get; }
  14. public bool ByteAddress { get; }
  15. public bool UseType { get; }
  16. public bool IsBindless { get; }
  17. public bool CompareAndSwap { get; }
  18. public new static OpCode Create(InstEmitter emitter, ulong address, long opCode) => new OpCodeSuatom(emitter, address, opCode);
  19. public OpCodeSuatom(InstEmitter emitter, ulong address, long opCode) : base(emitter, address, opCode)
  20. {
  21. Rd = new Register(opCode.Extract(0, 8), RegisterType.Gpr);
  22. Ra = new Register(opCode.Extract(8, 8), RegisterType.Gpr);
  23. Rb = new Register(opCode.Extract(20, 8), RegisterType.Gpr);
  24. Rc = new Register(opCode.Extract(39, 8), RegisterType.Gpr);
  25. bool supportsBindless = opCode.Extract(54);
  26. Type = (ReductionType)opCode.Extract(supportsBindless ? 36 : 51, 3);
  27. ByteAddress = opCode.Extract(28);
  28. AtomicOp = (AtomicOp)opCode.Extract(29, 4); // Only useful if CAS is not true.
  29. Dimensions = (ImageDimensions)opCode.Extract(33, 3);
  30. ClampMode = (ClampMode)opCode.Extract(49, 2);
  31. IsBindless = supportsBindless && !opCode.Extract(51);
  32. UseType = !supportsBindless || opCode.Extract(52);
  33. CompareAndSwap = opCode.Extract(55);
  34. }
  35. }
  36. }