Prechádzať zdrojové kódy

Support conditional on BRK and SYNC shader instructions (#1878)

* Support conditional on BRK and SYNC shader instructions

* Add TODO comment and bump cache version
gdkchan 5 rokov pred
rodič
commit
b9200dd734

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

@@ -34,7 +34,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 = 1759;
+        private const ulong ShaderCodeGenVersion = 1878;
 
         /// <summary>
         /// Creates a new instance of the shader cache.

+ 1 - 5
Ryujinx.Graphics.Shader/Decoders/OpCodeBranch.cs

@@ -2,10 +2,8 @@ using Ryujinx.Graphics.Shader.Instructions;
 
 namespace Ryujinx.Graphics.Shader.Decoders
 {
-    class OpCodeBranch : OpCode
+    class OpCodeBranch : OpCodeConditional
     {
-        public Condition Condition { get; }
-
         public int Offset { get; }
 
         public bool PushTarget { get; protected set; }
@@ -14,8 +12,6 @@ namespace Ryujinx.Graphics.Shader.Decoders
 
         public OpCodeBranch(InstEmitter emitter, ulong address, long opCode) : base(emitter, address, opCode)
         {
-            Condition = (Condition)(opCode & 0x1f);
-
             Offset = ((int)(opCode >> 20) << 8) >> 8;
 
             PushTarget = false;

+ 1 - 1
Ryujinx.Graphics.Shader/Decoders/OpCodeBranchPop.cs

@@ -3,7 +3,7 @@ using System.Collections.Generic;
 
 namespace Ryujinx.Graphics.Shader.Decoders
 {
-    class OpCodeBranchPop : OpCode
+    class OpCodeBranchPop : OpCodeConditional
     {
         public Dictionary<OpCodePush, int> Targets { get; }
 

+ 16 - 0
Ryujinx.Graphics.Shader/Decoders/OpCodeConditional.cs

@@ -0,0 +1,16 @@
+using Ryujinx.Graphics.Shader.Instructions;
+
+namespace Ryujinx.Graphics.Shader.Decoders
+{
+    class OpCodeConditional : OpCode
+    {
+        public Condition Condition { get; }
+
+        public new static OpCode Create(InstEmitter emitter, ulong address, long opCode) => new OpCodeExit(emitter, address, opCode);
+
+        public OpCodeConditional(InstEmitter emitter, ulong address, long opCode) : base(emitter, address, opCode)
+        {
+            Condition = (Condition)opCode.Extract(0, 5);
+        }
+    }
+}

+ 1 - 4
Ryujinx.Graphics.Shader/Decoders/OpCodeExit.cs

@@ -2,15 +2,12 @@ using Ryujinx.Graphics.Shader.Instructions;
 
 namespace Ryujinx.Graphics.Shader.Decoders
 {
-    class OpCodeExit : OpCode
+    class OpCodeExit : OpCodeConditional
     {
-        public Condition Condition { get; }
-
         public new static OpCode Create(InstEmitter emitter, ulong address, long opCode) => new OpCodeExit(emitter, address, opCode);
 
         public OpCodeExit(InstEmitter emitter, ulong address, long opCode) : base(emitter, address, opCode)
         {
-            Condition = (Condition)opCode.Extract(0, 5);
         }
     }
 }

+ 3 - 2
Ryujinx.Graphics.Shader/Instructions/InstEmitFlow.cs

@@ -146,6 +146,7 @@ namespace Ryujinx.Graphics.Shader.Instructions
             }
             else
             {
+                // TODO: Support CC here aswell (condition).
                 foreach (KeyValuePair<OpCodePush, int> kv in op.Targets)
                 {
                     OpCodePush pushOp = kv.Key;
@@ -176,9 +177,9 @@ namespace Ryujinx.Graphics.Shader.Instructions
 
             Operand pred = Register(op.Predicate);
 
-            if (op is OpCodeBranch opBranch && opBranch.Condition != Condition.Always)
+            if (op is OpCodeConditional opCond && opCond.Condition != Condition.Always)
             {
-                Operand cond = GetCondition(context, opBranch.Condition);
+                Operand cond = GetCondition(context, opCond.Condition);
 
                 if (op.Predicate.IsPT)
                 {