aboutsummaryrefslogtreecommitdiff
path: root/Ryujinx.Graphics/Gal/Shader/ShaderDecodeMove.cs
diff options
context:
space:
mode:
Diffstat (limited to 'Ryujinx.Graphics/Gal/Shader/ShaderDecodeMove.cs')
-rw-r--r--Ryujinx.Graphics/Gal/Shader/ShaderDecodeMove.cs431
1 files changed, 0 insertions, 431 deletions
diff --git a/Ryujinx.Graphics/Gal/Shader/ShaderDecodeMove.cs b/Ryujinx.Graphics/Gal/Shader/ShaderDecodeMove.cs
deleted file mode 100644
index 0a2b4232..00000000
--- a/Ryujinx.Graphics/Gal/Shader/ShaderDecodeMove.cs
+++ /dev/null
@@ -1,431 +0,0 @@
-using System;
-
-using static Ryujinx.Graphics.Gal.Shader.ShaderDecodeHelper;
-
-namespace Ryujinx.Graphics.Gal.Shader
-{
- static partial class ShaderDecode
- {
- private enum IntType
- {
- U8 = 0,
- U16 = 1,
- U32 = 2,
- U64 = 3,
- S8 = 4,
- S16 = 5,
- S32 = 6,
- S64 = 7
- }
-
- private enum FloatType
- {
- F16 = 1,
- F32 = 2,
- F64 = 3
- }
-
- public static void F2f_C(ShaderIrBlock block, long opCode, int position)
- {
- EmitF2F(block, opCode, ShaderOper.Cr);
- }
-
- public static void F2f_I(ShaderIrBlock block, long opCode, int position)
- {
- EmitF2F(block, opCode, ShaderOper.Immf);
- }
-
- public static void F2f_R(ShaderIrBlock block, long opCode, int position)
- {
- EmitF2F(block, opCode, ShaderOper.Rr);
- }
-
- public static void F2i_C(ShaderIrBlock block, long opCode, int position)
- {
- EmitF2I(block, opCode, ShaderOper.Cr);
- }
-
- public static void F2i_I(ShaderIrBlock block, long opCode, int position)
- {
- EmitF2I(block, opCode, ShaderOper.Immf);
- }
-
- public static void F2i_R(ShaderIrBlock block, long opCode, int position)
- {
- EmitF2I(block, opCode, ShaderOper.Rr);
- }
-
- public static void I2f_C(ShaderIrBlock block, long opCode, int position)
- {
- EmitI2F(block, opCode, ShaderOper.Cr);
- }
-
- public static void I2f_I(ShaderIrBlock block, long opCode, int position)
- {
- EmitI2F(block, opCode, ShaderOper.Imm);
- }
-
- public static void I2f_R(ShaderIrBlock block, long opCode, int position)
- {
- EmitI2F(block, opCode, ShaderOper.Rr);
- }
-
- public static void I2i_C(ShaderIrBlock block, long opCode, int position)
- {
- EmitI2I(block, opCode, ShaderOper.Cr);
- }
-
- public static void I2i_I(ShaderIrBlock block, long opCode, int position)
- {
- EmitI2I(block, opCode, ShaderOper.Imm);
- }
-
- public static void I2i_R(ShaderIrBlock block, long opCode, int position)
- {
- EmitI2I(block, opCode, ShaderOper.Rr);
- }
-
- public static void Isberd(ShaderIrBlock block, long opCode, int position)
- {
- //This instruction seems to be used to translate from an address to a vertex index in a GS
- //Stub it as such
-
- block.AddNode(new ShaderIrCmnt("Stubbed."));
-
- block.AddNode(opCode.PredNode(new ShaderIrAsg(opCode.Gpr0(), opCode.Gpr8())));
- }
-
- public static void Mov_C(ShaderIrBlock block, long opCode, int position)
- {
- ShaderIrOperCbuf cbuf = opCode.Cbuf34();
-
- block.AddNode(opCode.PredNode(new ShaderIrAsg(opCode.Gpr0(), cbuf)));
- }
-
- public static void Mov_I(ShaderIrBlock block, long opCode, int position)
- {
- ShaderIrOperImm imm = opCode.Imm19_20();
-
- block.AddNode(opCode.PredNode(new ShaderIrAsg(opCode.Gpr0(), imm)));
- }
-
- public static void Mov_I32(ShaderIrBlock block, long opCode, int position)
- {
- ShaderIrOperImm imm = opCode.Imm32_20();
-
- block.AddNode(opCode.PredNode(new ShaderIrAsg(opCode.Gpr0(), imm)));
- }
-
- public static void Mov_R(ShaderIrBlock block, long opCode, int position)
- {
- ShaderIrOperGpr gpr = opCode.Gpr20();
-
- block.AddNode(opCode.PredNode(new ShaderIrAsg(opCode.Gpr0(), gpr)));
- }
-
- public static void Sel_C(ShaderIrBlock block, long opCode, int position)
- {
- EmitSel(block, opCode, ShaderOper.Cr);
- }
-
- public static void Sel_I(ShaderIrBlock block, long opCode, int position)
- {
- EmitSel(block, opCode, ShaderOper.Imm);
- }
-
- public static void Sel_R(ShaderIrBlock block, long opCode, int position)
- {
- EmitSel(block, opCode, ShaderOper.Rr);
- }
-
- public static void Mov_S(ShaderIrBlock block, long opCode, int position)
- {
- block.AddNode(new ShaderIrCmnt("Stubbed."));
-
- //Zero is used as a special number to get a valid "0 * 0 + VertexIndex" in a GS
- ShaderIrNode source = new ShaderIrOperImm(0);
-
- block.AddNode(opCode.PredNode(new ShaderIrAsg(opCode.Gpr0(), source)));
- }
-
- private static void EmitF2F(ShaderIrBlock block, long opCode, ShaderOper oper)
- {
- bool negA = opCode.Read(45);
- bool absA = opCode.Read(49);
-
- ShaderIrNode operA;
-
- switch (oper)
- {
- case ShaderOper.Cr: operA = opCode.Cbuf34(); break;
- case ShaderOper.Immf: operA = opCode.Immf19_20(); break;
- case ShaderOper.Rr: operA = opCode.Gpr20(); break;
-
- default: throw new ArgumentException(nameof(oper));
- }
-
- operA = GetAluFabsFneg(operA, absA, negA);
-
- ShaderIrInst roundInst = GetRoundInst(opCode);
-
- if (roundInst != ShaderIrInst.Invalid)
- {
- operA = new ShaderIrOp(roundInst, operA);
- }
-
- block.AddNode(opCode.PredNode(new ShaderIrAsg(opCode.Gpr0(), operA)));
- }
-
- private static void EmitF2I(ShaderIrBlock block, long opCode, ShaderOper oper)
- {
- IntType type = GetIntType(opCode);
-
- if (type == IntType.U64 ||
- type == IntType.S64)
- {
- //TODO: 64-bits support.
- //Note: GLSL doesn't support 64-bits integers.
- throw new NotImplementedException();
- }
-
- bool negA = opCode.Read(45);
- bool absA = opCode.Read(49);
-
- ShaderIrNode operA;
-
- switch (oper)
- {
- case ShaderOper.Cr: operA = opCode.Cbuf34(); break;
- case ShaderOper.Immf: operA = opCode.Immf19_20(); break;
- case ShaderOper.Rr: operA = opCode.Gpr20(); break;
-
- default: throw new ArgumentException(nameof(oper));
- }
-
- operA = GetAluFabsFneg(operA, absA, negA);
-
- ShaderIrInst roundInst = GetRoundInst(opCode);
-
- if (roundInst != ShaderIrInst.Invalid)
- {
- operA = new ShaderIrOp(roundInst, operA);
- }
-
- bool signed = type >= IntType.S8;
-
- int size = 8 << ((int)type & 3);
-
- if (size < 32)
- {
- uint mask = uint.MaxValue >> (32 - size);
-
- float cMin = 0;
- float cMax = mask;
-
- if (signed)
- {
- uint halfMask = mask >> 1;
-
- cMin -= halfMask + 1;
- cMax = halfMask;
- }
-
- ShaderIrOperImmf min = new ShaderIrOperImmf(cMin);
- ShaderIrOperImmf max = new ShaderIrOperImmf(cMax);
-
- operA = new ShaderIrOp(ShaderIrInst.Fclamp, operA, min, max);
- }
-
- ShaderIrInst inst = signed
- ? ShaderIrInst.Ftos
- : ShaderIrInst.Ftou;
-
- ShaderIrNode op = new ShaderIrOp(inst, operA);
-
- block.AddNode(opCode.PredNode(new ShaderIrAsg(opCode.Gpr0(), op)));
- }
-
- private static void EmitI2F(ShaderIrBlock block, long opCode, ShaderOper oper)
- {
- IntType type = GetIntType(opCode);
-
- if (type == IntType.U64 ||
- type == IntType.S64)
- {
- //TODO: 64-bits support.
- //Note: GLSL doesn't support 64-bits integers.
- throw new NotImplementedException();
- }
-
- int sel = opCode.Read(41, 3);
-
- bool negA = opCode.Read(45);
- bool absA = opCode.Read(49);
-
- ShaderIrNode operA;
-
- switch (oper)
- {
- case ShaderOper.Cr: operA = opCode.Cbuf34(); break;
- case ShaderOper.Imm: operA = opCode.Imm19_20(); break;
- case ShaderOper.Rr: operA = opCode.Gpr20(); break;
-
- default: throw new ArgumentException(nameof(oper));
- }
-
- operA = GetAluIabsIneg(operA, absA, negA);
-
- bool signed = type >= IntType.S8;
-
- int shift = sel * 8;
-
- int size = 8 << ((int)type & 3);
-
- if (shift != 0)
- {
- operA = new ShaderIrOp(ShaderIrInst.Asr, operA, new ShaderIrOperImm(shift));
- }
-
- if (size < 32)
- {
- operA = ExtendTo32(operA, signed, size);
- }
-
- ShaderIrInst inst = signed
- ? ShaderIrInst.Stof
- : ShaderIrInst.Utof;
-
- ShaderIrNode op = new ShaderIrOp(inst, operA);
-
- block.AddNode(opCode.PredNode(new ShaderIrAsg(opCode.Gpr0(), op)));
- }
-
- private static void EmitI2I(ShaderIrBlock block, long opCode, ShaderOper oper)
- {
- IntType type = GetIntType(opCode);
-
- if (type == IntType.U64 ||
- type == IntType.S64)
- {
- //TODO: 64-bits support.
- //Note: GLSL doesn't support 64-bits integers.
- throw new NotImplementedException();
- }
-
- int sel = opCode.Read(41, 3);
-
- bool negA = opCode.Read(45);
- bool absA = opCode.Read(49);
- bool satA = opCode.Read(50);
-
- ShaderIrNode operA;
-
- switch (oper)
- {
- case ShaderOper.Cr: operA = opCode.Cbuf34(); break;
- case ShaderOper.Immf: operA = opCode.Immf19_20(); break;
- case ShaderOper.Rr: operA = opCode.Gpr20(); break;
-
- default: throw new ArgumentException(nameof(oper));
- }
-
- operA = GetAluIabsIneg(operA, absA, negA);
-
- bool signed = type >= IntType.S8;
-
- int shift = sel * 8;
-
- int size = 8 << ((int)type & 3);
-
- if (shift != 0)
- {
- operA = new ShaderIrOp(ShaderIrInst.Asr, operA, new ShaderIrOperImm(shift));
- }
-
- if (size < 32)
- {
- uint mask = uint.MaxValue >> (32 - size);
-
- if (satA)
- {
- uint cMin = 0;
- uint cMax = mask;
-
- if (signed)
- {
- uint halfMask = mask >> 1;
-
- cMin -= halfMask + 1;
- cMax = halfMask;
- }
-
- ShaderIrOperImm min = new ShaderIrOperImm((int)cMin);
- ShaderIrOperImm max = new ShaderIrOperImm((int)cMax);
-
- operA = new ShaderIrOp(signed
- ? ShaderIrInst.Clamps
- : ShaderIrInst.Clampu, operA, min, max);
- }
- else
- {
- operA = ExtendTo32(operA, signed, size);
- }
- }
-
- block.AddNode(opCode.PredNode(new ShaderIrAsg(opCode.Gpr0(), operA)));
- }
-
- private static void EmitSel(ShaderIrBlock block, long opCode, ShaderOper oper)
- {
- ShaderIrOperGpr dst = opCode.Gpr0();
- ShaderIrNode pred = opCode.Pred39N();
-
- ShaderIrNode resultA = opCode.Gpr8();
- ShaderIrNode resultB;
-
- switch (oper)
- {
- case ShaderOper.Cr: resultB = opCode.Cbuf34(); break;
- case ShaderOper.Imm: resultB = opCode.Imm19_20(); break;
- case ShaderOper.Rr: resultB = opCode.Gpr20(); break;
-
- default: throw new ArgumentException(nameof(oper));
- }
-
- block.AddNode(opCode.PredNode(new ShaderIrCond(pred, new ShaderIrAsg(dst, resultA), false)));
-
- block.AddNode(opCode.PredNode(new ShaderIrCond(pred, new ShaderIrAsg(dst, resultB), true)));
- }
-
- private static IntType GetIntType(long opCode)
- {
- bool signed = opCode.Read(13);
-
- IntType type = (IntType)(opCode.Read(10, 3));
-
- if (signed)
- {
- type += (int)IntType.S8;
- }
-
- return type;
- }
-
- private static FloatType GetFloatType(long opCode)
- {
- return (FloatType)(opCode.Read(8, 3));
- }
-
- private static ShaderIrInst GetRoundInst(long opCode)
- {
- switch (opCode.Read(39, 3))
- {
- case 1: return ShaderIrInst.Floor;
- case 2: return ShaderIrInst.Ceil;
- case 3: return ShaderIrInst.Trunc;
- }
-
- return ShaderIrInst.Invalid;
- }
- }
-} \ No newline at end of file