فهرست منبع

Fix ZN flags set for shader instructions using RZ.CC dest (#2147)

* Fix ZN flags set for shader instructions using RZ.CC dest

* Shader cache version bump and nits
gdkchan 5 سال پیش
والد
کامیت
a0b4799f19

+ 1 - 1
Ryujinx.Graphics.Gpu/Shader/ShaderCache.cs

@@ -35,7 +35,7 @@ namespace Ryujinx.Graphics.Gpu.Shader
         /// <summary>
         /// Version of the codegen (to be changed when codegen or guest format change).
         /// </summary>
-        private const ulong ShaderCodeGenVersion = 2088;
+        private const ulong ShaderCodeGenVersion = 2147;
 
         // Progress reporting helpers
         private volatile int _shaderCount;

+ 7 - 12
Ryujinx.Graphics.Shader/Instructions/InstEmitAlu.cs

@@ -276,12 +276,11 @@ namespace Ryujinx.Graphics.Shader.Instructions
                 : context.IMaximumU32(srcA, srcB);
 
             Operand pred = GetPredicate39(context);
+            Operand res = context.ConditionalSelect(pred, resMin, resMax);
 
-            Operand dest = GetDest(context);
-
-            context.Copy(dest, context.ConditionalSelect(pred, resMin, resMax));
+            context.Copy(GetDest(context), res);
 
-            SetZnFlags(context, dest, op.SetCondCode);
+            SetZnFlags(context, res, op.SetCondCode);
 
             // TODO: X flags.
         }
@@ -461,11 +460,9 @@ namespace Ryujinx.Graphics.Shader.Instructions
 
             EmitLopPredWrite(context, op, res, (ConditionalOperation)context.CurrOp.RawOpCode.Extract(44, 2));
 
-            Operand dest = GetDest(context);
-
-            context.Copy(dest, res);
+            context.Copy(GetDest(context), res);
 
-            SetZnFlags(context, dest, op.SetCondCode, op.Extended);
+            SetZnFlags(context, res, op.SetCondCode, op.Extended);
         }
 
         public static void Lop3(EmitterContext context)
@@ -489,11 +486,9 @@ namespace Ryujinx.Graphics.Shader.Instructions
                 EmitLopPredWrite(context, op, res, (ConditionalOperation)context.CurrOp.RawOpCode.Extract(36, 2));
             }
 
-            Operand dest = GetDest(context);
-
-            context.Copy(dest, res);
+            context.Copy(GetDest(context), res);
 
-            SetZnFlags(context, dest, op.SetCondCode, op.Extended);
+            SetZnFlags(context, res, op.SetCondCode, op.Extended);
         }
 
         public static void Popc(EmitterContext context)

+ 1 - 1
Ryujinx.Graphics.Shader/Translation/EmitterContext.cs

@@ -91,7 +91,7 @@ namespace Ryujinx.Graphics.Shader.Translation
 
         public void PrepareForReturn()
         {
-            if (Config.Stage == ShaderStage.Fragment)
+            if (!IsNonMain && Config.Stage == ShaderStage.Fragment)
             {
                 if (Config.OmapDepth)
                 {