diff --git a/Ryujinx.Graphics/Gal/IGalPipeline.cs b/Ryujinx.Graphics/Gal/IGalPipeline.cs index cba4e7dcc6..cb470fb4b4 100644 --- a/Ryujinx.Graphics/Gal/IGalPipeline.cs +++ b/Ryujinx.Graphics/Gal/IGalPipeline.cs @@ -3,6 +3,7 @@ public interface IGalPipeline { void Bind(GalPipelineState State); + void Unbind(GalPipelineState State); void ResetDepthMask(); void ResetColorMask(int Index); diff --git a/Ryujinx.Graphics/Gal/OpenGL/OGLPipeline.cs b/Ryujinx.Graphics/Gal/OpenGL/OGLPipeline.cs index affb19f8b0..0716eaf6de 100644 --- a/Ryujinx.Graphics/Gal/OpenGL/OGLPipeline.cs +++ b/Ryujinx.Graphics/Gal/OpenGL/OGLPipeline.cs @@ -383,6 +383,14 @@ namespace Ryujinx.Graphics.Gal.OpenGL Old = New; } + public void Unbind(GalPipelineState State) + { + if (State.ScissorTestCount > 0) + { + GL.Disable(EnableCap.ScissorTest); + } + } + private void SetAllBlendState(BlendState New) { Enable(EnableCap.Blend, New.Enabled); diff --git a/Ryujinx.Graphics/Gal/OpenGL/OGLRenderTarget.cs b/Ryujinx.Graphics/Gal/OpenGL/OGLRenderTarget.cs index 0d7bb3cd0a..ce5364e154 100644 --- a/Ryujinx.Graphics/Gal/OpenGL/OGLRenderTarget.cs +++ b/Ryujinx.Graphics/Gal/OpenGL/OGLRenderTarget.cs @@ -367,9 +367,6 @@ namespace Ryujinx.Graphics.Gal.OpenGL GL.Disable(EnableCap.FramebufferSrgb); - // Will be re-enabled if needed while binding, called before any game GL calls - GL.Disable(EnableCap.ScissorTest); - GL.BlitFramebuffer( SrcX0, SrcY0, diff --git a/Ryujinx.Graphics/Graphics3d/NvGpuEngine3d.cs b/Ryujinx.Graphics/Graphics3d/NvGpuEngine3d.cs index a7a2f9d6cf..20d9c95a82 100644 --- a/Ryujinx.Graphics/Graphics3d/NvGpuEngine3d.cs +++ b/Ryujinx.Graphics/Graphics3d/NvGpuEngine3d.cs @@ -1074,6 +1074,9 @@ namespace Ryujinx.Graphics.Graphics3d Gpu.Renderer.Rasterizer.DrawArrays(VertexFirst, VertexCount, PrimType); } + // Reset pipeline for host OpenGL calls + Gpu.Renderer.Pipeline.Unbind(State); + //Is the GPU really clearing those registers after draw? WriteRegister(NvGpuEngine3dReg.IndexBatchFirst, 0); WriteRegister(NvGpuEngine3dReg.IndexBatchCount, 0);