diff options
| author | gdkchan <gab.dark.100@gmail.com> | 2023-04-05 00:25:19 -0300 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-04-05 05:25:19 +0200 |
| commit | c532118d94dea0bbafff7b92000c1a25cd4e021d (patch) | |
| tree | e381eb2b7ca638d6c550eae8557da11325d5ba44 /Ryujinx.Graphics.Gpu/Engine/Threed | |
| parent | 52d6f2e656c21c3e6693df93a3f09cd2e6a4e40e (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.cs | 14 | ||||
| -rw-r--r-- | Ryujinx.Graphics.Gpu/Engine/Threed/StateUpdater.cs | 22 |
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> |
