TextureBuffer.cs 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. using Ryujinx.Common.Memory;
  2. using Ryujinx.Graphics.GAL;
  3. using SharpMetal.Metal;
  4. using System;
  5. using System.Runtime.Versioning;
  6. namespace Ryujinx.Graphics.Metal
  7. {
  8. [SupportedOSPlatform("macos")]
  9. class TextureBuffer : TextureBase, ITexture
  10. {
  11. private MTLTextureDescriptor _descriptor;
  12. private BufferHandle _bufferHandle;
  13. private int _offset;
  14. private int _size;
  15. private int _bufferCount;
  16. private Auto<DisposableBuffer> _buffer;
  17. public TextureBuffer(MTLDevice device, MetalRenderer renderer, Pipeline pipeline, TextureCreateInfo info) : base(device, renderer, pipeline, info)
  18. {
  19. MTLPixelFormat pixelFormat = FormatTable.GetFormat(Info.Format);
  20. _descriptor = new MTLTextureDescriptor
  21. {
  22. PixelFormat = pixelFormat,
  23. Usage = MTLTextureUsage.Unknown,
  24. TextureType = MTLTextureType.TextureBuffer,
  25. Width = (ulong)Info.Width,
  26. Height = (ulong)Info.Height,
  27. };
  28. MtlFormat = pixelFormat;
  29. }
  30. public void RebuildStorage(bool write)
  31. {
  32. if (MtlTexture != IntPtr.Zero)
  33. {
  34. MtlTexture.Dispose();
  35. }
  36. if (_buffer == null)
  37. {
  38. MtlTexture = default;
  39. }
  40. else
  41. {
  42. DisposableBuffer buffer = _buffer.Get(Pipeline.Cbs, _offset, _size, write);
  43. _descriptor.Width = (uint)(_size / Info.BytesPerPixel);
  44. MtlTexture = buffer.Value.NewTexture(_descriptor, (ulong)_offset, (ulong)_size);
  45. }
  46. }
  47. public void CopyTo(ITexture destination, int firstLayer, int firstLevel)
  48. {
  49. throw new NotSupportedException();
  50. }
  51. public void CopyTo(ITexture destination, int srcLayer, int dstLayer, int srcLevel, int dstLevel)
  52. {
  53. throw new NotSupportedException();
  54. }
  55. public void CopyTo(ITexture destination, Extents2D srcRegion, Extents2D dstRegion, bool linearFilter)
  56. {
  57. throw new NotSupportedException();
  58. }
  59. public ITexture CreateView(TextureCreateInfo info, int firstLayer, int firstLevel)
  60. {
  61. throw new NotSupportedException();
  62. }
  63. public PinnedSpan<byte> GetData()
  64. {
  65. return Renderer.GetBufferData(_bufferHandle, _offset, _size);
  66. }
  67. public PinnedSpan<byte> GetData(int layer, int level)
  68. {
  69. return GetData();
  70. }
  71. public void CopyTo(BufferRange range, int layer, int level, int stride)
  72. {
  73. throw new NotImplementedException();
  74. }
  75. public void SetData(MemoryOwner<byte> data)
  76. {
  77. Renderer.SetBufferData(_bufferHandle, _offset, data.Memory.Span);
  78. data.Dispose();
  79. }
  80. public void SetData(MemoryOwner<byte> data, int layer, int level)
  81. {
  82. throw new NotSupportedException();
  83. }
  84. public void SetData(MemoryOwner<byte> data, int layer, int level, Rectangle<int> region)
  85. {
  86. throw new NotSupportedException();
  87. }
  88. public void SetStorage(BufferRange buffer)
  89. {
  90. if (_bufferHandle == buffer.Handle &&
  91. _offset == buffer.Offset &&
  92. _size == buffer.Size &&
  93. _bufferCount == Renderer.BufferManager.BufferCount)
  94. {
  95. return;
  96. }
  97. _bufferHandle = buffer.Handle;
  98. _offset = buffer.Offset;
  99. _size = buffer.Size;
  100. _bufferCount = Renderer.BufferManager.BufferCount;
  101. _buffer = Renderer.BufferManager.GetBuffer(_bufferHandle, false);
  102. }
  103. public override void Release()
  104. {
  105. _descriptor.Dispose();
  106. base.Release();
  107. }
  108. }
  109. }