Просмотр исходного кода

Index constant buffer vec4s using ternary expressions. (#1015)

* Index constant buffer vec4s using ternary expressions.

* Remove indexed path.

We determined that it had negligible impact.

* Revert "Remove indexed path."

This reverts commit 25ec4eddfa441e802bd957dfaabc83b23c6bae38.

* Revert "Revert "Remove indexed path.""

This reverts commit 7cd52fecb529dcb9e1a574533bd38531319f1268.
riperiperi 6 лет назад
Родитель
Сommit
f9c859c8ba
1 измененных файлов с 11 добавлено и 2 удалено
  1. 11 2
      Ryujinx.Graphics.Shader/CodeGen/Glsl/OperandManager.cs

+ 11 - 2
Ryujinx.Graphics.Shader/CodeGen/Glsl/OperandManager.cs

@@ -114,6 +114,16 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Glsl
             return ubName + "." + GetSwizzleMask(offset & 3);
         }
 
+        private static string GetVec4Indexed(string vectorName, string indexExpr)
+        {
+            string result = $"{vectorName}.x";
+            for (int i = 1; i < 4; i++)
+            {
+                result = $"(({indexExpr}) == {i}) ? ({vectorName}.{GetSwizzleMask(i)}) : ({result})";
+            }
+            return $"({result})";
+        }
+
         public static string GetConstantBufferName(IAstNode slot, string offsetExpr, ShaderStage stage)
         {
             // Non-constant slots are not supported.
@@ -124,9 +134,8 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Glsl
             string ubName = GetUbName(stage, operand.Value);
 
             string index0 = "[" + offsetExpr + " >> 2]";
-            string index1 = "[" + offsetExpr + " & 3]";
 
-            return ubName + index0 + index1;
+            return GetVec4Indexed(ubName + index0, offsetExpr + " & 3");
         }
 
         public static string GetOutAttributeName(AstOperand attr, ShaderStage stage)