aboutsummaryrefslogtreecommitdiff
path: root/Ryujinx.Graphics.Shader/Instructions
diff options
context:
space:
mode:
authorgdkchan <gab.dark.100@gmail.com>2021-10-17 17:48:36 -0300
committerGitHub <noreply@github.com>2021-10-17 17:48:36 -0300
commit7603dbe3c8b45c8563f320f17ce784151cb1f0a8 (patch)
tree08bfd5fa0b4d77e0279540cd8ba01b6360917e53 /Ryujinx.Graphics.Shader/Instructions
parent25fd4ef10e610ee470b76d6f58b4a3b9cd053844 (diff)
Add missing U8/S8 types from shader I2I instruction (#2740)
* Add missing U8/S8 types from shader I2I instruction * Better names * Fix dstIsSignedInt
Diffstat (limited to 'Ryujinx.Graphics.Shader/Instructions')
-rw-r--r--Ryujinx.Graphics.Shader/Instructions/InstEmitAluHelper.cs28
-rw-r--r--Ryujinx.Graphics.Shader/Instructions/InstEmitConversion.cs35
2 files changed, 45 insertions, 18 deletions
diff --git a/Ryujinx.Graphics.Shader/Instructions/InstEmitAluHelper.cs b/Ryujinx.Graphics.Shader/Instructions/InstEmitAluHelper.cs
index 3dda5316..3fbd0aeb 100644
--- a/Ryujinx.Graphics.Shader/Instructions/InstEmitAluHelper.cs
+++ b/Ryujinx.Graphics.Shader/Instructions/InstEmitAluHelper.cs
@@ -34,6 +34,34 @@ namespace Ryujinx.Graphics.Shader.Instructions
};
}
+ public static long GetIntMin(ISrcDstFmt type)
+ {
+ return type switch
+ {
+ ISrcDstFmt.U8 => byte.MinValue,
+ ISrcDstFmt.S8 => sbyte.MinValue,
+ ISrcDstFmt.U16 => ushort.MinValue,
+ ISrcDstFmt.S16 => short.MinValue,
+ ISrcDstFmt.U32 => uint.MinValue,
+ ISrcDstFmt.S32 => int.MinValue,
+ _ => throw new ArgumentException($"The type \"{type}\" is not a supported integer type.")
+ };
+ }
+
+ public static long GetIntMax(ISrcDstFmt type)
+ {
+ return type switch
+ {
+ ISrcDstFmt.U8 => byte.MaxValue,
+ ISrcDstFmt.S8 => sbyte.MaxValue,
+ ISrcDstFmt.U16 => ushort.MaxValue,
+ ISrcDstFmt.S16 => short.MaxValue,
+ ISrcDstFmt.U32 => uint.MaxValue,
+ ISrcDstFmt.S32 => int.MaxValue,
+ _ => throw new ArgumentException($"The type \"{type}\" is not a supported integer type.")
+ };
+ }
+
public static Operand GetPredLogicalOp(EmitterContext context, BoolOp logicOp, Operand input, Operand pred)
{
return logicOp switch
diff --git a/Ryujinx.Graphics.Shader/Instructions/InstEmitConversion.cs b/Ryujinx.Graphics.Shader/Instructions/InstEmitConversion.cs
index 43b07cc2..01cdc445 100644
--- a/Ryujinx.Graphics.Shader/Instructions/InstEmitConversion.cs
+++ b/Ryujinx.Graphics.Shader/Instructions/InstEmitConversion.cs
@@ -98,7 +98,7 @@ namespace Ryujinx.Graphics.Shader.Instructions
var src = GetSrcReg(context, op.SrcB);
- EmitI2I(context, op.SrcFmt, op.IDstFmt, src, op.ByteSel, op.Dest, op.AbsB, op.NegB, op.Sat);
+ EmitI2I(context, op.ISrcFmt, op.IDstFmt, src, op.ByteSel, op.Dest, op.AbsB, op.NegB, op.Sat);
}
public static void I2iI(EmitterContext context)
@@ -107,7 +107,7 @@ namespace Ryujinx.Graphics.Shader.Instructions
var src = GetSrcImm(context, Imm20ToSInt(op.Imm20));
- EmitI2I(context, op.SrcFmt, op.IDstFmt, src, op.ByteSel, op.Dest, op.AbsB, op.NegB, op.Sat);
+ EmitI2I(context, op.ISrcFmt, op.IDstFmt, src, op.ByteSel, op.Dest, op.AbsB, op.NegB, op.Sat);
}
public static void I2iC(EmitterContext context)
@@ -116,7 +116,7 @@ namespace Ryujinx.Graphics.Shader.Instructions
var src = GetSrcCbuf(context, op.CbufSlot, op.CbufOffset);
- EmitI2I(context, op.SrcFmt, op.IDstFmt, src, op.ByteSel, op.Dest, op.AbsB, op.NegB, op.Sat);
+ EmitI2I(context, op.ISrcFmt, op.IDstFmt, src, op.ByteSel, op.Dest, op.AbsB, op.NegB, op.Sat);
}
private static void EmitF2F(
@@ -261,8 +261,8 @@ namespace Ryujinx.Graphics.Shader.Instructions
private static void EmitI2I(
EmitterContext context,
- ISrcFmt srcType,
- IDstFmt dstType,
+ ISrcDstFmt srcType,
+ ISrcDstFmt dstType,
Operand src,
ByteSel byteSelection,
int rd,
@@ -270,30 +270,29 @@ namespace Ryujinx.Graphics.Shader.Instructions
bool negate,
bool saturate)
{
- if (srcType == ISrcFmt.U64 || dstType == IDstFmt.U64)
+ if ((srcType & ~ISrcDstFmt.S8) > ISrcDstFmt.U32 || (dstType & ~ISrcDstFmt.S8) > ISrcDstFmt.U32)
{
context.Config.GpuAccessor.Log("Invalid I2I encoding.");
return;
}
bool srcIsSignedInt =
- srcType == ISrcFmt.S8 ||
- srcType == ISrcFmt.S16 ||
- srcType == ISrcFmt.S32 ||
- srcType == ISrcFmt.S64;
+ srcType == ISrcDstFmt.S8 ||
+ srcType == ISrcDstFmt.S16 ||
+ srcType == ISrcDstFmt.S32;
bool dstIsSignedInt =
- dstType == IDstFmt.S16 ||
- dstType == IDstFmt.S32 ||
- dstType == IDstFmt.S64;
+ dstType == ISrcDstFmt.S8 ||
+ dstType == ISrcDstFmt.S16 ||
+ dstType == ISrcDstFmt.S32;
bool srcIsSmallInt =
- srcType == ISrcFmt.U16 ||
- srcType == ISrcFmt.S16 ||
- srcType == ISrcFmt.U8 ||
- srcType == ISrcFmt.S8;
+ srcType == ISrcDstFmt.U16 ||
+ srcType == ISrcDstFmt.S16 ||
+ srcType == ISrcDstFmt.U8 ||
+ srcType == ISrcDstFmt.S8;
if (srcIsSmallInt)
{
- int size = srcType == ISrcFmt.U16 || srcType == ISrcFmt.S16 ? 16 : 8;
+ int size = srcType == ISrcDstFmt.U16 || srcType == ISrcDstFmt.S16 ? 16 : 8;
src = srcIsSignedInt
? context.BitfieldExtractS32(src, Const((int)byteSelection * 8), Const(size))