diff options
author | gdkchan <gab.dark.100@gmail.com> | 2020-05-23 06:46:09 -0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-05-23 11:46:09 +0200 |
commit | 5011640b3086b86b0f0b39b60fdb2aa946d4f5c8 (patch) | |
tree | 1bd60b7714886dfe282ca1e52cfa6fca97912cdf /Ryujinx.Graphics.OpenGL/Image/TextureBuffer.cs | |
parent | cc8dbdd3fb58a02e1c3fc3b9d0b1c35bc7b9d00f (diff) |
Spanify Graphics Abstraction Layer (#1226)
* Spanify Graphics Abstraction Layer
* Be explicit about BufferHandle size
Diffstat (limited to 'Ryujinx.Graphics.OpenGL/Image/TextureBuffer.cs')
-rw-r--r-- | Ryujinx.Graphics.OpenGL/Image/TextureBuffer.cs | 71 |
1 files changed, 71 insertions, 0 deletions
diff --git a/Ryujinx.Graphics.OpenGL/Image/TextureBuffer.cs b/Ryujinx.Graphics.OpenGL/Image/TextureBuffer.cs new file mode 100644 index 00000000..2c69571c --- /dev/null +++ b/Ryujinx.Graphics.OpenGL/Image/TextureBuffer.cs @@ -0,0 +1,71 @@ +using OpenTK.Graphics.OpenGL; +using Ryujinx.Graphics.GAL; +using System; + +namespace Ryujinx.Graphics.OpenGL.Image +{ + class TextureBuffer : TextureBase, ITexture + { + private int _bufferOffset; + private int _bufferSize; + + private BufferHandle _buffer; + + public TextureBuffer(TextureCreateInfo info) : base(info) {} + + public void CopyTo(ITexture destination, int firstLayer, int firstLevel) + { + throw new NotSupportedException(); + } + + public void CopyTo(ITexture destination, Extents2D srcRegion, Extents2D dstRegion, bool linearFilter) + { + throw new NotSupportedException(); + } + + public ITexture CreateView(TextureCreateInfo info, int firstLayer, int firstLevel) + { + throw new NotSupportedException(); + } + + public byte[] GetData() + { + return Buffer.GetData(_buffer, _bufferOffset, _bufferSize); + } + + public void SetData(ReadOnlySpan<byte> data) + { + Buffer.SetData(_buffer, _bufferOffset, data.Slice(0, Math.Min(data.Length, _bufferSize))); + } + + public void SetStorage(BufferRange buffer) + { + if (buffer.Handle == _buffer && + buffer.Offset == _bufferOffset && + buffer.Size == _bufferSize) + { + return; + } + + _buffer = buffer.Handle; + _bufferOffset = buffer.Offset; + _bufferSize = buffer.Size; + + Bind(0); + + SizedInternalFormat format = (SizedInternalFormat)FormatTable.GetFormatInfo(Info.Format).PixelInternalFormat; + + GL.TexBufferRange(TextureBufferTarget.TextureBuffer, format, _buffer.ToInt32(), (IntPtr)buffer.Offset, buffer.Size); + } + + public void Dispose() + { + if (Handle != 0) + { + GL.DeleteTexture(Handle); + + Handle = 0; + } + } + } +} |