Pārlūkot izejas kodu

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
gdkchan 4 gadi atpakaļ
vecāks
revīzija
ef39b2ebdd
1 mainītis faili ar 16 papildinājumiem un 1 dzēšanām
  1. 16 1
      Ryujinx.Graphics.Gpu/Engine/Threed/StateUpdater.cs

+ 16 - 1
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)
                     {