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.
This commit is contained in:
riperiperi 2020-03-29 17:24:54 +01:00 committed by GitHub
parent b18ef8e3a0
commit f9c859c8ba
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -114,6 +114,16 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Glsl
return ubName + "." + GetSwizzleMask(offset & 3); 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) public static string GetConstantBufferName(IAstNode slot, string offsetExpr, ShaderStage stage)
{ {
// Non-constant slots are not supported. // Non-constant slots are not supported.
@ -124,9 +134,8 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Glsl
string ubName = GetUbName(stage, operand.Value); string ubName = GetUbName(stage, operand.Value);
string index0 = "[" + offsetExpr + " >> 2]"; 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) public static string GetOutAttributeName(AstOperand attr, ShaderStage stage)