Avoid setting depth bias state when not needed.

This commit is contained in:
sunshineinabox 2024-07-04 23:35:40 -07:00
parent 086656b736
commit feb67dede6
2 changed files with 30 additions and 15 deletions

View file

@ -880,8 +880,17 @@ namespace Ryujinx.Graphics.Vulkan
public void SetDepthBias(PolygonModeMask enables, float factor, float units, float clamp) public void SetDepthBias(PolygonModeMask enables, float factor, float units, float clamp)
{ {
bool enable = enables != 0; bool enable = (enables != 0) && (factor > 0.0f || units > 0.0f);
DynamicState.SetDepthBias(factor, units, clamp, enable);
if (enable)
{
DynamicState.SetDepthBias(factor, units, clamp);
}
if (Gd.Capabilities.SupportsExtendedDynamicState2)
{
DynamicState.SetDepthBiasEnable(enable);
}
_newState.DepthBiasEnable = enable; _newState.DepthBiasEnable = enable;

View file

@ -77,9 +77,10 @@ namespace Ryujinx.Graphics.Vulkan
PatchControlPoints = 1 << 13, PatchControlPoints = 1 << 13,
PrimitiveRestart = 1 << 14, PrimitiveRestart = 1 << 14,
PrimitiveTopology = 1 << 15, PrimitiveTopology = 1 << 15,
DepthBiasEnable = 1 << 16,
Standard = Blend | DepthBias | Scissor | Stencil | Viewport | LineWidth, Standard = Blend | DepthBias | Scissor | Stencil | Viewport | LineWidth,
Extended = CullMode | FrontFace | DepthTestBool | DepthTestCompareOp | StencilTestEnableandStencilOp | PrimitiveTopology, Extended = CullMode | FrontFace | DepthTestBool | DepthTestCompareOp | StencilTestEnableandStencilOp | PrimitiveTopology,
Extended2 = RasterDiscard | LogicOp | PatchControlPoints | PrimitiveRestart, Extended2 = RasterDiscard | LogicOp | PatchControlPoints | PrimitiveRestart | DepthBiasEnable,
} }
private DirtyFlags _dirty; private DirtyFlags _dirty;
@ -93,16 +94,21 @@ namespace Ryujinx.Graphics.Vulkan
_dirty |= DirtyFlags.Blend; _dirty |= DirtyFlags.Blend;
} }
public void SetDepthBias(float slopeFactor, float constantFactor, float clamp, bool enable) public void SetDepthBias(float slopeFactor, float constantFactor, float clamp)
{ {
_depthBiasSlopeFactor = slopeFactor; _depthBiasSlopeFactor = slopeFactor;
_depthBiasConstantFactor = constantFactor; _depthBiasConstantFactor = constantFactor;
_depthBiasClamp = clamp; _depthBiasClamp = clamp;
_depthBiasEnable = enable;
_dirty |= DirtyFlags.DepthBias; _dirty |= DirtyFlags.DepthBias;
} }
public void SetDepthBiasEnable(bool enable)
{
_depthBiasEnable = enable;
_dirty |= DirtyFlags.DepthBiasEnable;
}
public void SetScissor(int index, Rect2D scissor) public void SetScissor(int index, Rect2D scissor)
{ {
_scissors[index] = scissor; _scissors[index] = scissor;
@ -299,6 +305,11 @@ namespace Ryujinx.Graphics.Vulkan
RecordDepthTestBool(gd.ExtendedDynamicStateApi, commandBuffer); RecordDepthTestBool(gd.ExtendedDynamicStateApi, commandBuffer);
} }
if (_dirty.HasFlag(DirtyFlags.DepthBiasEnable))
{
RecordDepthBiasEnable(gd.ExtendedDynamicState2Api, commandBuffer);
}
if (_dirty.HasFlag(DirtyFlags.DepthTestCompareOp)) if (_dirty.HasFlag(DirtyFlags.DepthTestCompareOp))
{ {
RecordDepthTestCompareOp(gd.ExtendedDynamicStateApi, commandBuffer); RecordDepthTestCompareOp(gd.ExtendedDynamicStateApi, commandBuffer);
@ -349,19 +360,14 @@ namespace Ryujinx.Graphics.Vulkan
private readonly void RecordDepthBias(VulkanRenderer gd, CommandBuffer commandBuffer) private readonly void RecordDepthBias(VulkanRenderer gd, CommandBuffer commandBuffer)
{ {
if (gd.Capabilities.SupportsExtendedDynamicState2)
{
gd.ExtendedDynamicState2Api.CmdSetDepthBiasEnable(commandBuffer, _depthBiasEnable);
if (!_depthBiasEnable)
{
return;
}
}
gd.Api.CmdSetDepthBias(commandBuffer, _depthBiasConstantFactor, _depthBiasClamp, _depthBiasSlopeFactor); gd.Api.CmdSetDepthBias(commandBuffer, _depthBiasConstantFactor, _depthBiasClamp, _depthBiasSlopeFactor);
} }
private readonly void RecordDepthBiasEnable(ExtExtendedDynamicState2 gd, CommandBuffer commandBuffer)
{
gd.CmdSetDepthBiasEnable(commandBuffer, _depthBiasEnable);
}
private void RecordScissor(VulkanRenderer gd, CommandBuffer commandBuffer) private void RecordScissor(VulkanRenderer gd, CommandBuffer commandBuffer)
{ {
if (ScissorsCount != 0) if (ScissorsCount != 0)