TextureBuffer.cs 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  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 OpenGLRenderer _renderer;
  9. private int _bufferOffset;
  10. private int _bufferSize;
  11. private int _bufferCount;
  12. private BufferHandle _buffer;
  13. public TextureBuffer(OpenGLRenderer 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 SetData(ReadOnlySpan<byte> data, int layer, int level, Rectangle<int> region)
  50. {
  51. throw new NotSupportedException();
  52. }
  53. public void SetStorage(BufferRange buffer)
  54. {
  55. if (_buffer != BufferHandle.Null &&
  56. _buffer == buffer.Handle &&
  57. buffer.Offset == _bufferOffset &&
  58. buffer.Size == _bufferSize &&
  59. _renderer.BufferCount == _bufferCount)
  60. {
  61. // Only rebind the buffer when more have been created.
  62. return;
  63. }
  64. _buffer = buffer.Handle;
  65. _bufferOffset = buffer.Offset;
  66. _bufferSize = buffer.Size;
  67. _bufferCount = _renderer.BufferCount;
  68. Bind(0);
  69. SizedInternalFormat format = (SizedInternalFormat)FormatTable.GetFormatInfo(Info.Format).PixelInternalFormat;
  70. GL.TexBufferRange(TextureBufferTarget.TextureBuffer, format, _buffer.ToInt32(), (IntPtr)buffer.Offset, buffer.Size);
  71. }
  72. public void Dispose()
  73. {
  74. if (Handle != 0)
  75. {
  76. GL.DeleteTexture(Handle);
  77. Handle = 0;
  78. }
  79. }
  80. public void Release()
  81. {
  82. Dispose();
  83. }
  84. }
  85. }