TextureBuffer.cs 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  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 byte[] GetData()
  34. {
  35. return Buffer.GetData(_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.Offset == _bufferOffset &&
  49. buffer.Size == _bufferSize &&
  50. _renderer.BufferCount == _bufferCount)
  51. {
  52. // Only rebind the buffer when more have been created.
  53. return;
  54. }
  55. _buffer = buffer.Handle;
  56. _bufferOffset = buffer.Offset;
  57. _bufferSize = buffer.Size;
  58. _bufferCount = _renderer.BufferCount;
  59. Bind(0);
  60. SizedInternalFormat format = (SizedInternalFormat)FormatTable.GetFormatInfo(Info.Format).PixelInternalFormat;
  61. GL.TexBufferRange(TextureBufferTarget.TextureBuffer, format, _buffer.ToInt32(), (IntPtr)buffer.Offset, buffer.Size);
  62. }
  63. public void Dispose()
  64. {
  65. if (Handle != 0)
  66. {
  67. GL.DeleteTexture(Handle);
  68. Handle = 0;
  69. }
  70. }
  71. public void Release()
  72. {
  73. Dispose();
  74. }
  75. }
  76. }