This commit is contained in:
sunshineinabox 2024-09-18 20:44:04 -05:00 committed by GitHub
commit 8568119e27
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
5 changed files with 59 additions and 17 deletions

View File

@ -5,6 +5,7 @@ namespace Ryujinx.Graphics.GAL
[Flags] [Flags]
public enum PolygonModeMask public enum PolygonModeMask
{ {
None = 0,
Point = 1 << 0, Point = 1 << 0,
Line = 1 << 1, Line = 1 << 1,
Fill = 1 << 2, Fill = 1 << 2,

View File

@ -841,19 +841,35 @@ namespace Ryujinx.Graphics.Gpu.Engine.Threed
/// </summary> /// </summary>
private void UpdateDepthBiasState() private void UpdateDepthBiasState()
{ {
if (_state.State.DepthBiasFactor == 0 && _state.State.DepthBiasUnits == 0)
{
if (_pipeline.BiasEnable != PolygonModeMask.None)
{
_pipeline.BiasEnable = PolygonModeMask.None;
_context.Renderer.Pipeline.SetDepthBias(PolygonModeMask.None, 0, 0, 0);
}
return;
}
var depthBias = _state.State.DepthBiasState; var depthBias = _state.State.DepthBiasState;
float factor = _state.State.DepthBiasFactor; float factor = _state.State.DepthBiasFactor;
float units = _state.State.DepthBiasUnits; float units = _state.State.DepthBiasUnits;
float clamp = _state.State.DepthBiasClamp; float clamp = _state.State.DepthBiasClamp;
PolygonModeMask enables; PolygonModeMask enables = PolygonModeMask.None;
enables = (depthBias.PointEnable ? PolygonModeMask.Point : 0); if (factor != 0 && units != 0)
enables |= (depthBias.LineEnable ? PolygonModeMask.Line : 0); {
enables |= (depthBias.FillEnable ? PolygonModeMask.Fill : 0); enables = (depthBias.PointEnable ? PolygonModeMask.Point : 0);
enables |= (depthBias.LineEnable ? PolygonModeMask.Line : 0);
enables |= (depthBias.FillEnable ? PolygonModeMask.Fill : 0);
}
_pipeline.BiasEnable = enables; _pipeline.BiasEnable = enables;
_context.Renderer.Pipeline.SetDepthBias(enables, factor, units / 2f, clamp); _context.Renderer.Pipeline.SetDepthBias(enables, factor, units / 2f, clamp);
} }

View File

@ -833,6 +833,15 @@ namespace Ryujinx.Graphics.OpenGL
public void SetDepthBias(PolygonModeMask enables, float factor, float units, float clamp) public void SetDepthBias(PolygonModeMask enables, float factor, float units, float clamp)
{ {
if (enables == PolygonModeMask.None || (factor == 0 && units == 0))
{
GL.Disable(EnableCap.PolygonOffsetPoint);
GL.Disable(EnableCap.PolygonOffsetLine);
GL.Disable(EnableCap.PolygonOffsetFill);
return;
}
if ((enables & PolygonModeMask.Point) != 0) if ((enables & PolygonModeMask.Point) != 0)
{ {
GL.Enable(EnableCap.PolygonOffsetPoint); GL.Enable(EnableCap.PolygonOffsetPoint);
@ -860,11 +869,6 @@ namespace Ryujinx.Graphics.OpenGL
GL.Disable(EnableCap.PolygonOffsetFill); GL.Disable(EnableCap.PolygonOffsetFill);
} }
if (enables == 0)
{
return;
}
if (HwCapabilities.SupportsPolygonOffsetClamp) if (HwCapabilities.SupportsPolygonOffsetClamp)
{ {
GL.PolygonOffsetClamp(factor, units, clamp); GL.PolygonOffsetClamp(factor, units, clamp);

View File

@ -792,10 +792,30 @@ 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)
{ {
DynamicState.SetDepthBias(factor, units, clamp); if (factor == 0 && units == 0 && !_newState.DepthBiasEnable)
{
return;
}
_newState.DepthBiasEnable = enables != 0; bool depthBiasEnable = (enables != PolygonModeMask.None) && (factor != 0 && units != 0);
SignalStateChange(); bool changed = false;
if (_newState.DepthBiasEnable != depthBiasEnable)
{
_newState.DepthBiasEnable = depthBiasEnable;
changed = true;
}
if (depthBiasEnable)
{
DynamicState.SetDepthBias(factor, units, clamp);
changed = true;
}
if (changed)
{
SignalStateChange();
}
} }
public void SetDepthClamp(bool clamp) public void SetDepthClamp(bool clamp)

View File

@ -571,6 +571,7 @@ namespace Ryujinx.Graphics.Vulkan
} }
bool supportsExtDynamicState = gd.Capabilities.SupportsExtendedDynamicState; bool supportsExtDynamicState = gd.Capabilities.SupportsExtendedDynamicState;
bool supportsFeedbackLoopDynamicState = gd.Capabilities.SupportsDynamicAttachmentFeedbackLoop; bool supportsFeedbackLoopDynamicState = gd.Capabilities.SupportsDynamicAttachmentFeedbackLoop;
DynamicState* dynamicStates = stackalloc DynamicState[MaxDynamicStatesCount]; DynamicState* dynamicStates = stackalloc DynamicState[MaxDynamicStatesCount];
@ -579,11 +580,11 @@ namespace Ryujinx.Graphics.Vulkan
dynamicStates[0] = DynamicState.Viewport; dynamicStates[0] = DynamicState.Viewport;
dynamicStates[1] = DynamicState.Scissor; dynamicStates[1] = DynamicState.Scissor;
dynamicStates[2] = DynamicState.DepthBias; dynamicStates[2] = DynamicState.StencilCompareMask;
dynamicStates[3] = DynamicState.StencilCompareMask; dynamicStates[3] = DynamicState.StencilWriteMask;
dynamicStates[4] = DynamicState.StencilWriteMask; dynamicStates[4] = DynamicState.StencilReference;
dynamicStates[5] = DynamicState.StencilReference; dynamicStates[5] = DynamicState.BlendConstants;
dynamicStates[6] = DynamicState.BlendConstants; dynamicStates[6] = DynamicState.DepthBias;
if (supportsExtDynamicState) if (supportsExtDynamicState)
{ {