Fix invalid depth stencil state when no depth stencil is present

Partially fixes Sonic Frontiers and Castlevania Dominus Collection
This commit is contained in:
Isaac Marovitz 2024-09-05 13:18:48 +02:00 committed by Isaac Marovitz
parent 6b2bc16dc3
commit ce23bff285

View file

@ -21,6 +21,7 @@ namespace Ryujinx.Graphics.Metal
private readonly BufferManager _bufferManager; private readonly BufferManager _bufferManager;
private readonly DepthStencilCache _depthStencilCache; private readonly DepthStencilCache _depthStencilCache;
private readonly MTLDepthStencilState _defaultState;
private readonly EncoderState _mainState = new(); private readonly EncoderState _mainState = new();
private EncoderState _currentState; private EncoderState _currentState;
@ -44,6 +45,8 @@ namespace Ryujinx.Graphics.Metal
_depthStencilCache = new(device); _depthStencilCache = new(device);
_currentState = _mainState; _currentState = _mainState;
_defaultState = _depthStencilCache.GetOrCreate(_currentState.DepthStencilUid);
// Zero buffer // Zero buffer
byte[] zeros = new byte[ZeroBufferSize]; byte[] zeros = new byte[ZeroBufferSize];
fixed (byte* ptr = zeros) fixed (byte* ptr = zeros)
@ -951,11 +954,18 @@ namespace Ryujinx.Graphics.Metal
} }
private readonly void SetDepthStencilState(MTLRenderCommandEncoder renderCommandEncoder) private readonly void SetDepthStencilState(MTLRenderCommandEncoder renderCommandEncoder)
{
if (DepthStencil != null)
{ {
MTLDepthStencilState state = _depthStencilCache.GetOrCreate(_currentState.DepthStencilUid); MTLDepthStencilState state = _depthStencilCache.GetOrCreate(_currentState.DepthStencilUid);
renderCommandEncoder.SetDepthStencilState(state); renderCommandEncoder.SetDepthStencilState(state);
} }
else
{
renderCommandEncoder.SetDepthStencilState(_defaultState);
}
}
private readonly void SetDepthClamp(MTLRenderCommandEncoder renderCommandEncoder) private readonly void SetDepthClamp(MTLRenderCommandEncoder renderCommandEncoder)
{ {