Implement clear buffer (fast path) (#1902)

* Implement clear buffer (fast path)

* Remove blank line
This commit is contained in:
gdkchan
2021-01-12 18:50:54 -03:00
committed by GitHub
parent 68f6b79fd3
commit df820a72de
8 changed files with 125 additions and 5 deletions

View File

@ -6,6 +6,27 @@ namespace Ryujinx.Graphics.OpenGL
{
static class Buffer
{
public static void Clear(BufferHandle destination, int offset, int size, uint value)
{
GL.BindBuffer(BufferTarget.CopyWriteBuffer, destination.ToInt32());
unsafe
{
uint* valueArr = stackalloc uint[1];
valueArr[0] = value;
GL.ClearBufferSubData(
BufferTarget.CopyWriteBuffer,
PixelInternalFormat.Rgba8ui,
(IntPtr)offset,
(IntPtr)size,
PixelFormat.RgbaInteger,
PixelType.UnsignedByte,
(IntPtr)valueArr);
}
}
public static BufferHandle Create()
{
return Handle.FromInt32<BufferHandle>(GL.GenBuffer());

View File

@ -91,6 +91,11 @@ namespace Ryujinx.Graphics.OpenGL
_tfEnabled = true;
}
public void ClearBuffer(BufferHandle destination, int offset, int size, uint value)
{
Buffer.Clear(destination, offset, size, value);
}
public void ClearRenderTargetColor(int index, uint componentMask, ColorF color)
{
GL.ColorMask(
@ -102,7 +107,7 @@ namespace Ryujinx.Graphics.OpenGL
float[] colors = new float[] { color.Red, color.Green, color.Blue, color.Alpha };
GL.ClearBuffer(ClearBuffer.Color, index, colors);
GL.ClearBuffer(OpenTK.Graphics.OpenGL.ClearBuffer.Color, index, colors);
RestoreComponentMask(index);
@ -133,11 +138,11 @@ namespace Ryujinx.Graphics.OpenGL
}
else if (depthMask)
{
GL.ClearBuffer(ClearBuffer.Depth, 0, ref depthValue);
GL.ClearBuffer(OpenTK.Graphics.OpenGL.ClearBuffer.Depth, 0, ref depthValue);
}
else if (stencilMask != 0)
{
GL.ClearBuffer(ClearBuffer.Stencil, 0, ref stencilValue);
GL.ClearBuffer(OpenTK.Graphics.OpenGL.ClearBuffer.Stencil, 0, ref stencilValue);
}
if (stencilMaskChanged)