From 0663d29795d9af0ab615c8080db119958a0666c0 Mon Sep 17 00:00:00 2001 From: riperiperi Date: Mon, 23 Mar 2020 14:13:01 +0000 Subject: [PATCH] Index constant buffer vec4s using ternary expressions. --- .../CodeGen/Glsl/OperandManager.cs | 21 +++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/Ryujinx.Graphics.Shader/CodeGen/Glsl/OperandManager.cs b/Ryujinx.Graphics.Shader/CodeGen/Glsl/OperandManager.cs index 4c9d5b5507..f734580b4e 100644 --- a/Ryujinx.Graphics.Shader/CodeGen/Glsl/OperandManager.cs +++ b/Ryujinx.Graphics.Shader/CodeGen/Glsl/OperandManager.cs @@ -114,6 +114,24 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Glsl return ubName + "." + GetSwizzleMask(offset & 3); } + private static string GetVec4Indexed(string vectorName, string indexExpr) + { + bool canIndexVec4 = false; + if (canIndexVec4) + { + return $"{vectorName}[{indexExpr}]"; + } + else + { + 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 +142,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)