From 8766378ce8f68acbfbcffe97ea4a29e9aebcf520 Mon Sep 17 00:00:00 2001 From: Isaac Marovitz Date: Sat, 10 Aug 2024 21:07:20 +0100 Subject: [PATCH] Rasterizer Discard + Multisample State --- src/Ryujinx.Graphics.Metal/EncoderStateManager.cs | 15 +++++++++++++++ src/Ryujinx.Graphics.Metal/Pipeline.cs | 4 ++-- src/Ryujinx.Graphics.Metal/State/PipelineState.cs | 9 +++------ 3 files changed, 20 insertions(+), 8 deletions(-) diff --git a/src/Ryujinx.Graphics.Metal/EncoderStateManager.cs b/src/Ryujinx.Graphics.Metal/EncoderStateManager.cs index e50438a10..a417f950a 100644 --- a/src/Ryujinx.Graphics.Metal/EncoderStateManager.cs +++ b/src/Ryujinx.Graphics.Metal/EncoderStateManager.cs @@ -399,6 +399,13 @@ namespace Ryujinx.Graphics.Metal } } + public readonly void UpdateRasterizerDiscard(bool discard) + { + _currentState.Pipeline.RasterizerDiscardEnable = discard; + + SignalDirty(DirtyFlags.RenderPipeline); + } + public readonly void UpdateRenderTargets(ITexture[] colors, ITexture depthStencil) { _currentState.FramebufferUsingColorWriteMask = false; @@ -656,6 +663,14 @@ namespace Ryujinx.Graphics.Metal SignalDirty(DirtyFlags.DepthBias); } + public readonly void UpdateMultisampleState(MultisampleDescriptor multisample) + { + _currentState.Pipeline.AlphaToCoverageEnable = multisample.AlphaToCoverageEnable; + _currentState.Pipeline.AlphaToOneEnable = multisample.AlphaToOneEnable; + + SignalDirty(DirtyFlags.RenderPipeline); + } + public void UpdateScissors(ReadOnlySpan> regions) { for (int i = 0; i < regions.Length; i++) diff --git a/src/Ryujinx.Graphics.Metal/Pipeline.cs b/src/Ryujinx.Graphics.Metal/Pipeline.cs index 87306abcf..70a6e7c2d 100644 --- a/src/Ryujinx.Graphics.Metal/Pipeline.cs +++ b/src/Ryujinx.Graphics.Metal/Pipeline.cs @@ -597,7 +597,7 @@ namespace Ryujinx.Graphics.Metal public void SetMultisampleState(MultisampleDescriptor multisample) { - Logger.Warning?.Print(LogClass.Gpu, "Not Implemented!"); + _encoderStateManager.UpdateMultisampleState(multisample); } public void SetPatchParameters(int vertices, ReadOnlySpan defaultOuterLevel, ReadOnlySpan defaultInnerLevel) @@ -638,7 +638,7 @@ namespace Ryujinx.Graphics.Metal public void SetRasterizerDiscard(bool discard) { - Logger.Warning?.Print(LogClass.Gpu, "Not Implemented!"); + _encoderStateManager.UpdateRasterizerDiscard(discard); } public void SetRenderTargetColorMasks(ReadOnlySpan componentMask) diff --git a/src/Ryujinx.Graphics.Metal/State/PipelineState.cs b/src/Ryujinx.Graphics.Metal/State/PipelineState.cs index fa6d5410b..425b9a977 100644 --- a/src/Ryujinx.Graphics.Metal/State/PipelineState.cs +++ b/src/Ryujinx.Graphics.Metal/State/PipelineState.cs @@ -208,12 +208,9 @@ namespace Ryujinx.Graphics.Metal } } - /* TODO: enable when sharpmetal fixes the bindings - renderPipelineDescriptor.AlphaToCoverageEnabled = AlphaToCoverageEnable; - renderPipelineDescriptor.AlphaToOneEnabled = AlphaToOneEnable; - renderPipelineDescriptor.RasterizationEnabled = !RasterizerDiscardEnable; - */ - + renderPipelineDescriptor.SetAlphaToCoverageEnabled(AlphaToCoverageEnable); + renderPipelineDescriptor.SetAlphaToOneEnabled(AlphaToOneEnable); + renderPipelineDescriptor.SetRasterizationEnabled(!RasterizerDiscardEnable); renderPipelineDescriptor.SampleCount = Math.Max(1, SamplesCount); var vertexDescriptor = BuildVertexDescriptor();