TextureBuffer.cs 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. using OpenTK.Graphics.OpenGL;
  2. using Ryujinx.Graphics.GAL;
  3. using System;
  4. namespace Ryujinx.Graphics.OpenGL.Image
  5. {
  6. class TextureBuffer : TextureBase, ITexture
  7. {
  8. private Renderer _renderer;
  9. private int _bufferOffset;
  10. private int _bufferSize;
  11. private int _bufferCount;
  12. private BufferHandle _buffer;
  13. public TextureBuffer(Renderer renderer, TextureCreateInfo info) : base(info)
  14. {
  15. _renderer = renderer;
  16. }
  17. public void CopyTo(ITexture destination, int firstLayer, int firstLevel)
  18. {
  19. throw new NotSupportedException();
  20. }
  21. public void CopyTo(ITexture destination, int srcLayer, int dstLayer, int srcLevel, int dstLevel)
  22. {
  23. throw new NotSupportedException();
  24. }
  25. public void CopyTo(ITexture destination, Extents2D srcRegion, Extents2D dstRegion, bool linearFilter)
  26. {
  27. throw new NotSupportedException();
  28. }
  29. public ITexture CreateView(TextureCreateInfo info, int firstLayer, int firstLevel)
  30. {
  31. throw new NotSupportedException();
  32. }
  33. public ReadOnlySpan<byte> GetData()
  34. {
  35. return Buffer.GetData(_renderer, _buffer, _bufferOffset, _bufferSize);
  36. }
  37. public void SetData(ReadOnlySpan<byte> data)
  38. {
  39. Buffer.SetData(_buffer, _bufferOffset, data.Slice(0, Math.Min(data.Length, _bufferSize)));
  40. }
  41. public void SetData(ReadOnlySpan<byte> data, int layer, int level)
  42. {
  43. throw new NotSupportedException();
  44. }
  45. public void SetStorage(BufferRange buffer)
  46. {
  47. if (_buffer != BufferHandle.Null &&
  48. _buffer == buffer.Handle &&
  49. buffer.Offset == _bufferOffset &&
  50. buffer.Size == _bufferSize &&
  51. _renderer.BufferCount == _bufferCount)
  52. {
  53. // Only rebind the buffer when more have been created.
  54. return;
  55. }
  56. _buffer = buffer.Handle;
  57. _bufferOffset = buffer.Offset;
  58. _bufferSize = buffer.Size;
  59. _bufferCount = _renderer.BufferCount;
  60. Bind(0);
  61. SizedInternalFormat format = (SizedInternalFormat)FormatTable.GetFormatInfo(Info.Format).PixelInternalFormat;
  62. GL.TexBufferRange(TextureBufferTarget.TextureBuffer, format, _buffer.ToInt32(), (IntPtr)buffer.Offset, buffer.Size);
  63. }
  64. public void Dispose()
  65. {
  66. if (Handle != 0)
  67. {
  68. GL.DeleteTexture(Handle);
  69. Handle = 0;
  70. }
  71. }
  72. public void Release()
  73. {
  74. Dispose();
  75. }
  76. }
  77. }