From d3fcab85112708707eacc4c71a8362b9c178218d Mon Sep 17 00:00:00 2001 From: gdk Date: Sun, 27 Oct 2019 13:33:08 -0300 Subject: [PATCH] Fix shader FMUL32I instruction saturation --- Ryujinx.Graphics.Shader/Instructions/InstEmitFArith.cs | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/Ryujinx.Graphics.Shader/Instructions/InstEmitFArith.cs b/Ryujinx.Graphics.Shader/Instructions/InstEmitFArith.cs index 522875e54..1a7d42511 100644 --- a/Ryujinx.Graphics.Shader/Instructions/InstEmitFArith.cs +++ b/Ryujinx.Graphics.Shader/Instructions/InstEmitFArith.cs @@ -87,7 +87,9 @@ namespace Ryujinx.Graphics.Shader.Instructions { IOpCodeFArith op = (IOpCodeFArith)context.CurrOp; - bool negateB = !(op is OpCodeFArithImm32) && op.RawOpCode.Extract(48); + bool isImm32 = op is OpCodeFArithImm32; + + bool negateB = !isImm32 && op.RawOpCode.Extract(48); Operand srcA = GetSrcA(context); @@ -109,7 +111,9 @@ namespace Ryujinx.Graphics.Shader.Instructions Operand dest = GetDest(context); - context.Copy(dest, context.FPSaturate(context.FPMultiply(srcA, srcB), op.Saturate)); + bool saturate = isImm32 ? op.RawOpCode.Extract(55) : op.Saturate; + + context.Copy(dest, context.FPSaturate(context.FPMultiply(srcA, srcB), saturate)); SetFPZnFlags(context, dest, op.SetCondCode); }