From c532118d94dea0bbafff7b92000c1a25cd4e021d Mon Sep 17 00:00:00 2001 From: gdkchan Date: Wed, 5 Apr 2023 00:25:19 -0300 Subject: Use index fragment shader output when dual source blend is enabled (#4404) * Use index fragment shader output when dual source blend is enabled * Shader cache version bump * Actually set DualSourceBlendEnabled to true * Fix XML doc --------- Co-authored-by: Ac_K --- .../CodeGen/Glsl/Declarations.cs | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) (limited to 'Ryujinx.Graphics.Shader/CodeGen/Glsl') diff --git a/Ryujinx.Graphics.Shader/CodeGen/Glsl/Declarations.cs b/Ryujinx.Graphics.Shader/CodeGen/Glsl/Declarations.cs index 996d312b..9032ca59 100644 --- a/Ryujinx.Graphics.Shader/CodeGen/Glsl/Declarations.cs +++ b/Ryujinx.Graphics.Shader/CodeGen/Glsl/Declarations.cs @@ -612,6 +612,19 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Glsl else { int usedAttributes = context.Config.UsedOutputAttributes; + + if (context.Config.Stage == ShaderStage.Fragment && context.Config.GpuAccessor.QueryDualSourceBlendEnable()) + { + int firstOutput = BitOperations.TrailingZeroCount(usedAttributes); + int mask = 3 << firstOutput; + + if ((usedAttributes & mask) == mask) + { + usedAttributes &= ~mask; + DeclareOutputDualSourceBlendAttribute(context, firstOutput); + } + } + while (usedAttributes != 0) { int index = BitOperations.TrailingZeroCount(usedAttributes); @@ -690,6 +703,15 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Glsl } } + private static void DeclareOutputDualSourceBlendAttribute(CodeGenContext context, int attr) + { + string name = $"{DefaultNames.OAttributePrefix}{attr}"; + string name2 = $"{DefaultNames.OAttributePrefix}{(attr + 1)}"; + + context.AppendLine($"layout (location = {attr}, index = 0) out vec4 {name};"); + context.AppendLine($"layout (location = {attr}, index = 1) out vec4 {name2};"); + } + private static void DeclareUsedOutputAttributesPerPatch(CodeGenContext context, HashSet attrs) { foreach (int attr in attrs.Order()) -- cgit v1.2.3