aboutsummaryrefslogtreecommitdiff
path: root/Ryujinx.Graphics.OpenGL/Buffer.cs
diff options
context:
space:
mode:
Diffstat (limited to 'Ryujinx.Graphics.OpenGL/Buffer.cs')
-rw-r--r--Ryujinx.Graphics.OpenGL/Buffer.cs74
1 files changed, 74 insertions, 0 deletions
diff --git a/Ryujinx.Graphics.OpenGL/Buffer.cs b/Ryujinx.Graphics.OpenGL/Buffer.cs
new file mode 100644
index 00000000..b86719ce
--- /dev/null
+++ b/Ryujinx.Graphics.OpenGL/Buffer.cs
@@ -0,0 +1,74 @@
+using OpenTK.Graphics.OpenGL;
+using Ryujinx.Graphics.GAL;
+using System;
+
+namespace Ryujinx.Graphics.OpenGL
+{
+ class Buffer : IBuffer
+ {
+ public int Handle { get; }
+
+ public Buffer(int size)
+ {
+ Handle = GL.GenBuffer();
+
+ GL.BindBuffer(BufferTarget.CopyWriteBuffer, Handle);
+ GL.BufferData(BufferTarget.CopyWriteBuffer, size, IntPtr.Zero, BufferUsageHint.DynamicDraw);
+ }
+
+ public void CopyTo(IBuffer destination, int srcOffset, int dstOffset, int size)
+ {
+ GL.BindBuffer(BufferTarget.CopyReadBuffer, Handle);
+ GL.BindBuffer(BufferTarget.CopyWriteBuffer, ((Buffer)destination).Handle);
+
+ GL.CopyBufferSubData(
+ BufferTarget.CopyReadBuffer,
+ BufferTarget.CopyWriteBuffer,
+ (IntPtr)srcOffset,
+ (IntPtr)dstOffset,
+ (IntPtr)size);
+ }
+
+ public byte[] GetData(int offset, int size)
+ {
+ GL.BindBuffer(BufferTarget.CopyReadBuffer, Handle);
+
+ byte[] data = new byte[size];
+
+ GL.GetBufferSubData(BufferTarget.CopyReadBuffer, (IntPtr)offset, size, data);
+
+ return data;
+ }
+
+ public void SetData(Span<byte> data)
+ {
+ unsafe
+ {
+ GL.BindBuffer(BufferTarget.CopyWriteBuffer, Handle);
+
+ fixed (byte* ptr = data)
+ {
+ GL.BufferData(BufferTarget.CopyWriteBuffer, data.Length, (IntPtr)ptr, BufferUsageHint.DynamicDraw);
+ }
+ }
+ }
+
+ public void SetData(int offset, Span<byte> data)
+ {
+ GL.BindBuffer(BufferTarget.CopyWriteBuffer, Handle);
+
+ unsafe
+ {
+ fixed (byte* ptr = data)
+ {
+ GL.BufferSubData(BufferTarget.CopyWriteBuffer, (IntPtr)offset, data.Length, (IntPtr)ptr);
+ }
+ }
+ }
+
+ public void Dispose()
+ {
+ GL.DeleteBuffer(Handle);
+ }
+ }
+}