aboutsummaryrefslogtreecommitdiff
path: root/Ryujinx.Graphics.OpenGL
diff options
context:
space:
mode:
Diffstat (limited to 'Ryujinx.Graphics.OpenGL')
-rw-r--r--Ryujinx.Graphics.OpenGL/Buffer.cs17
-rw-r--r--Ryujinx.Graphics.OpenGL/Image/TextureBuffer.cs4
-rw-r--r--Ryujinx.Graphics.OpenGL/Image/TextureView.cs14
-rw-r--r--Ryujinx.Graphics.OpenGL/PersistentBuffers.cs32
-rw-r--r--Ryujinx.Graphics.OpenGL/Renderer.cs11
5 files changed, 40 insertions, 38 deletions
diff --git a/Ryujinx.Graphics.OpenGL/Buffer.cs b/Ryujinx.Graphics.OpenGL/Buffer.cs
index ecb7dc90..0f6a90e3 100644
--- a/Ryujinx.Graphics.OpenGL/Buffer.cs
+++ b/Ryujinx.Graphics.OpenGL/Buffer.cs
@@ -55,15 +55,22 @@ namespace Ryujinx.Graphics.OpenGL
(IntPtr)size);
}
- public static byte[] GetData(BufferHandle buffer, int offset, int size)
+ public static unsafe ReadOnlySpan<byte> GetData(Renderer renderer, BufferHandle buffer, int offset, int size)
{
- GL.BindBuffer(BufferTarget.CopyReadBuffer, buffer.ToInt32());
+ if (HwCapabilities.UsePersistentBufferForFlush)
+ {
+ return renderer.PersistentBuffers.Default.GetBufferData(buffer, offset, size);
+ }
+ else
+ {
+ IntPtr target = renderer.PersistentBuffers.Default.GetHostArray(size);
- byte[] data = new byte[size];
+ GL.BindBuffer(BufferTarget.CopyReadBuffer, buffer.ToInt32());
- GL.GetBufferSubData(BufferTarget.CopyReadBuffer, (IntPtr)offset, size, data);
+ GL.GetBufferSubData(BufferTarget.CopyReadBuffer, (IntPtr)offset, size, target);
- return data;
+ return new ReadOnlySpan<byte>(target.ToPointer(), size);
+ }
}
public static void Resize(BufferHandle handle, int size)
diff --git a/Ryujinx.Graphics.OpenGL/Image/TextureBuffer.cs b/Ryujinx.Graphics.OpenGL/Image/TextureBuffer.cs
index f49a0647..8d407ccb 100644
--- a/Ryujinx.Graphics.OpenGL/Image/TextureBuffer.cs
+++ b/Ryujinx.Graphics.OpenGL/Image/TextureBuffer.cs
@@ -38,9 +38,9 @@ namespace Ryujinx.Graphics.OpenGL.Image
throw new NotSupportedException();
}
- public byte[] GetData()
+ public ReadOnlySpan<byte> GetData()
{
- return Buffer.GetData(_buffer, _bufferOffset, _bufferSize);
+ return Buffer.GetData(_renderer, _buffer, _bufferOffset, _bufferSize);
}
public void SetData(ReadOnlySpan<byte> data)
diff --git a/Ryujinx.Graphics.OpenGL/Image/TextureView.cs b/Ryujinx.Graphics.OpenGL/Image/TextureView.cs
index 5e7b5f22..460d1da4 100644
--- a/Ryujinx.Graphics.OpenGL/Image/TextureView.cs
+++ b/Ryujinx.Graphics.OpenGL/Image/TextureView.cs
@@ -119,7 +119,7 @@ namespace Ryujinx.Graphics.OpenGL.Image
_renderer.TextureCopy.Copy(this, (TextureView)destination, srcRegion, dstRegion, linearFilter);
}
- public byte[] GetData()
+ public unsafe ReadOnlySpan<byte> GetData()
{
int size = 0;
@@ -134,17 +134,11 @@ namespace Ryujinx.Graphics.OpenGL.Image
}
else
{
- byte[] data = new byte[size];
+ IntPtr target = _renderer.PersistentBuffers.Default.GetHostArray(size);
- unsafe
- {
- fixed (byte* ptr = data)
- {
- WriteTo((IntPtr)ptr);
- }
- }
+ WriteTo(target);
- return data;
+ return new ReadOnlySpan<byte>(target.ToPointer(), size);
}
}
diff --git a/Ryujinx.Graphics.OpenGL/PersistentBuffers.cs b/Ryujinx.Graphics.OpenGL/PersistentBuffers.cs
index 740f8b98..fe224433 100644
--- a/Ryujinx.Graphics.OpenGL/PersistentBuffers.cs
+++ b/Ryujinx.Graphics.OpenGL/PersistentBuffers.cs
@@ -1,4 +1,5 @@
using System;
+using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using OpenTK.Graphics.OpenGL;
using Ryujinx.Common.Logging;
@@ -27,6 +28,9 @@ namespace Ryujinx.Graphics.OpenGL
private int _copyBufferHandle;
private int _copyBufferSize;
+ private byte[] _data;
+ private IntPtr _dataMap;
+
private void EnsureBuffer(int requiredSize)
{
if (_copyBufferSize < requiredSize && _copyBufferHandle != 0)
@@ -48,6 +52,18 @@ namespace Ryujinx.Graphics.OpenGL
}
}
+ public unsafe IntPtr GetHostArray(int requiredSize)
+ {
+ if (_data == null || _data.Length < requiredSize)
+ {
+ _data = GC.AllocateUninitializedArray<byte>(requiredSize, true);
+
+ _dataMap = (IntPtr)Unsafe.AsPointer(ref MemoryMarshal.GetArrayDataReference(_data));
+ }
+
+ return _dataMap;
+ }
+
private void Sync()
{
GL.MemoryBarrier(MemoryBarrierFlags.ClientMappedBufferBarrierBit);
@@ -63,7 +79,7 @@ namespace Ryujinx.Graphics.OpenGL
GL.DeleteSync(sync);
}
- public byte[] GetTextureData(TextureView view, int size)
+ public unsafe ReadOnlySpan<byte> GetTextureData(TextureView view, int size)
{
EnsureBuffer(size);
@@ -73,16 +89,12 @@ namespace Ryujinx.Graphics.OpenGL
GL.BindBuffer(BufferTarget.PixelPackBuffer, 0);
- byte[] data = new byte[size];
-
Sync();
- Marshal.Copy(_bufferMap, data, 0, size);
-
- return data;
+ return new ReadOnlySpan<byte>(_bufferMap.ToPointer(), size);
}
- public byte[] GetBufferData(BufferHandle buffer, int offset, int size)
+ public unsafe ReadOnlySpan<byte> GetBufferData(BufferHandle buffer, int offset, int size)
{
EnsureBuffer(size);
@@ -93,13 +105,9 @@ namespace Ryujinx.Graphics.OpenGL
GL.BindBuffer(BufferTarget.CopyWriteBuffer, 0);
- byte[] data = new byte[size];
-
Sync();
- Marshal.Copy(_bufferMap, data, 0, size);
-
- return data;
+ return new ReadOnlySpan<byte>(_bufferMap.ToPointer(), size);
}
public void Dispose()
diff --git a/Ryujinx.Graphics.OpenGL/Renderer.cs b/Ryujinx.Graphics.OpenGL/Renderer.cs
index 561f0684..c7749228 100644
--- a/Ryujinx.Graphics.OpenGL/Renderer.cs
+++ b/Ryujinx.Graphics.OpenGL/Renderer.cs
@@ -91,16 +91,9 @@ namespace Ryujinx.Graphics.OpenGL
Buffer.Delete(buffer);
}
- public byte[] GetBufferData(BufferHandle buffer, int offset, int size)
+ public ReadOnlySpan<byte> GetBufferData(BufferHandle buffer, int offset, int size)
{
- if (HwCapabilities.UsePersistentBufferForFlush)
- {
- return PersistentBuffers.Default.GetBufferData(buffer, offset, size);
- }
- else
- {
- return Buffer.GetData(buffer, offset, size);
- }
+ return Buffer.GetData(this, buffer, offset, size);
}
public Capabilities GetCapabilities()