From 27b5251bd3c967933d07e6d5a0d80ba9e798775a Mon Sep 17 00:00:00 2001 From: Isaac Marovitz <42140194+isaacmarovitz@users.noreply.github.com> Date: Sun, 11 Aug 2024 18:21:56 +0100 Subject: [PATCH 1/3] Initial Changes --- .../Translation/Translator.cs | 24 ++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/src/Ryujinx.Graphics.Shader/Translation/Translator.cs b/src/Ryujinx.Graphics.Shader/Translation/Translator.cs index 7f276044a..86034bf7f 100644 --- a/src/Ryujinx.Graphics.Shader/Translation/Translator.cs +++ b/src/Ryujinx.Graphics.Shader/Translation/Translator.cs @@ -181,13 +181,31 @@ namespace Ryujinx.Graphics.Shader.Translation private static void EmitOutputsInitialization(EmitterContext context, AttributeUsage attributeUsage, IGpuAccessor gpuAccessor, ShaderStage stage) { - // Compute has no output attributes, and fragment is the last stage, so we - // don't need to initialize outputs on those stages. - if (stage == ShaderStage.Compute || stage == ShaderStage.Fragment) + // Compute has no output attributes, so we + // don't need to initialize outputs on that stage. + if (stage == ShaderStage.Compute) { return; } + if (stage == ShaderStage.Fragment) + { + // Fragment is the last stage, so we don't need to + // initialize outputs unless we're using DSB, in which + // we need to make sure the ouput has a valid value. + if (gpuAccessor.QueryGraphicsState().DualSourceBlendEnable) + { + for (int i = 0; i < 4; i++) + { + context.Store(StorageKind.Output, IoVariable.FragmentOutputColor, null, Const(1), Const(i), ConstF(0)); + } + } + else + { + return; + } + } + if (stage == ShaderStage.Vertex) { InitializeVertexOutputs(context); From 27b042ca1606fcd045904d0db17683951d842dc0 Mon Sep 17 00:00:00 2001 From: Isaac Marovitz <42140194+isaacmarovitz@users.noreply.github.com> Date: Sun, 11 Aug 2024 18:26:45 +0100 Subject: [PATCH 2/3] Always declare even in bad state on GLSL --- src/Ryujinx.Graphics.Shader/CodeGen/Glsl/Declarations.cs | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/src/Ryujinx.Graphics.Shader/CodeGen/Glsl/Declarations.cs b/src/Ryujinx.Graphics.Shader/CodeGen/Glsl/Declarations.cs index 2677cba07..335222cee 100644 --- a/src/Ryujinx.Graphics.Shader/CodeGen/Glsl/Declarations.cs +++ b/src/Ryujinx.Graphics.Shader/CodeGen/Glsl/Declarations.cs @@ -512,13 +512,9 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Glsl if (context.Definitions.Stage == ShaderStage.Fragment && context.Definitions.DualSourceBlend) { IoDefinition firstOutput = outputs.ElementAtOrDefault(0); - IoDefinition secondOutput = outputs.ElementAtOrDefault(1); - if (firstOutput.Location + 1 == secondOutput.Location) - { - DeclareOutputDualSourceBlendAttribute(context, firstOutput.Location); - outputs = outputs.Skip(2); - } + DeclareOutputDualSourceBlendAttribute(context, firstOutput.Location); + outputs = outputs.Skip(2); } foreach (IoDefinition ioDefinition in outputs) From c1051a9d6a6eaed4000bcda842a2cd9ed21fb591 Mon Sep 17 00:00:00 2001 From: Isaac Marovitz <42140194+isaacmarovitz@users.noreply.github.com> Date: Sun, 11 Aug 2024 18:27:49 +0100 Subject: [PATCH 3/3] Return --- src/Ryujinx.Graphics.Shader/Translation/Translator.cs | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/Ryujinx.Graphics.Shader/Translation/Translator.cs b/src/Ryujinx.Graphics.Shader/Translation/Translator.cs index 86034bf7f..2a1110632 100644 --- a/src/Ryujinx.Graphics.Shader/Translation/Translator.cs +++ b/src/Ryujinx.Graphics.Shader/Translation/Translator.cs @@ -200,10 +200,8 @@ namespace Ryujinx.Graphics.Shader.Translation context.Store(StorageKind.Output, IoVariable.FragmentOutputColor, null, Const(1), Const(i), ConstF(0)); } } - else - { - return; - } + + return; } if (stage == ShaderStage.Vertex)