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 cbf1bc3a2..71f99fc0b 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 ef227d4a5..67eccb34c 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 cf3f5d6c1..cb009c75d 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 0c46fbda2..1fa380327 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 000000000..176da6f39 --- /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 edd79d8a0..45ae679ce 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 1dc77b52d..569481d8c 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 54f6b3f7b..1dcafd718 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 bda6167d7..b664980a7 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 2a8f93081..8373c9737 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 569481d8c..c4388fe96 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 1dcafd718..fb277f94a 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 b664980a7..04d877a0c 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 71f99fc0b..cbf1bc3a2 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 67eccb34c..ef227d4a5 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 cb009c75d..cf3f5d6c1 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 1fa380327..0c46fbda2 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 176da6f39..000000000 --- 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 45ae679ce..edd79d8a0 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 c4388fe96..1cdb09895 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 fb277f94a..f04cdd762 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 04d877a0c..a25f7faf3 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 c6ac45099..f9588e4fb 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 1cdb09895..ffb70c1da 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 f04cdd762..c86cb95f3 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 a25f7faf3..275ec9228 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 8373c9737..cfb7ef361 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 275ec9228..795a1f2ea 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 cfb7ef361..12c0e2bee 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 795a1f2ea..275ec9228 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)