aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBaronKiko <BaronKiko@users.noreply.github.com>2019-02-01 01:37:07 +0000
committergdkchan <gab.dark.100@gmail.com>2019-01-31 22:37:07 -0300
commitf5b4f6ccc4815cfac1fa3c103d8941a26d152d8a (patch)
treed36fec808ddc5bab09466f79b1b172a9946d61d4
parentd191b256a6a1ce457e8bc33826fe4142e5d3de3f (diff)
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
-rw-r--r--Ryujinx.Graphics/Gal/OpenGL/OGLPipeline.cs23
-rw-r--r--Ryujinx.Graphics/Gal/OpenGL/OGLRenderTarget.cs3
-rw-r--r--Ryujinx.Graphics/Graphics3d/NvGpuEngine3d.cs8
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;
+ }
}
}
}