Implement GPU scissors (#1058)
* Implement GPU scissors * Remove unused using * Add missing changes for Clear
This commit is contained in:
@ -31,10 +31,14 @@ namespace Ryujinx.Graphics.OpenGL
|
||||
|
||||
private uint[] _componentMasks;
|
||||
|
||||
private readonly bool[] _scissorEnable;
|
||||
|
||||
internal Pipeline()
|
||||
{
|
||||
_clipOrigin = ClipOrigin.LowerLeft;
|
||||
_clipDepthMode = ClipDepthMode.NegativeOneToOne;
|
||||
|
||||
_scissorEnable = new bool[8];
|
||||
}
|
||||
|
||||
public void Barrier()
|
||||
@ -674,6 +678,25 @@ namespace Ryujinx.Graphics.OpenGL
|
||||
}
|
||||
}
|
||||
|
||||
public void SetScissorEnable(int index, bool enable)
|
||||
{
|
||||
if (enable)
|
||||
{
|
||||
GL.Enable(IndexedEnableCap.ScissorTest, index);
|
||||
}
|
||||
else
|
||||
{
|
||||
GL.Disable(IndexedEnableCap.ScissorTest, index);
|
||||
}
|
||||
|
||||
_scissorEnable[index] = enable;
|
||||
}
|
||||
|
||||
public void SetScissor(int index, int x, int y, int width, int height)
|
||||
{
|
||||
GL.ScissorIndexed(index, x, y, width, height);
|
||||
}
|
||||
|
||||
public void SetStencilTest(StencilTestDescriptor stencilTest)
|
||||
{
|
||||
if (!stencilTest.TestEnable)
|
||||
@ -928,6 +951,17 @@ namespace Ryujinx.Graphics.OpenGL
|
||||
}
|
||||
}
|
||||
|
||||
public void RestoreScissorEnable()
|
||||
{
|
||||
for (int index = 0; index < 8; index++)
|
||||
{
|
||||
if (_scissorEnable[index])
|
||||
{
|
||||
GL.Enable(IndexedEnableCap.ScissorTest, index);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void Dispose()
|
||||
{
|
||||
_framebuffer?.Dispose();
|
||||
|
@ -7,7 +7,7 @@ namespace Ryujinx.Graphics.OpenGL
|
||||
{
|
||||
public sealed class Renderer : IRenderer
|
||||
{
|
||||
private Pipeline _pipeline;
|
||||
private readonly Pipeline _pipeline;
|
||||
|
||||
public IPipeline Pipeline => _pipeline;
|
||||
|
||||
@ -31,9 +31,9 @@ namespace Ryujinx.Graphics.OpenGL
|
||||
|
||||
_counters = new Counters();
|
||||
|
||||
_window = new Window();
|
||||
_window = new Window(this);
|
||||
|
||||
TextureCopy = new TextureCopy();
|
||||
TextureCopy = new TextureCopy(this);
|
||||
}
|
||||
|
||||
public IShader CompileShader(ShaderProgram shader)
|
||||
|
@ -6,9 +6,16 @@ namespace Ryujinx.Graphics.OpenGL
|
||||
{
|
||||
class TextureCopy : IDisposable
|
||||
{
|
||||
private readonly Renderer _renderer;
|
||||
|
||||
private int _srcFramebuffer;
|
||||
private int _dstFramebuffer;
|
||||
|
||||
public TextureCopy(Renderer renderer)
|
||||
{
|
||||
_renderer = renderer;
|
||||
}
|
||||
|
||||
public void Copy(
|
||||
TextureView src,
|
||||
TextureView dst,
|
||||
@ -34,6 +41,8 @@ namespace Ryujinx.Graphics.OpenGL
|
||||
GL.ReadBuffer(ReadBufferMode.ColorAttachment0);
|
||||
GL.DrawBuffer(DrawBufferMode.ColorAttachment0);
|
||||
|
||||
GL.Disable(EnableCap.ScissorTest);
|
||||
|
||||
GL.BlitFramebuffer(
|
||||
srcRegion.X1,
|
||||
srcRegion.Y1,
|
||||
@ -48,6 +57,8 @@ namespace Ryujinx.Graphics.OpenGL
|
||||
|
||||
GL.BindFramebuffer(FramebufferTarget.ReadFramebuffer, oldReadFramebufferHandle);
|
||||
GL.BindFramebuffer(FramebufferTarget.DrawFramebuffer, oldDrawFramebufferHandle);
|
||||
|
||||
((Pipeline)_renderer.Pipeline).RestoreScissorEnable();
|
||||
}
|
||||
|
||||
private static void Attach(FramebufferTarget target, Format format, int handle)
|
||||
|
@ -9,13 +9,17 @@ namespace Ryujinx.Graphics.OpenGL
|
||||
private const int NativeWidth = 1280;
|
||||
private const int NativeHeight = 720;
|
||||
|
||||
private readonly Renderer _renderer;
|
||||
|
||||
private int _width;
|
||||
private int _height;
|
||||
|
||||
private int _copyFramebufferHandle;
|
||||
|
||||
public Window()
|
||||
public Window(Renderer renderer)
|
||||
{
|
||||
_renderer = renderer;
|
||||
|
||||
_width = NativeWidth;
|
||||
_height = NativeHeight;
|
||||
}
|
||||
@ -35,13 +39,13 @@ namespace Ryujinx.Graphics.OpenGL
|
||||
_height = height;
|
||||
}
|
||||
|
||||
|
||||
private void CopyTextureToFrameBufferRGB(int drawFramebuffer, int readFramebuffer, TextureView view, ImageCrop crop)
|
||||
{
|
||||
bool[] oldFramebufferColorWritemask = new bool[4];
|
||||
|
||||
int oldReadFramebufferHandle = GL.GetInteger(GetPName.ReadFramebufferBinding);
|
||||
int oldDrawFramebufferHandle = GL.GetInteger(GetPName.DrawFramebufferBinding);
|
||||
|
||||
GL.GetBoolean(GetIndexedPName.ColorWritemask, drawFramebuffer, oldFramebufferColorWritemask);
|
||||
|
||||
GL.BindFramebuffer(FramebufferTarget.DrawFramebuffer, drawFramebuffer);
|
||||
@ -55,6 +59,8 @@ namespace Ryujinx.Graphics.OpenGL
|
||||
|
||||
GL.ReadBuffer(ReadBufferMode.ColorAttachment0);
|
||||
|
||||
GL.Disable(EnableCap.ScissorTest);
|
||||
|
||||
GL.Clear(ClearBufferMask.ColorBufferBit);
|
||||
|
||||
int srcX0, srcX1, srcY0, srcY1;
|
||||
@ -119,6 +125,8 @@ namespace Ryujinx.Graphics.OpenGL
|
||||
|
||||
GL.BindFramebuffer(FramebufferTarget.ReadFramebuffer, oldReadFramebufferHandle);
|
||||
GL.BindFramebuffer(FramebufferTarget.DrawFramebuffer, oldDrawFramebufferHandle);
|
||||
|
||||
((Pipeline)_renderer.Pipeline).RestoreScissorEnable();
|
||||
}
|
||||
|
||||
private int GetCopyFramebufferHandleLazy()
|
||||
|
Reference in New Issue
Block a user