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
This commit is contained in:
BaronKiko 2019-02-01 01:37:07 +00:00 committed by gdkchan
parent d191b256a6
commit f5b4f6ccc4
3 changed files with 20 additions and 14 deletions

View File

@ -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] &&

View File

@ -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,

View File

@ -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;
}
}
}
}