From 7404d782cee8cf9e3e9495e4f1274d9a6476656b Mon Sep 17 00:00:00 2001 From: sunshineinabox Date: Fri, 5 Jul 2024 00:40:49 -0700 Subject: [PATCH 1/6] Avoid setting DepthBias when not needed. --- src/Ryujinx.Graphics.GAL/IPipeline.cs | 3 +- .../Multithreading/CommandHelper.cs | 1 + .../Multithreading/CommandType.cs | 1 + .../Commands/SetDepthBiasCommand.cs | 6 ++-- .../Commands/SetDepthBiasEnableCommand.cs | 19 +++++++++++ .../Multithreading/ThreadedPipeline.cs | 10 ++++-- .../Engine/Threed/StateUpdater.cs | 21 +++++++++--- src/Ryujinx.Graphics.OpenGL/Pipeline.cs | 33 ++++++++++--------- src/Ryujinx.Graphics.Vulkan/PipelineBase.cs | 8 ++++- src/Ryujinx.Graphics.Vulkan/PipelineState.cs | 22 +++++++++---- 10 files changed, 90 insertions(+), 34 deletions(-) create mode 100644 src/Ryujinx.Graphics.GAL/Multithreading/Commands/SetDepthBiasEnableCommand.cs diff --git a/src/Ryujinx.Graphics.GAL/IPipeline.cs b/src/Ryujinx.Graphics.GAL/IPipeline.cs index cbf1bc3a22..71f99fc0b0 100644 --- a/src/Ryujinx.Graphics.GAL/IPipeline.cs +++ b/src/Ryujinx.Graphics.GAL/IPipeline.cs @@ -47,7 +47,8 @@ namespace Ryujinx.Graphics.GAL void SetBlendState(AdvancedBlendDescriptor blend); void SetBlendState(int index, BlendDescriptor blend); - void SetDepthBias(PolygonModeMask enables, float factor, float units, float clamp); + void SetDepthBias(float factor, float units, float clamp); + void SetDepthBiasEnable(PolygonModeMask enables); void SetDepthClamp(bool clamp); void SetDepthMode(DepthMode mode); void SetDepthTest(DepthTestDescriptor depthTest); diff --git a/src/Ryujinx.Graphics.GAL/Multithreading/CommandHelper.cs b/src/Ryujinx.Graphics.GAL/Multithreading/CommandHelper.cs index ef227d4a54..67eccb34c7 100644 --- a/src/Ryujinx.Graphics.GAL/Multithreading/CommandHelper.cs +++ b/src/Ryujinx.Graphics.GAL/Multithreading/CommandHelper.cs @@ -116,6 +116,7 @@ namespace Ryujinx.Graphics.GAL.Multithreading Register(CommandType.SetBlendStateAdvanced); Register(CommandType.SetBlendState); Register(CommandType.SetDepthBias); + Register(CommandType.SetDepthBiasEnable); Register(CommandType.SetDepthClamp); Register(CommandType.SetDepthMode); Register(CommandType.SetDepthTest); diff --git a/src/Ryujinx.Graphics.GAL/Multithreading/CommandType.cs b/src/Ryujinx.Graphics.GAL/Multithreading/CommandType.cs index cf3f5d6c14..cb009c75d1 100644 --- a/src/Ryujinx.Graphics.GAL/Multithreading/CommandType.cs +++ b/src/Ryujinx.Graphics.GAL/Multithreading/CommandType.cs @@ -76,6 +76,7 @@ namespace Ryujinx.Graphics.GAL.Multithreading SetBlendStateAdvanced, SetBlendState, SetDepthBias, + SetDepthBiasEnable, SetDepthClamp, SetDepthMode, SetDepthTest, diff --git a/src/Ryujinx.Graphics.GAL/Multithreading/Commands/SetDepthBiasCommand.cs b/src/Ryujinx.Graphics.GAL/Multithreading/Commands/SetDepthBiasCommand.cs index 0c46fbda28..1fa3803279 100644 --- a/src/Ryujinx.Graphics.GAL/Multithreading/Commands/SetDepthBiasCommand.cs +++ b/src/Ryujinx.Graphics.GAL/Multithreading/Commands/SetDepthBiasCommand.cs @@ -3,14 +3,12 @@ namespace Ryujinx.Graphics.GAL.Multithreading.Commands struct SetDepthBiasCommand : IGALCommand, IGALCommand { public readonly CommandType CommandType => CommandType.SetDepthBias; - private PolygonModeMask _enables; private float _factor; private float _units; private float _clamp; - public void Set(PolygonModeMask enables, float factor, float units, float clamp) + public void Set(float factor, float units, float clamp) { - _enables = enables; _factor = factor; _units = units; _clamp = clamp; @@ -18,7 +16,7 @@ namespace Ryujinx.Graphics.GAL.Multithreading.Commands public static void Run(ref SetDepthBiasCommand command, ThreadedRenderer threaded, IRenderer renderer) { - renderer.Pipeline.SetDepthBias(command._enables, command._factor, command._units, command._clamp); + renderer.Pipeline.SetDepthBias(command._factor, command._units, command._clamp); } } } diff --git a/src/Ryujinx.Graphics.GAL/Multithreading/Commands/SetDepthBiasEnableCommand.cs b/src/Ryujinx.Graphics.GAL/Multithreading/Commands/SetDepthBiasEnableCommand.cs new file mode 100644 index 0000000000..176da6f39e --- /dev/null +++ b/src/Ryujinx.Graphics.GAL/Multithreading/Commands/SetDepthBiasEnableCommand.cs @@ -0,0 +1,19 @@ +namespace Ryujinx.Graphics.GAL.Multithreading.Commands +{ + struct SetDepthBiasEnableCommand : IGALCommand, IGALCommand + { + public readonly CommandType CommandType => CommandType.SetDepthBias; + private PolygonModeMask _enables; + + + public void Set(PolygonModeMask enables) + { + _enables = enables; + } + + public static void Run(ref SetDepthBiasEnableCommand command, ThreadedRenderer threaded, IRenderer renderer) + { + renderer.Pipeline.SetDepthBiasEnable(command._enables); + } + } +} diff --git a/src/Ryujinx.Graphics.GAL/Multithreading/ThreadedPipeline.cs b/src/Ryujinx.Graphics.GAL/Multithreading/ThreadedPipeline.cs index edd79d8a07..45ae679cee 100644 --- a/src/Ryujinx.Graphics.GAL/Multithreading/ThreadedPipeline.cs +++ b/src/Ryujinx.Graphics.GAL/Multithreading/ThreadedPipeline.cs @@ -141,9 +141,15 @@ namespace Ryujinx.Graphics.GAL.Multithreading _renderer.QueueCommand(); } - public void SetDepthBias(PolygonModeMask enables, float factor, float units, float clamp) + public void SetDepthBias(float factor, float units, float clamp) { - _renderer.New().Set(enables, factor, units, clamp); + _renderer.New().Set(factor, units, clamp); + _renderer.QueueCommand(); + } + + public void SetDepthBiasEnable(PolygonModeMask enables) + { + _renderer.New().Set(enables); _renderer.QueueCommand(); } diff --git a/src/Ryujinx.Graphics.Gpu/Engine/Threed/StateUpdater.cs b/src/Ryujinx.Graphics.Gpu/Engine/Threed/StateUpdater.cs index 1dc77b52df..569481d8c5 100644 --- a/src/Ryujinx.Graphics.Gpu/Engine/Threed/StateUpdater.cs +++ b/src/Ryujinx.Graphics.Gpu/Engine/Threed/StateUpdater.cs @@ -849,12 +849,25 @@ namespace Ryujinx.Graphics.Gpu.Engine.Threed PolygonModeMask enables; - enables = (depthBias.PointEnable ? PolygonModeMask.Point : 0); - enables |= (depthBias.LineEnable ? PolygonModeMask.Line : 0); - enables |= (depthBias.FillEnable ? PolygonModeMask.Fill : 0); + if (factor == 0 && units == 0) + { + enables = 0; + } + else + { + enables = (depthBias.PointEnable ? PolygonModeMask.Point : 0); + enables |= (depthBias.LineEnable ? PolygonModeMask.Line : 0); + enables |= (depthBias.FillEnable ? PolygonModeMask.Fill : 0); + } _pipeline.BiasEnable = enables; - _context.Renderer.Pipeline.SetDepthBias(enables, factor, units / 2f, clamp); + + _context.Renderer.Pipeline.SetDepthBiasEnable(enables); + + if (enables != 0) + { + _context.Renderer.Pipeline.SetDepthBias(factor, units / 2f, clamp); + } } /// diff --git a/src/Ryujinx.Graphics.OpenGL/Pipeline.cs b/src/Ryujinx.Graphics.OpenGL/Pipeline.cs index 54f6b3f7b2..1dcafd7185 100644 --- a/src/Ryujinx.Graphics.OpenGL/Pipeline.cs +++ b/src/Ryujinx.Graphics.OpenGL/Pipeline.cs @@ -831,8 +831,25 @@ namespace Ryujinx.Graphics.OpenGL GL.Enable(IndexedEnableCap.Blend, index); } - public void SetDepthBias(PolygonModeMask enables, float factor, float units, float clamp) + public void SetDepthBias(float factor, float units, float clamp) { + if (HwCapabilities.SupportsPolygonOffsetClamp) + { + GL.PolygonOffsetClamp(factor, units, clamp); + } + else + { + GL.PolygonOffset(factor, units); + } + } + + public void SetDepthBiasEnable(PolygonModeMask enables) + { + if (enables == 0) + { + return; + } + if ((enables & PolygonModeMask.Point) != 0) { GL.Enable(EnableCap.PolygonOffsetPoint); @@ -859,20 +876,6 @@ namespace Ryujinx.Graphics.OpenGL { GL.Disable(EnableCap.PolygonOffsetFill); } - - if (enables == 0) - { - return; - } - - if (HwCapabilities.SupportsPolygonOffsetClamp) - { - GL.PolygonOffsetClamp(factor, units, clamp); - } - else - { - GL.PolygonOffset(factor, units); - } } public void SetDepthClamp(bool clamp) diff --git a/src/Ryujinx.Graphics.Vulkan/PipelineBase.cs b/src/Ryujinx.Graphics.Vulkan/PipelineBase.cs index bda6167d7b..b664980a78 100644 --- a/src/Ryujinx.Graphics.Vulkan/PipelineBase.cs +++ b/src/Ryujinx.Graphics.Vulkan/PipelineBase.cs @@ -785,11 +785,17 @@ namespace Ryujinx.Graphics.Vulkan SignalStateChange(); } - public void SetDepthBias(PolygonModeMask enables, float factor, float units, float clamp) + public void SetDepthBias(float factor, float units, float clamp) { DynamicState.SetDepthBias(factor, units, clamp); + SignalStateChange(); + } + + public void SetDepthBiasEnable(PolygonModeMask enables) + { _newState.DepthBiasEnable = enables != 0; + SignalStateChange(); } diff --git a/src/Ryujinx.Graphics.Vulkan/PipelineState.cs b/src/Ryujinx.Graphics.Vulkan/PipelineState.cs index 2a8f930811..8373c97375 100644 --- a/src/Ryujinx.Graphics.Vulkan/PipelineState.cs +++ b/src/Ryujinx.Graphics.Vulkan/PipelineState.cs @@ -564,21 +564,29 @@ namespace Ryujinx.Graphics.Vulkan } bool supportsExtDynamicState = gd.Capabilities.SupportsExtendedDynamicState; - int dynamicStatesCount = supportsExtDynamicState ? 8 : 7; + int dynamicStatesCount = supportsExtDynamicState ? 7 : 6; + if (DepthBiasEnable) + { + dynamicStatesCount++; + } DynamicState* dynamicStates = stackalloc DynamicState[dynamicStatesCount]; dynamicStates[0] = DynamicState.Viewport; dynamicStates[1] = DynamicState.Scissor; - dynamicStates[2] = DynamicState.DepthBias; - dynamicStates[3] = DynamicState.StencilCompareMask; - dynamicStates[4] = DynamicState.StencilWriteMask; - dynamicStates[5] = DynamicState.StencilReference; - dynamicStates[6] = DynamicState.BlendConstants; + dynamicStates[2] = DynamicState.StencilCompareMask; + dynamicStates[3] = DynamicState.StencilWriteMask; + dynamicStates[4] = DynamicState.StencilReference; + dynamicStates[5] = DynamicState.BlendConstants; + + if (DepthBiasEnable) + { + dynamicStates[6] = DynamicState.DepthBias; + } if (supportsExtDynamicState) { - dynamicStates[7] = DynamicState.VertexInputBindingStrideExt; + dynamicStates[dynamicStatesCount - 1] = DynamicState.VertexInputBindingStrideExt; } var pipelineDynamicStateCreateInfo = new PipelineDynamicStateCreateInfo From 10506afc239fae18e18f216ff70f09f6a33a92d4 Mon Sep 17 00:00:00 2001 From: sunshineinabox Date: Mon, 15 Jul 2024 22:25:20 -0700 Subject: [PATCH 2/6] Avoid unncessary DepthBias state updates --- .../Engine/Threed/StateUpdater.cs | 24 +++++++++++++------ src/Ryujinx.Graphics.OpenGL/Pipeline.cs | 9 +++++++ src/Ryujinx.Graphics.Vulkan/PipelineBase.cs | 23 ++++++++++++++++-- 3 files changed, 47 insertions(+), 9 deletions(-) diff --git a/src/Ryujinx.Graphics.Gpu/Engine/Threed/StateUpdater.cs b/src/Ryujinx.Graphics.Gpu/Engine/Threed/StateUpdater.cs index 569481d8c5..c4388fe962 100644 --- a/src/Ryujinx.Graphics.Gpu/Engine/Threed/StateUpdater.cs +++ b/src/Ryujinx.Graphics.Gpu/Engine/Threed/StateUpdater.cs @@ -841,19 +841,29 @@ namespace Ryujinx.Graphics.Gpu.Engine.Threed /// private void UpdateDepthBiasState() { + if (_pipeline.BiasEnable == 0 && (_state.State.DepthBiasFactor == 0 && _state.State.DepthBiasUnits == 0)) + { + return; + } + else if (_pipeline.BiasEnable != 0 && + (_state.State.DepthBiasFactor == 0 && _state.State.DepthBiasUnits == 0)) + { + _pipeline.BiasEnable = 0; + + _context.Renderer.Pipeline.SetDepthBiasEnable(0); + + return; + } + var depthBias = _state.State.DepthBiasState; float factor = _state.State.DepthBiasFactor; float units = _state.State.DepthBiasUnits; float clamp = _state.State.DepthBiasClamp; - PolygonModeMask enables; + PolygonModeMask enables = 0; - if (factor == 0 && units == 0) - { - enables = 0; - } - else + if (factor != 0 && units != 0) { enables = (depthBias.PointEnable ? PolygonModeMask.Point : 0); enables |= (depthBias.LineEnable ? PolygonModeMask.Line : 0); @@ -864,7 +874,7 @@ namespace Ryujinx.Graphics.Gpu.Engine.Threed _context.Renderer.Pipeline.SetDepthBiasEnable(enables); - if (enables != 0) + if (enables > 0) { _context.Renderer.Pipeline.SetDepthBias(factor, units / 2f, clamp); } diff --git a/src/Ryujinx.Graphics.OpenGL/Pipeline.cs b/src/Ryujinx.Graphics.OpenGL/Pipeline.cs index 1dcafd7185..fb277f94a9 100644 --- a/src/Ryujinx.Graphics.OpenGL/Pipeline.cs +++ b/src/Ryujinx.Graphics.OpenGL/Pipeline.cs @@ -833,6 +833,15 @@ namespace Ryujinx.Graphics.OpenGL public void SetDepthBias(float factor, float units, float clamp) { + if (factor == 0 && units == 0) + { + GL.Disable(EnableCap.PolygonOffsetPoint); + GL.Disable(EnableCap.PolygonOffsetLine); + GL.Disable(EnableCap.PolygonOffsetFill); + + return; + } + if (HwCapabilities.SupportsPolygonOffsetClamp) { GL.PolygonOffsetClamp(factor, units, clamp); diff --git a/src/Ryujinx.Graphics.Vulkan/PipelineBase.cs b/src/Ryujinx.Graphics.Vulkan/PipelineBase.cs index b664980a78..04d877a0cc 100644 --- a/src/Ryujinx.Graphics.Vulkan/PipelineBase.cs +++ b/src/Ryujinx.Graphics.Vulkan/PipelineBase.cs @@ -787,6 +787,19 @@ namespace Ryujinx.Graphics.Vulkan public void SetDepthBias(float factor, float units, float clamp) { + if (factor == 0 && units == 0 && _newState.DepthBiasEnable) + { + _newState.DepthBiasEnable = false; + + SignalStateChange(); + + return; + } + else if (factor == 0 && units == 0 && !_newState.DepthBiasEnable) + { + return; + } + DynamicState.SetDepthBias(factor, units, clamp); SignalStateChange(); @@ -794,9 +807,15 @@ namespace Ryujinx.Graphics.Vulkan public void SetDepthBiasEnable(PolygonModeMask enables) { - _newState.DepthBiasEnable = enables != 0; + bool depthBiasEnable = enables != 0; + + if (_newState.DepthBiasEnable != depthBiasEnable) + { + _newState.DepthBiasEnable = depthBiasEnable; + + SignalStateChange(); + } - SignalStateChange(); } public void SetDepthClamp(bool clamp) From a7a49cc8fe2d73d1af878cdb9ad7022a9e270ba1 Mon Sep 17 00:00:00 2001 From: sunshineinabox Date: Sat, 20 Jul 2024 19:07:19 -0700 Subject: [PATCH 3/6] Revert some changes that were out of scope/intent of commit --- src/Ryujinx.Graphics.GAL/IPipeline.cs | 3 +- .../Multithreading/CommandHelper.cs | 1 - .../Multithreading/CommandType.cs | 1 - .../Commands/SetDepthBiasCommand.cs | 6 ++-- .../Commands/SetDepthBiasEnableCommand.cs | 19 ---------- .../Multithreading/ThreadedPipeline.cs | 10 ++---- .../Engine/Threed/StateUpdater.cs | 9 ++--- src/Ryujinx.Graphics.OpenGL/Pipeline.cs | 30 ++++++---------- src/Ryujinx.Graphics.Vulkan/PipelineBase.cs | 35 ++++++++----------- 9 files changed, 35 insertions(+), 79 deletions(-) delete mode 100644 src/Ryujinx.Graphics.GAL/Multithreading/Commands/SetDepthBiasEnableCommand.cs diff --git a/src/Ryujinx.Graphics.GAL/IPipeline.cs b/src/Ryujinx.Graphics.GAL/IPipeline.cs index 71f99fc0b0..cbf1bc3a22 100644 --- a/src/Ryujinx.Graphics.GAL/IPipeline.cs +++ b/src/Ryujinx.Graphics.GAL/IPipeline.cs @@ -47,8 +47,7 @@ namespace Ryujinx.Graphics.GAL void SetBlendState(AdvancedBlendDescriptor blend); void SetBlendState(int index, BlendDescriptor blend); - void SetDepthBias(float factor, float units, float clamp); - void SetDepthBiasEnable(PolygonModeMask enables); + void SetDepthBias(PolygonModeMask enables, float factor, float units, float clamp); void SetDepthClamp(bool clamp); void SetDepthMode(DepthMode mode); void SetDepthTest(DepthTestDescriptor depthTest); diff --git a/src/Ryujinx.Graphics.GAL/Multithreading/CommandHelper.cs b/src/Ryujinx.Graphics.GAL/Multithreading/CommandHelper.cs index 67eccb34c7..ef227d4a54 100644 --- a/src/Ryujinx.Graphics.GAL/Multithreading/CommandHelper.cs +++ b/src/Ryujinx.Graphics.GAL/Multithreading/CommandHelper.cs @@ -116,7 +116,6 @@ namespace Ryujinx.Graphics.GAL.Multithreading Register(CommandType.SetBlendStateAdvanced); Register(CommandType.SetBlendState); Register(CommandType.SetDepthBias); - Register(CommandType.SetDepthBiasEnable); Register(CommandType.SetDepthClamp); Register(CommandType.SetDepthMode); Register(CommandType.SetDepthTest); diff --git a/src/Ryujinx.Graphics.GAL/Multithreading/CommandType.cs b/src/Ryujinx.Graphics.GAL/Multithreading/CommandType.cs index cb009c75d1..cf3f5d6c14 100644 --- a/src/Ryujinx.Graphics.GAL/Multithreading/CommandType.cs +++ b/src/Ryujinx.Graphics.GAL/Multithreading/CommandType.cs @@ -76,7 +76,6 @@ namespace Ryujinx.Graphics.GAL.Multithreading SetBlendStateAdvanced, SetBlendState, SetDepthBias, - SetDepthBiasEnable, SetDepthClamp, SetDepthMode, SetDepthTest, diff --git a/src/Ryujinx.Graphics.GAL/Multithreading/Commands/SetDepthBiasCommand.cs b/src/Ryujinx.Graphics.GAL/Multithreading/Commands/SetDepthBiasCommand.cs index 1fa3803279..0c46fbda28 100644 --- a/src/Ryujinx.Graphics.GAL/Multithreading/Commands/SetDepthBiasCommand.cs +++ b/src/Ryujinx.Graphics.GAL/Multithreading/Commands/SetDepthBiasCommand.cs @@ -3,12 +3,14 @@ namespace Ryujinx.Graphics.GAL.Multithreading.Commands struct SetDepthBiasCommand : IGALCommand, IGALCommand { public readonly CommandType CommandType => CommandType.SetDepthBias; + private PolygonModeMask _enables; private float _factor; private float _units; private float _clamp; - public void Set(float factor, float units, float clamp) + public void Set(PolygonModeMask enables, float factor, float units, float clamp) { + _enables = enables; _factor = factor; _units = units; _clamp = clamp; @@ -16,7 +18,7 @@ namespace Ryujinx.Graphics.GAL.Multithreading.Commands public static void Run(ref SetDepthBiasCommand command, ThreadedRenderer threaded, IRenderer renderer) { - renderer.Pipeline.SetDepthBias(command._factor, command._units, command._clamp); + renderer.Pipeline.SetDepthBias(command._enables, command._factor, command._units, command._clamp); } } } diff --git a/src/Ryujinx.Graphics.GAL/Multithreading/Commands/SetDepthBiasEnableCommand.cs b/src/Ryujinx.Graphics.GAL/Multithreading/Commands/SetDepthBiasEnableCommand.cs deleted file mode 100644 index 176da6f39e..0000000000 --- a/src/Ryujinx.Graphics.GAL/Multithreading/Commands/SetDepthBiasEnableCommand.cs +++ /dev/null @@ -1,19 +0,0 @@ -namespace Ryujinx.Graphics.GAL.Multithreading.Commands -{ - struct SetDepthBiasEnableCommand : IGALCommand, IGALCommand - { - public readonly CommandType CommandType => CommandType.SetDepthBias; - private PolygonModeMask _enables; - - - public void Set(PolygonModeMask enables) - { - _enables = enables; - } - - public static void Run(ref SetDepthBiasEnableCommand command, ThreadedRenderer threaded, IRenderer renderer) - { - renderer.Pipeline.SetDepthBiasEnable(command._enables); - } - } -} diff --git a/src/Ryujinx.Graphics.GAL/Multithreading/ThreadedPipeline.cs b/src/Ryujinx.Graphics.GAL/Multithreading/ThreadedPipeline.cs index 45ae679cee..edd79d8a07 100644 --- a/src/Ryujinx.Graphics.GAL/Multithreading/ThreadedPipeline.cs +++ b/src/Ryujinx.Graphics.GAL/Multithreading/ThreadedPipeline.cs @@ -141,15 +141,9 @@ namespace Ryujinx.Graphics.GAL.Multithreading _renderer.QueueCommand(); } - public void SetDepthBias(float factor, float units, float clamp) + public void SetDepthBias(PolygonModeMask enables, float factor, float units, float clamp) { - _renderer.New().Set(factor, units, clamp); - _renderer.QueueCommand(); - } - - public void SetDepthBiasEnable(PolygonModeMask enables) - { - _renderer.New().Set(enables); + _renderer.New().Set(enables, factor, units, clamp); _renderer.QueueCommand(); } diff --git a/src/Ryujinx.Graphics.Gpu/Engine/Threed/StateUpdater.cs b/src/Ryujinx.Graphics.Gpu/Engine/Threed/StateUpdater.cs index c4388fe962..1cdb09895f 100644 --- a/src/Ryujinx.Graphics.Gpu/Engine/Threed/StateUpdater.cs +++ b/src/Ryujinx.Graphics.Gpu/Engine/Threed/StateUpdater.cs @@ -850,7 +850,7 @@ namespace Ryujinx.Graphics.Gpu.Engine.Threed { _pipeline.BiasEnable = 0; - _context.Renderer.Pipeline.SetDepthBiasEnable(0); + _context.Renderer.Pipeline.SetDepthBias(0, 0, 0, 0); return; } @@ -872,12 +872,7 @@ namespace Ryujinx.Graphics.Gpu.Engine.Threed _pipeline.BiasEnable = enables; - _context.Renderer.Pipeline.SetDepthBiasEnable(enables); - - if (enables > 0) - { - _context.Renderer.Pipeline.SetDepthBias(factor, units / 2f, clamp); - } + _context.Renderer.Pipeline.SetDepthBias(enables, factor, units / 2f, clamp); } /// diff --git a/src/Ryujinx.Graphics.OpenGL/Pipeline.cs b/src/Ryujinx.Graphics.OpenGL/Pipeline.cs index fb277f94a9..f04cdd7624 100644 --- a/src/Ryujinx.Graphics.OpenGL/Pipeline.cs +++ b/src/Ryujinx.Graphics.OpenGL/Pipeline.cs @@ -831,9 +831,9 @@ namespace Ryujinx.Graphics.OpenGL GL.Enable(IndexedEnableCap.Blend, index); } - public void SetDepthBias(float factor, float units, float clamp) + public void SetDepthBias(PolygonModeMask enables, float factor, float units, float clamp) { - if (factor == 0 && units == 0) + if (enables == 0 || (factor == 0 && units == 0)) { GL.Disable(EnableCap.PolygonOffsetPoint); GL.Disable(EnableCap.PolygonOffsetLine); @@ -842,23 +842,6 @@ namespace Ryujinx.Graphics.OpenGL return; } - if (HwCapabilities.SupportsPolygonOffsetClamp) - { - GL.PolygonOffsetClamp(factor, units, clamp); - } - else - { - GL.PolygonOffset(factor, units); - } - } - - public void SetDepthBiasEnable(PolygonModeMask enables) - { - if (enables == 0) - { - return; - } - if ((enables & PolygonModeMask.Point) != 0) { GL.Enable(EnableCap.PolygonOffsetPoint); @@ -885,6 +868,15 @@ namespace Ryujinx.Graphics.OpenGL { GL.Disable(EnableCap.PolygonOffsetFill); } + + if (HwCapabilities.SupportsPolygonOffsetClamp) + { + GL.PolygonOffsetClamp(factor, units, clamp); + } + else + { + GL.PolygonOffset(factor, units); + } } public void SetDepthClamp(bool clamp) diff --git a/src/Ryujinx.Graphics.Vulkan/PipelineBase.cs b/src/Ryujinx.Graphics.Vulkan/PipelineBase.cs index 04d877a0cc..a25f7faf3b 100644 --- a/src/Ryujinx.Graphics.Vulkan/PipelineBase.cs +++ b/src/Ryujinx.Graphics.Vulkan/PipelineBase.cs @@ -785,37 +785,32 @@ namespace Ryujinx.Graphics.Vulkan SignalStateChange(); } - public void SetDepthBias(float factor, float units, float clamp) + public void SetDepthBias(PolygonModeMask enables, float factor, float units, float clamp) { - if (factor == 0 && units == 0 && _newState.DepthBiasEnable) - { - _newState.DepthBiasEnable = false; + bool depthBiasEnable = (enables != 0) && (factor != 0 && units != 0); + bool changed = false; - SignalStateChange(); - - return; - } - else if (factor == 0 && units == 0 && !_newState.DepthBiasEnable) + if (factor == 0 && units == 0 && !_newState.DepthBiasEnable) { return; } - DynamicState.SetDepthBias(factor, units, clamp); - - SignalStateChange(); - } - - public void SetDepthBiasEnable(PolygonModeMask enables) - { - bool depthBiasEnable = enables != 0; - if (_newState.DepthBiasEnable != depthBiasEnable) { _newState.DepthBiasEnable = depthBiasEnable; - - SignalStateChange(); + changed = true; } + if (depthBiasEnable) + { + DynamicState.SetDepthBias(factor, units, clamp); + changed = true; + } + + if (changed) + { + SignalStateChange(); + } } public void SetDepthClamp(bool clamp) From 20101e2ea3ea83f24eb23aeefc8010b146f9d264 Mon Sep 17 00:00:00 2001 From: sunshineinabox Date: Sun, 21 Jul 2024 12:58:40 -0700 Subject: [PATCH 4/6] Code review suggestions --- src/Ryujinx.Graphics.GAL/PolygonModeMask.cs | 1 + .../Engine/Threed/StateUpdater.cs | 16 +++++++--------- src/Ryujinx.Graphics.OpenGL/Pipeline.cs | 2 +- src/Ryujinx.Graphics.Vulkan/PipelineBase.cs | 6 +++--- src/Ryujinx.Graphics.Vulkan/PipelineState.cs | 8 ++++++-- 5 files changed, 18 insertions(+), 15 deletions(-) diff --git a/src/Ryujinx.Graphics.GAL/PolygonModeMask.cs b/src/Ryujinx.Graphics.GAL/PolygonModeMask.cs index c6ac45099b..f9588e4fb7 100644 --- a/src/Ryujinx.Graphics.GAL/PolygonModeMask.cs +++ b/src/Ryujinx.Graphics.GAL/PolygonModeMask.cs @@ -5,6 +5,7 @@ namespace Ryujinx.Graphics.GAL [Flags] public enum PolygonModeMask { + None = 0, Point = 1 << 0, Line = 1 << 1, Fill = 1 << 2, diff --git a/src/Ryujinx.Graphics.Gpu/Engine/Threed/StateUpdater.cs b/src/Ryujinx.Graphics.Gpu/Engine/Threed/StateUpdater.cs index 1cdb09895f..ffb70c1dad 100644 --- a/src/Ryujinx.Graphics.Gpu/Engine/Threed/StateUpdater.cs +++ b/src/Ryujinx.Graphics.Gpu/Engine/Threed/StateUpdater.cs @@ -841,16 +841,14 @@ namespace Ryujinx.Graphics.Gpu.Engine.Threed /// private void UpdateDepthBiasState() { - if (_pipeline.BiasEnable == 0 && (_state.State.DepthBiasFactor == 0 && _state.State.DepthBiasUnits == 0)) + if (_state.State.DepthBiasFactor == 0 && _state.State.DepthBiasUnits == 0) { - return; - } - else if (_pipeline.BiasEnable != 0 && - (_state.State.DepthBiasFactor == 0 && _state.State.DepthBiasUnits == 0)) - { - _pipeline.BiasEnable = 0; + if (_pipeline.BiasEnable != PolygonModeMask.None) + { + _pipeline.BiasEnable = PolygonModeMask.None; - _context.Renderer.Pipeline.SetDepthBias(0, 0, 0, 0); + _context.Renderer.Pipeline.SetDepthBias(PolygonModeMask.None, 0, 0, 0); + } return; } @@ -861,7 +859,7 @@ namespace Ryujinx.Graphics.Gpu.Engine.Threed float units = _state.State.DepthBiasUnits; float clamp = _state.State.DepthBiasClamp; - PolygonModeMask enables = 0; + PolygonModeMask enables = PolygonModeMask.None; if (factor != 0 && units != 0) { diff --git a/src/Ryujinx.Graphics.OpenGL/Pipeline.cs b/src/Ryujinx.Graphics.OpenGL/Pipeline.cs index f04cdd7624..c86cb95f35 100644 --- a/src/Ryujinx.Graphics.OpenGL/Pipeline.cs +++ b/src/Ryujinx.Graphics.OpenGL/Pipeline.cs @@ -833,7 +833,7 @@ namespace Ryujinx.Graphics.OpenGL public void SetDepthBias(PolygonModeMask enables, float factor, float units, float clamp) { - if (enables == 0 || (factor == 0 && units == 0)) + if (enables == PolygonModeMask.None || (factor == 0 && units == 0)) { GL.Disable(EnableCap.PolygonOffsetPoint); GL.Disable(EnableCap.PolygonOffsetLine); diff --git a/src/Ryujinx.Graphics.Vulkan/PipelineBase.cs b/src/Ryujinx.Graphics.Vulkan/PipelineBase.cs index a25f7faf3b..275ec92285 100644 --- a/src/Ryujinx.Graphics.Vulkan/PipelineBase.cs +++ b/src/Ryujinx.Graphics.Vulkan/PipelineBase.cs @@ -787,14 +787,14 @@ namespace Ryujinx.Graphics.Vulkan public void SetDepthBias(PolygonModeMask enables, float factor, float units, float clamp) { - bool depthBiasEnable = (enables != 0) && (factor != 0 && units != 0); - bool changed = false; - if (factor == 0 && units == 0 && !_newState.DepthBiasEnable) { return; } + bool depthBiasEnable = (enables != PolygonModeMask.None) && (factor != 0 && units != 0); + bool changed = false; + if (_newState.DepthBiasEnable != depthBiasEnable) { _newState.DepthBiasEnable = depthBiasEnable; diff --git a/src/Ryujinx.Graphics.Vulkan/PipelineState.cs b/src/Ryujinx.Graphics.Vulkan/PipelineState.cs index 8373c97375..cfb7ef3619 100644 --- a/src/Ryujinx.Graphics.Vulkan/PipelineState.cs +++ b/src/Ryujinx.Graphics.Vulkan/PipelineState.cs @@ -564,7 +564,9 @@ namespace Ryujinx.Graphics.Vulkan } bool supportsExtDynamicState = gd.Capabilities.SupportsExtendedDynamicState; + int dynamicStatesCount = supportsExtDynamicState ? 7 : 6; + if (DepthBiasEnable) { dynamicStatesCount++; @@ -579,14 +581,16 @@ namespace Ryujinx.Graphics.Vulkan dynamicStates[4] = DynamicState.StencilReference; dynamicStates[5] = DynamicState.BlendConstants; + dynamicStatesCount = 6; + if (DepthBiasEnable) { - dynamicStates[6] = DynamicState.DepthBias; + dynamicStates[dynamicStatesCount++] = DynamicState.DepthBias; } if (supportsExtDynamicState) { - dynamicStates[dynamicStatesCount - 1] = DynamicState.VertexInputBindingStrideExt; + dynamicStates[dynamicStatesCount++] = DynamicState.VertexInputBindingStrideExt; } var pipelineDynamicStateCreateInfo = new PipelineDynamicStateCreateInfo From 48ad342ee94b46caedcfaf7f3b8a6b0a28a3533c Mon Sep 17 00:00:00 2001 From: sunshineinabox Date: Sun, 21 Jul 2024 14:22:15 -0700 Subject: [PATCH 5/6] Resolve two validation errors that were created by changes 1. One stating that the bound pipeline is identical to the previous with a dynamic state that was previously static (DepthBias) which might cause issues in non Vulkan SDK 1.3 conformant drivers. 2. DynamicState command is sent without current pipeline having the dynamic state enabled. --- src/Ryujinx.Graphics.Vulkan/PipelineBase.cs | 12 +++++------- src/Ryujinx.Graphics.Vulkan/PipelineState.cs | 17 +++-------------- 2 files changed, 8 insertions(+), 21 deletions(-) diff --git a/src/Ryujinx.Graphics.Vulkan/PipelineBase.cs b/src/Ryujinx.Graphics.Vulkan/PipelineBase.cs index 275ec92285..795a1f2ea3 100644 --- a/src/Ryujinx.Graphics.Vulkan/PipelineBase.cs +++ b/src/Ryujinx.Graphics.Vulkan/PipelineBase.cs @@ -793,24 +793,22 @@ namespace Ryujinx.Graphics.Vulkan } bool depthBiasEnable = (enables != PolygonModeMask.None) && (factor != 0 && units != 0); - bool changed = false; if (_newState.DepthBiasEnable != depthBiasEnable) { _newState.DepthBiasEnable = depthBiasEnable; - changed = true; } if (depthBiasEnable) { DynamicState.SetDepthBias(factor, units, clamp); - changed = true; + } + else + { + DynamicState.SetDepthBias(0, 0, 0); } - if (changed) - { - SignalStateChange(); - } + SignalStateChange(); } public void SetDepthClamp(bool clamp) diff --git a/src/Ryujinx.Graphics.Vulkan/PipelineState.cs b/src/Ryujinx.Graphics.Vulkan/PipelineState.cs index cfb7ef3619..12c0e2bee0 100644 --- a/src/Ryujinx.Graphics.Vulkan/PipelineState.cs +++ b/src/Ryujinx.Graphics.Vulkan/PipelineState.cs @@ -565,12 +565,7 @@ namespace Ryujinx.Graphics.Vulkan bool supportsExtDynamicState = gd.Capabilities.SupportsExtendedDynamicState; - int dynamicStatesCount = supportsExtDynamicState ? 7 : 6; - - if (DepthBiasEnable) - { - dynamicStatesCount++; - } + int dynamicStatesCount = supportsExtDynamicState ? 8 : 7; DynamicState* dynamicStates = stackalloc DynamicState[dynamicStatesCount]; @@ -580,17 +575,11 @@ namespace Ryujinx.Graphics.Vulkan dynamicStates[3] = DynamicState.StencilWriteMask; dynamicStates[4] = DynamicState.StencilReference; dynamicStates[5] = DynamicState.BlendConstants; - - dynamicStatesCount = 6; - - if (DepthBiasEnable) - { - dynamicStates[dynamicStatesCount++] = DynamicState.DepthBias; - } + dynamicStates[6] = DynamicState.DepthBias; if (supportsExtDynamicState) { - dynamicStates[dynamicStatesCount++] = DynamicState.VertexInputBindingStrideExt; + dynamicStates[7] = DynamicState.VertexInputBindingStrideExt; } var pipelineDynamicStateCreateInfo = new PipelineDynamicStateCreateInfo From ab9025286dad99900ec885a9436b0635fe93b8d5 Mon Sep 17 00:00:00 2001 From: sunshineinabox Date: Sun, 21 Jul 2024 15:59:04 -0700 Subject: [PATCH 6/6] Partially revert previous commit as no need to set depthbias dynamically if depthbias is not enabled. --- src/Ryujinx.Graphics.Vulkan/PipelineBase.cs | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/Ryujinx.Graphics.Vulkan/PipelineBase.cs b/src/Ryujinx.Graphics.Vulkan/PipelineBase.cs index 795a1f2ea3..275ec92285 100644 --- a/src/Ryujinx.Graphics.Vulkan/PipelineBase.cs +++ b/src/Ryujinx.Graphics.Vulkan/PipelineBase.cs @@ -793,22 +793,24 @@ namespace Ryujinx.Graphics.Vulkan } bool depthBiasEnable = (enables != PolygonModeMask.None) && (factor != 0 && units != 0); + bool changed = false; if (_newState.DepthBiasEnable != depthBiasEnable) { _newState.DepthBiasEnable = depthBiasEnable; + changed = true; } if (depthBiasEnable) { DynamicState.SetDepthBias(factor, units, clamp); - } - else - { - DynamicState.SetDepthBias(0, 0, 0); + changed = true; } - SignalStateChange(); + if (changed) + { + SignalStateChange(); + } } public void SetDepthClamp(bool clamp)