TextureBuffer.cs 3.1 KB

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