diff options
Diffstat (limited to 'Ryujinx.Graphics.OpenGL/Image')
-rw-r--r-- | Ryujinx.Graphics.OpenGL/Image/TextureBuffer.cs | 11 | ||||
-rw-r--r-- | Ryujinx.Graphics.OpenGL/Image/TextureView.cs | 27 |
2 files changed, 24 insertions, 14 deletions
diff --git a/Ryujinx.Graphics.OpenGL/Image/TextureBuffer.cs b/Ryujinx.Graphics.OpenGL/Image/TextureBuffer.cs index e46d5c48..76d0149b 100644 --- a/Ryujinx.Graphics.OpenGL/Image/TextureBuffer.cs +++ b/Ryujinx.Graphics.OpenGL/Image/TextureBuffer.cs @@ -1,4 +1,5 @@ using OpenTK.Graphics.OpenGL; +using Ryujinx.Common.Memory; using Ryujinx.Graphics.GAL; using System; @@ -48,17 +49,19 @@ namespace Ryujinx.Graphics.OpenGL.Image return GetData(); } - public void SetData(ReadOnlySpan<byte> data) + public void SetData(SpanOrArray<byte> data) { - Buffer.SetData(_buffer, _bufferOffset, data.Slice(0, Math.Min(data.Length, _bufferSize))); + var dataSpan = data.AsSpan(); + + Buffer.SetData(_buffer, _bufferOffset, dataSpan.Slice(0, Math.Min(dataSpan.Length, _bufferSize))); } - public void SetData(ReadOnlySpan<byte> data, int layer, int level) + public void SetData(SpanOrArray<byte> data, int layer, int level) { throw new NotSupportedException(); } - public void SetData(ReadOnlySpan<byte> data, int layer, int level, Rectangle<int> region) + public void SetData(SpanOrArray<byte> data, int layer, int level, Rectangle<int> region) { throw new NotSupportedException(); } diff --git a/Ryujinx.Graphics.OpenGL/Image/TextureView.cs b/Ryujinx.Graphics.OpenGL/Image/TextureView.cs index f17243d2..3e7da6e3 100644 --- a/Ryujinx.Graphics.OpenGL/Image/TextureView.cs +++ b/Ryujinx.Graphics.OpenGL/Image/TextureView.cs @@ -1,5 +1,6 @@ using OpenTK.Graphics.OpenGL; using Ryujinx.Common; +using Ryujinx.Common.Memory; using Ryujinx.Graphics.GAL; using System; @@ -317,32 +318,36 @@ namespace Ryujinx.Graphics.OpenGL.Image } } - public void SetData(ReadOnlySpan<byte> data) + public void SetData(SpanOrArray<byte> data) { + var dataSpan = data.AsSpan(); + if (Format == Format.S8UintD24Unorm) { - data = FormatConverter.ConvertS8D24ToD24S8(data); + dataSpan = FormatConverter.ConvertS8D24ToD24S8(dataSpan); } unsafe { - fixed (byte* ptr = data) + fixed (byte* ptr = dataSpan) { - ReadFrom((IntPtr)ptr, data.Length); + ReadFrom((IntPtr)ptr, dataSpan.Length); } } } - public void SetData(ReadOnlySpan<byte> data, int layer, int level) + public void SetData(SpanOrArray<byte> data, int layer, int level) { + var dataSpan = data.AsSpan(); + if (Format == Format.S8UintD24Unorm) { - data = FormatConverter.ConvertS8D24ToD24S8(data); + dataSpan = FormatConverter.ConvertS8D24ToD24S8(dataSpan); } unsafe { - fixed (byte* ptr = data) + fixed (byte* ptr = dataSpan) { int width = Math.Max(Info.Width >> level, 1); int height = Math.Max(Info.Height >> level, 1); @@ -352,11 +357,13 @@ namespace Ryujinx.Graphics.OpenGL.Image } } - public void SetData(ReadOnlySpan<byte> data, int layer, int level, Rectangle<int> region) + public void SetData(SpanOrArray<byte> data, int layer, int level, Rectangle<int> region) { + var dataSpan = data.AsSpan(); + if (Format == Format.S8UintD24Unorm) { - data = FormatConverter.ConvertS8D24ToD24S8(data); + dataSpan = FormatConverter.ConvertS8D24ToD24S8(dataSpan); } int wInBlocks = BitUtils.DivRoundUp(region.Width, Info.BlockWidth); @@ -364,7 +371,7 @@ namespace Ryujinx.Graphics.OpenGL.Image unsafe { - fixed (byte* ptr = data) + fixed (byte* ptr = dataSpan) { ReadFrom2D( (IntPtr)ptr, |