From f5b4f6ccc4815cfac1fa3c103d8941a26d152d8a Mon Sep 17 00:00:00 2001 From: BaronKiko Date: Fri, 1 Feb 2019 01:37:07 +0000 Subject: [PATCH] Scissor test fix (#563) * Handle negative viewport coordinates * Disable scissor before framebuffer blit * Comment to explain scissor disable will be reenabled if needed * Comma and spelling mistake --- Ryujinx.Graphics/Gal/OpenGL/OGLPipeline.cs | 23 ++++++++----------- .../Gal/OpenGL/OGLRenderTarget.cs | 3 +++ Ryujinx.Graphics/Graphics3d/NvGpuEngine3d.cs | 8 ++++++- 3 files changed, 20 insertions(+), 14 deletions(-) diff --git a/Ryujinx.Graphics/Gal/OpenGL/OGLPipeline.cs b/Ryujinx.Graphics/Gal/OpenGL/OGLPipeline.cs index e9143c19..deccd890 100644 --- a/Ryujinx.Graphics/Gal/OpenGL/OGLPipeline.cs +++ b/Ryujinx.Graphics/Gal/OpenGL/OGLPipeline.cs @@ -278,25 +278,22 @@ namespace Ryujinx.Graphics.Gal.OpenGL { forceUpdate = false; - if (New.ScissorTestEnabled[Index] != Old.ScissorTestEnabled[Index]) + if (New.ScissorTestEnabled[Index]) { - if (New.ScissorTestEnabled[Index]) + // If there is only 1 scissor test, geometry shaders are disabled so the scissor test applies to all viewports + if (New.ScissorTestCount == 1) { - // If there is only 1 scissor test geometry shaders are disables so the scissor test applies to all viewports - if (New.ScissorTestCount == 1) - { - GL.Enable(EnableCap.ScissorTest); - } - else - { - GL.Enable(IndexedEnableCap.ScissorTest, Index); - } - forceUpdate = true; + GL.Enable(EnableCap.ScissorTest); } else { - GL.Disable(IndexedEnableCap.ScissorTest, Index); + GL.Enable(IndexedEnableCap.ScissorTest, Index); } + forceUpdate = true; + } + else + { + GL.Disable(IndexedEnableCap.ScissorTest, Index); } if (New.ScissorTestEnabled[Index] && diff --git a/Ryujinx.Graphics/Gal/OpenGL/OGLRenderTarget.cs b/Ryujinx.Graphics/Gal/OpenGL/OGLRenderTarget.cs index ce5364e1..0d7bb3cd 100644 --- a/Ryujinx.Graphics/Gal/OpenGL/OGLRenderTarget.cs +++ b/Ryujinx.Graphics/Gal/OpenGL/OGLRenderTarget.cs @@ -367,6 +367,9 @@ 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 7de76cce..749f5fdc 100644 --- a/Ryujinx.Graphics/Graphics3d/NvGpuEngine3d.cs +++ b/Ryujinx.Graphics/Graphics3d/NvGpuEngine3d.cs @@ -419,7 +419,7 @@ namespace Ryujinx.Graphics.Graphics3d // Once geometry shaders are fixed it should be equal to GalPipelineState.RenderTargetCount when shader loaded, otherwise equal to 1 State.ScissorTestCount = 1; - for (int Index = 0; Index < GalPipelineState.RenderTargetsCount; Index++) + for (int Index = 0; Index < State.ScissorTestCount; Index++) { State.ScissorTestEnabled[Index] = ReadRegisterBool(NvGpuEngine3dReg.ScissorEnable + Index * 4); @@ -438,6 +438,12 @@ namespace Ryujinx.Graphics.Graphics3d if ((int)State.FlipY == -1) { State.ScissorTestY[Index] = ViewportHeight - State.ScissorTestY[Index] - State.ScissorTestHeight[Index]; + + // Handle negative viewpont coordinate + if (State.ScissorTestY[Index] < 0) + { + State.ScissorTestY[Index] = 0; + } } } }