aboutsummaryrefslogtreecommitdiff
path: root/Ryujinx.Graphics.Gpu/Engine/Threed
diff options
context:
space:
mode:
authorgdkchan <gab.dark.100@gmail.com>2023-04-05 00:25:19 -0300
committerGitHub <noreply@github.com>2023-04-05 05:25:19 +0200
commitc532118d94dea0bbafff7b92000c1a25cd4e021d (patch)
treee381eb2b7ca638d6c550eae8557da11325d5ba44 /Ryujinx.Graphics.Gpu/Engine/Threed
parent52d6f2e656c21c3e6693df93a3f09cd2e6a4e40e (diff)
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 <Acoustik666@gmail.com>
Diffstat (limited to 'Ryujinx.Graphics.Gpu/Engine/Threed')
-rw-r--r--Ryujinx.Graphics.Gpu/Engine/Threed/SpecializationStateUpdater.cs14
-rw-r--r--Ryujinx.Graphics.Gpu/Engine/Threed/StateUpdater.cs22
2 files changed, 36 insertions, 0 deletions
diff --git a/Ryujinx.Graphics.Gpu/Engine/Threed/SpecializationStateUpdater.cs b/Ryujinx.Graphics.Gpu/Engine/Threed/SpecializationStateUpdater.cs
index 62df15e7..a8af5497 100644
--- a/Ryujinx.Graphics.Gpu/Engine/Threed/SpecializationStateUpdater.cs
+++ b/Ryujinx.Graphics.Gpu/Engine/Threed/SpecializationStateUpdater.cs
@@ -328,5 +328,19 @@ namespace Ryujinx.Graphics.Gpu.Engine.Threed
Signal();
}
}
+
+ /// <summary>
+ /// Sets the dual-source blend enabled state.
+ /// </summary>
+ /// <param name="enabled">True if blending is enabled and using dual-source blend</param>
+ public void SetDualSourceBlendEnabled(bool enabled)
+ {
+ if (enabled != _graphics.DualSourceBlendEnable)
+ {
+ _graphics.DualSourceBlendEnable = enabled;
+
+ Signal();
+ }
+ }
}
}
diff --git a/Ryujinx.Graphics.Gpu/Engine/Threed/StateUpdater.cs b/Ryujinx.Graphics.Gpu/Engine/Threed/StateUpdater.cs
index d7d197ad..00e09a31 100644
--- a/Ryujinx.Graphics.Gpu/Engine/Threed/StateUpdater.cs
+++ b/Ryujinx.Graphics.Gpu/Engine/Threed/StateUpdater.cs
@@ -1183,6 +1183,8 @@ namespace Ryujinx.Graphics.Gpu.Engine.Threed
bool blendIndependent = _state.State.BlendIndependent;
ColorF blendConstant = _state.State.BlendConstant;
+ bool dualSourceBlendEnabled = false;
+
if (blendIndependent)
{
for (int index = 0; index < Constants.TotalRenderTargets; index++)
@@ -1200,6 +1202,15 @@ namespace Ryujinx.Graphics.Gpu.Engine.Threed
FilterBlendFactor(blend.AlphaSrcFactor, index),
FilterBlendFactor(blend.AlphaDstFactor, index));
+ if (enable &&
+ (blend.ColorSrcFactor.IsDualSource() ||
+ blend.ColorDstFactor.IsDualSource() ||
+ blend.AlphaSrcFactor.IsDualSource() ||
+ blend.AlphaDstFactor.IsDualSource()))
+ {
+ dualSourceBlendEnabled = true;
+ }
+
_pipeline.BlendDescriptors[index] = descriptor;
_context.Renderer.Pipeline.SetBlendState(index, descriptor);
}
@@ -1219,12 +1230,23 @@ namespace Ryujinx.Graphics.Gpu.Engine.Threed
FilterBlendFactor(blend.AlphaSrcFactor, 0),
FilterBlendFactor(blend.AlphaDstFactor, 0));
+ if (enable &&
+ (blend.ColorSrcFactor.IsDualSource() ||
+ blend.ColorDstFactor.IsDualSource() ||
+ blend.AlphaSrcFactor.IsDualSource() ||
+ blend.AlphaDstFactor.IsDualSource()))
+ {
+ dualSourceBlendEnabled = true;
+ }
+
for (int index = 0; index < Constants.TotalRenderTargets; index++)
{
_pipeline.BlendDescriptors[index] = descriptor;
_context.Renderer.Pipeline.SetBlendState(index, descriptor);
}
}
+
+ _currentSpecState.SetDualSourceBlendEnabled(dualSourceBlendEnabled);
}
/// <summary>