aboutsummaryrefslogtreecommitdiff
path: root/Ryujinx.Graphics.OpenGL
diff options
context:
space:
mode:
authormageven <62494521+mageven@users.noreply.github.com>2020-04-07 14:49:45 +0530
committerGitHub <noreply@github.com>2020-04-07 19:19:45 +1000
commit468d8f841ffcbebf4130371eb64ab04165bce3e9 (patch)
treecc3dd0cf370f7ae3d80720a4324baf954560a8d4 /Ryujinx.Graphics.OpenGL
parente99e6d0ad1fb0e0245469a67526de2dc03bc0658 (diff)
Simple GPU fixes (#1093)
* Implement RasterizeEnable * Match viewport count to hardware * Simplify ScissorTest tracking around Blits * Disable RasterizerDiscard around Blits and track its state * Read RasterizeEnable reg as bool and add doc
Diffstat (limited to 'Ryujinx.Graphics.OpenGL')
-rw-r--r--Ryujinx.Graphics.OpenGL/Pipeline.cs43
-rw-r--r--Ryujinx.Graphics.OpenGL/TextureCopy.cs6
-rw-r--r--Ryujinx.Graphics.OpenGL/Window.cs6
3 files changed, 41 insertions, 14 deletions
diff --git a/Ryujinx.Graphics.OpenGL/Pipeline.cs b/Ryujinx.Graphics.OpenGL/Pipeline.cs
index 3480cf82..aef3383b 100644
--- a/Ryujinx.Graphics.OpenGL/Pipeline.cs
+++ b/Ryujinx.Graphics.OpenGL/Pipeline.cs
@@ -10,6 +10,8 @@ namespace Ryujinx.Graphics.OpenGL
{
private Program _program;
+ private bool _rasterizerDiscard;
+
private VertexArray _vertexArray;
private Framebuffer _framebuffer;
@@ -31,14 +33,13 @@ namespace Ryujinx.Graphics.OpenGL
private uint[] _componentMasks;
- private readonly bool[] _scissorEnable;
+ private bool _scissor0Enable = false;
internal Pipeline()
{
+ _rasterizerDiscard = false;
_clipOrigin = ClipOrigin.LowerLeft;
_clipDepthMode = ClipDepthMode.NegativeOneToOne;
-
- _scissorEnable = new bool[8];
}
public void Barrier()
@@ -644,6 +645,20 @@ namespace Ryujinx.Graphics.OpenGL
_program.Bind();
}
+ public void SetRasterizerDiscard(bool discard)
+ {
+ if (discard)
+ {
+ GL.Enable(EnableCap.RasterizerDiscard);
+ }
+ else
+ {
+ GL.Disable(EnableCap.RasterizerDiscard);
+ }
+
+ _rasterizerDiscard = discard;
+ }
+
public void SetRenderTargetColorMasks(uint[] componentMasks)
{
_componentMasks = (uint[])componentMasks.Clone();
@@ -697,7 +712,10 @@ namespace Ryujinx.Graphics.OpenGL
GL.Disable(IndexedEnableCap.ScissorTest, index);
}
- _scissorEnable[index] = enable;
+ if (index == 0)
+ {
+ _scissor0Enable = enable;
+ }
}
public void SetScissor(int index, int x, int y, int width, int height)
@@ -959,14 +977,19 @@ namespace Ryujinx.Graphics.OpenGL
}
}
- public void RestoreScissorEnable()
+ public void RestoreScissor0Enable()
{
- for (int index = 0; index < 8; index++)
+ if (_scissor0Enable)
{
- if (_scissorEnable[index])
- {
- GL.Enable(IndexedEnableCap.ScissorTest, index);
- }
+ GL.Enable(IndexedEnableCap.ScissorTest, 0);
+ }
+ }
+
+ public void RestoreRasterizerDiscard()
+ {
+ if (_rasterizerDiscard)
+ {
+ GL.Enable(EnableCap.RasterizerDiscard);
}
}
diff --git a/Ryujinx.Graphics.OpenGL/TextureCopy.cs b/Ryujinx.Graphics.OpenGL/TextureCopy.cs
index ac9459d4..59db94a4 100644
--- a/Ryujinx.Graphics.OpenGL/TextureCopy.cs
+++ b/Ryujinx.Graphics.OpenGL/TextureCopy.cs
@@ -41,7 +41,8 @@ namespace Ryujinx.Graphics.OpenGL
GL.ReadBuffer(ReadBufferMode.ColorAttachment0);
GL.DrawBuffer(DrawBufferMode.ColorAttachment0);
- GL.Disable(EnableCap.ScissorTest);
+ GL.Disable(EnableCap.RasterizerDiscard);
+ GL.Disable(IndexedEnableCap.ScissorTest, 0);
GL.BlitFramebuffer(
srcRegion.X1,
@@ -58,7 +59,8 @@ namespace Ryujinx.Graphics.OpenGL
GL.BindFramebuffer(FramebufferTarget.ReadFramebuffer, oldReadFramebufferHandle);
GL.BindFramebuffer(FramebufferTarget.DrawFramebuffer, oldDrawFramebufferHandle);
- ((Pipeline)_renderer.Pipeline).RestoreScissorEnable();
+ ((Pipeline)_renderer.Pipeline).RestoreScissor0Enable();
+ ((Pipeline)_renderer.Pipeline).RestoreRasterizerDiscard();
}
private static void Attach(FramebufferTarget target, Format format, int handle)
diff --git a/Ryujinx.Graphics.OpenGL/Window.cs b/Ryujinx.Graphics.OpenGL/Window.cs
index c9b7daeb..9f0007c4 100644
--- a/Ryujinx.Graphics.OpenGL/Window.cs
+++ b/Ryujinx.Graphics.OpenGL/Window.cs
@@ -59,7 +59,8 @@ namespace Ryujinx.Graphics.OpenGL
GL.ReadBuffer(ReadBufferMode.ColorAttachment0);
- GL.Disable(EnableCap.ScissorTest);
+ GL.Disable(EnableCap.RasterizerDiscard);
+ GL.Disable(IndexedEnableCap.ScissorTest, 0);
GL.Clear(ClearBufferMask.ColorBufferBit);
@@ -126,7 +127,8 @@ namespace Ryujinx.Graphics.OpenGL
GL.BindFramebuffer(FramebufferTarget.ReadFramebuffer, oldReadFramebufferHandle);
GL.BindFramebuffer(FramebufferTarget.DrawFramebuffer, oldDrawFramebufferHandle);
- ((Pipeline)_renderer.Pipeline).RestoreScissorEnable();
+ ((Pipeline)_renderer.Pipeline).RestoreScissor0Enable();
+ ((Pipeline)_renderer.Pipeline).RestoreRasterizerDiscard();
}
private int GetCopyFramebufferHandleLazy()