|
|
@@ -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)
|