Buffer.cs 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. using OpenTK.Graphics.OpenGL;
  2. using Ryujinx.Graphics.GAL;
  3. using System;
  4. namespace Ryujinx.Graphics.OpenGL
  5. {
  6. class Buffer : IBuffer
  7. {
  8. public int Handle { get; }
  9. public Buffer(int size)
  10. {
  11. Handle = GL.GenBuffer();
  12. GL.BindBuffer(BufferTarget.CopyWriteBuffer, Handle);
  13. GL.BufferData(BufferTarget.CopyWriteBuffer, size, IntPtr.Zero, BufferUsageHint.DynamicDraw);
  14. }
  15. public void CopyTo(IBuffer destination, int srcOffset, int dstOffset, int size)
  16. {
  17. GL.BindBuffer(BufferTarget.CopyReadBuffer, Handle);
  18. GL.BindBuffer(BufferTarget.CopyWriteBuffer, ((Buffer)destination).Handle);
  19. GL.CopyBufferSubData(
  20. BufferTarget.CopyReadBuffer,
  21. BufferTarget.CopyWriteBuffer,
  22. (IntPtr)srcOffset,
  23. (IntPtr)dstOffset,
  24. (IntPtr)size);
  25. }
  26. public byte[] GetData(int offset, int size)
  27. {
  28. GL.BindBuffer(BufferTarget.CopyReadBuffer, Handle);
  29. byte[] data = new byte[size];
  30. GL.GetBufferSubData(BufferTarget.CopyReadBuffer, (IntPtr)offset, size, data);
  31. return data;
  32. }
  33. public void SetData(Span<byte> data)
  34. {
  35. unsafe
  36. {
  37. GL.BindBuffer(BufferTarget.CopyWriteBuffer, Handle);
  38. fixed (byte* ptr = data)
  39. {
  40. GL.BufferData(BufferTarget.CopyWriteBuffer, data.Length, (IntPtr)ptr, BufferUsageHint.DynamicDraw);
  41. }
  42. }
  43. }
  44. public void SetData(int offset, Span<byte> data)
  45. {
  46. GL.BindBuffer(BufferTarget.CopyWriteBuffer, Handle);
  47. unsafe
  48. {
  49. fixed (byte* ptr = data)
  50. {
  51. GL.BufferSubData(BufferTarget.CopyWriteBuffer, (IntPtr)offset, data.Length, (IntPtr)ptr);
  52. }
  53. }
  54. }
  55. public void Dispose()
  56. {
  57. GL.DeleteBuffer(Handle);
  58. }
  59. }
  60. }