Przeglądaj źródła

Shader: Assume the only remaining source is the right one when all others are undefined (#7331)

* Shader: Assume the only remaining source is the right one when all other are undefined

* Shader cache version bump

* Improve comment
gdkchan 1 rok temu
rodzic
commit
d717aef2be

+ 1 - 1
src/Ryujinx.Graphics.Gpu/Shader/DiskCache/DiskCacheHostStorage.cs

@@ -22,7 +22,7 @@ namespace Ryujinx.Graphics.Gpu.Shader.DiskCache
         private const ushort FileFormatVersionMajor = 1;
         private const ushort FileFormatVersionMinor = 2;
         private const uint FileFormatVersionPacked = ((uint)FileFormatVersionMajor << 16) | FileFormatVersionMinor;
-        private const uint CodeGenVersion = 7320;
+        private const uint CodeGenVersion = 7331;
 
         private const string SharedTocFileName = "shared.toc";
         private const string SharedDataFileName = "shared.data";

+ 22 - 0
src/Ryujinx.Graphics.Shader/Translation/Optimizations/Utils.cs

@@ -138,6 +138,8 @@ namespace Ryujinx.Graphics.Shader.Translation.Optimizations
                 // Ensure that conditions met for that branch are also met for the current one.
                 // Prefer the latest sources for the phi node.
 
+                int undefCount = 0;
+
                 for (int i = phiNode.SourcesCount - 1; i >= 0; i--)
                 {
                     BasicBlock phiBlock = phiNode.GetBlock(i);
@@ -159,6 +161,26 @@ namespace Ryujinx.Graphics.Shader.Translation.Optimizations
                             return match;
                         }
                     }
+                    else if (phiSource.Type == OperandType.Undefined)
+                    {
+                        undefCount++;
+                    }
+                }
+
+                // If all sources but one are undefined, we can assume that the one
+                // that is not undefined is the right one.
+
+                if (undefCount == phiNode.SourcesCount - 1)
+                {
+                    for (int i = phiNode.SourcesCount - 1; i >= 0; i--)
+                    {
+                        Operand phiSource = phiNode.GetSource(i);
+
+                        if (phiSource.Type != OperandType.Undefined)
+                        {
+                            return phiSource;
+                        }
+                    }
                 }
             }