TextureBuffer.cs 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  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 ReadOnlySpan<byte> GetData(int layer, int level)
  38. {
  39. return GetData();
  40. }
  41. public void SetData(ReadOnlySpan<byte> data)
  42. {
  43. Buffer.SetData(_buffer, _bufferOffset, data.Slice(0, Math.Min(data.Length, _bufferSize)));
  44. }
  45. public void SetData(ReadOnlySpan<byte> data, int layer, int level)
  46. {
  47. throw new NotSupportedException();
  48. }
  49. public void SetStorage(BufferRange buffer)
  50. {
  51. if (_buffer != BufferHandle.Null &&
  52. _buffer == buffer.Handle &&
  53. buffer.Offset == _bufferOffset &&
  54. buffer.Size == _bufferSize &&
  55. _renderer.BufferCount == _bufferCount)
  56. {
  57. // Only rebind the buffer when more have been created.
  58. return;
  59. }
  60. _buffer = buffer.Handle;
  61. _bufferOffset = buffer.Offset;
  62. _bufferSize = buffer.Size;
  63. _bufferCount = _renderer.BufferCount;
  64. Bind(0);
  65. SizedInternalFormat format = (SizedInternalFormat)FormatTable.GetFormatInfo(Info.Format).PixelInternalFormat;
  66. GL.TexBufferRange(TextureBufferTarget.TextureBuffer, format, _buffer.ToInt32(), (IntPtr)buffer.Offset, buffer.Size);
  67. }
  68. public void Dispose()
  69. {
  70. if (Handle != 0)
  71. {
  72. GL.DeleteTexture(Handle);
  73. Handle = 0;
  74. }
  75. }
  76. public void Release()
  77. {
  78. Dispose();
  79. }
  80. }
  81. }