From ef39b2ebddb3d0f4c1d50a8dbffc6c434591b2dc Mon Sep 17 00:00:00 2001
From: gdkchan <gab.dark.100@gmail.com>
Date: Tue, 28 Dec 2021 08:37:23 -0300
Subject: [PATCH] Flip scissor box when the YNegate bit is set (#2941)

* Flip scissor box when the YNegate bit is set

* Flip scissor based on screen scissor state, account for negative scissor Y

* No need for abs when we already know the value is negative
---
 .../Engine/Threed/StateUpdater.cs               | 17 ++++++++++++++++-
 1 file changed, 16 insertions(+), 1 deletion(-)

diff --git a/Ryujinx.Graphics.Gpu/Engine/Threed/StateUpdater.cs b/Ryujinx.Graphics.Gpu/Engine/Threed/StateUpdater.cs
index cf74f649e..9f6ee17ce 100644
--- a/Ryujinx.Graphics.Gpu/Engine/Threed/StateUpdater.cs
+++ b/Ryujinx.Graphics.Gpu/Engine/Threed/StateUpdater.cs
@@ -64,7 +64,10 @@ namespace Ryujinx.Graphics.Gpu.Engine.Threed
                     nameof(ThreedClassState.ShaderState)),
 
                 new StateUpdateCallbackEntry(UpdateRasterizerState, nameof(ThreedClassState.RasterizeEnable)),
-                new StateUpdateCallbackEntry(UpdateScissorState, nameof(ThreedClassState.ScissorState)),
+
+                new StateUpdateCallbackEntry(UpdateScissorState,
+                    nameof(ThreedClassState.ScissorState),
+                    nameof(ThreedClassState.ScreenScissorState)),
 
                 new StateUpdateCallbackEntry(UpdateVertexBufferState,
                     nameof(ThreedClassState.VertexBufferDrawState),
@@ -426,6 +429,18 @@ namespace Ryujinx.Graphics.Gpu.Engine.Threed
                     int width = scissor.X2 - x;
                     int height = scissor.Y2 - y;
 
+                    if (_state.State.YControl.HasFlag(YControl.NegateY))
+                    {
+                        ref var screenScissor = ref _state.State.ScreenScissorState;
+                        y = screenScissor.Height - height - y;
+
+                        if (y < 0)
+                        {
+                            height += y;
+                            y = 0;
+                        }
+                    }
+
                     float scale = _channel.TextureManager.RenderTargetScale;
                     if (scale != 1f)
                     {