Buffer.cs 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. using OpenTK.Graphics.OpenGL;
  2. using Ryujinx.Graphics.GAL;
  3. using System;
  4. namespace Ryujinx.Graphics.OpenGL
  5. {
  6. static class Buffer
  7. {
  8. public static BufferHandle Create(int size)
  9. {
  10. int handle = GL.GenBuffer();
  11. GL.BindBuffer(BufferTarget.CopyWriteBuffer, handle);
  12. GL.BufferData(BufferTarget.CopyWriteBuffer, size, IntPtr.Zero, BufferUsageHint.DynamicDraw);
  13. return Handle.FromInt32<BufferHandle>(handle);
  14. }
  15. public static void Copy(BufferHandle source, BufferHandle destination, int srcOffset, int dstOffset, int size)
  16. {
  17. GL.BindBuffer(BufferTarget.CopyReadBuffer, source.ToInt32());
  18. GL.BindBuffer(BufferTarget.CopyWriteBuffer, destination.ToInt32());
  19. GL.CopyBufferSubData(
  20. BufferTarget.CopyReadBuffer,
  21. BufferTarget.CopyWriteBuffer,
  22. (IntPtr)srcOffset,
  23. (IntPtr)dstOffset,
  24. (IntPtr)size);
  25. }
  26. public static byte[] GetData(BufferHandle buffer, int offset, int size)
  27. {
  28. GL.BindBuffer(BufferTarget.CopyReadBuffer, buffer.ToInt32());
  29. byte[] data = new byte[size];
  30. GL.GetBufferSubData(BufferTarget.CopyReadBuffer, (IntPtr)offset, size, data);
  31. return data;
  32. }
  33. public static void SetData(BufferHandle buffer, int offset, ReadOnlySpan<byte> data)
  34. {
  35. GL.BindBuffer(BufferTarget.CopyWriteBuffer, buffer.ToInt32());
  36. unsafe
  37. {
  38. fixed (byte* ptr = data)
  39. {
  40. GL.BufferSubData(BufferTarget.CopyWriteBuffer, (IntPtr)offset, data.Length, (IntPtr)ptr);
  41. }
  42. }
  43. }
  44. public static void Delete(BufferHandle buffer)
  45. {
  46. GL.DeleteBuffer(buffer.ToInt32());
  47. }
  48. }
  49. }