From 0cd5ba03fe4cccd232cdb6aa7e8648b4a08a0ab1 Mon Sep 17 00:00:00 2001 From: BaronKiko Date: Sun, 13 Jan 2019 21:26:42 +0000 Subject: =?UTF-8?q?Scissor=20test=20implementation.=20Partially=20stubbed?= =?UTF-8?q?=20until=20geometry=20shaders=E2=80=A6=20(#556)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Scissor test implementation. Partially stubbed until geometry shaders are fixed * Apply to all viewports when geometry shaders are disabled. * Also apply enable cap to all viewports when geometry shaders are disabled * Added fixme as per suggestion Co-Authored-By: BaronKiko * Apparently no alignment needed here. * Comment on new line * Correct height calculation --- Ryujinx.Graphics/Gal/OpenGL/OGLPipeline.cs | 51 ++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) (limited to 'Ryujinx.Graphics/Gal/OpenGL') diff --git a/Ryujinx.Graphics/Gal/OpenGL/OGLPipeline.cs b/Ryujinx.Graphics/Gal/OpenGL/OGLPipeline.cs index eb7f958b..e9143c19 100644 --- a/Ryujinx.Graphics/Gal/OpenGL/OGLPipeline.cs +++ b/Ryujinx.Graphics/Gal/OpenGL/OGLPipeline.cs @@ -270,6 +270,57 @@ namespace Ryujinx.Graphics.Gal.OpenGL } } + + // Scissor Test + bool forceUpdate; + + for (int Index = 0; Index < New.ScissorTestCount; Index++) + { + forceUpdate = false; + + if (New.ScissorTestEnabled[Index] != Old.ScissorTestEnabled[Index]) + { + if (New.ScissorTestEnabled[Index]) + { + // 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; + } + else + { + GL.Disable(IndexedEnableCap.ScissorTest, Index); + } + } + + if (New.ScissorTestEnabled[Index] && + (New.ScissorTestX[Index] != Old.ScissorTestX[Index] || + New.ScissorTestY[Index] != Old.ScissorTestY[Index] || + New.ScissorTestWidth[Index] != Old.ScissorTestWidth[Index] || + New.ScissorTestHeight[Index] != Old.ScissorTestHeight[Index] || + forceUpdate)) // Force update intentionally last to reduce if comparisons + { + // If there is only 1 scissor test geometry shaders are disables so the scissor test applies to all viewports + if (New.ScissorTestCount == 1) + { + GL.Scissor(New.ScissorTestX[Index], New.ScissorTestY[Index], + New.ScissorTestWidth[Index], New.ScissorTestHeight[Index]); + } + else + { + GL.ScissorIndexed(Index, New.ScissorTestX[Index], New.ScissorTestY[Index], + New.ScissorTestWidth[Index], New.ScissorTestHeight[Index]); + } + } + } + + if (New.BlendIndependent) { for (int Index = 0; Index < GalPipelineState.RenderTargetsCount; Index++) -- cgit v1.2.3