aboutsummaryrefslogtreecommitdiff
path: root/src/Ryujinx.Graphics.OpenGL
diff options
context:
space:
mode:
Diffstat (limited to 'src/Ryujinx.Graphics.OpenGL')
-rw-r--r--src/Ryujinx.Graphics.OpenGL/Effects/SmaaPostProcessingEffect.cs7
-rw-r--r--src/Ryujinx.Graphics.OpenGL/Image/FormatConverter.cs10
-rw-r--r--src/Ryujinx.Graphics.OpenGL/Image/TextureBuffer.cs15
-rw-r--r--src/Ryujinx.Graphics.OpenGL/Image/TextureView.cs94
4 files changed, 69 insertions, 57 deletions
diff --git a/src/Ryujinx.Graphics.OpenGL/Effects/SmaaPostProcessingEffect.cs b/src/Ryujinx.Graphics.OpenGL/Effects/SmaaPostProcessingEffect.cs
index 46dda13f..a6c5e4ac 100644
--- a/src/Ryujinx.Graphics.OpenGL/Effects/SmaaPostProcessingEffect.cs
+++ b/src/Ryujinx.Graphics.OpenGL/Effects/SmaaPostProcessingEffect.cs
@@ -33,7 +33,8 @@ namespace Ryujinx.Graphics.OpenGL.Effects.Smaa
public int Quality
{
- get => _quality; set
+ get => _quality;
+ set
{
_quality = Math.Clamp(value, 0, _qualities.Length - 1);
}
@@ -150,8 +151,8 @@ namespace Ryujinx.Graphics.OpenGL.Effects.Smaa
_areaTexture = new TextureStorage(_renderer, areaInfo);
_searchTexture = new TextureStorage(_renderer, searchInfo);
- var areaTexture = EmbeddedResources.Read("Ryujinx.Graphics.OpenGL/Effects/Textures/SmaaAreaTexture.bin");
- var searchTexture = EmbeddedResources.Read("Ryujinx.Graphics.OpenGL/Effects/Textures/SmaaSearchTexture.bin");
+ var areaTexture = EmbeddedResources.ReadFileToRentedMemory("Ryujinx.Graphics.OpenGL/Effects/Textures/SmaaAreaTexture.bin");
+ var searchTexture = EmbeddedResources.ReadFileToRentedMemory("Ryujinx.Graphics.OpenGL/Effects/Textures/SmaaSearchTexture.bin");
var areaView = _areaTexture.CreateDefaultView();
var searchView = _searchTexture.CreateDefaultView();
diff --git a/src/Ryujinx.Graphics.OpenGL/Image/FormatConverter.cs b/src/Ryujinx.Graphics.OpenGL/Image/FormatConverter.cs
index c4bbf745..434f2590 100644
--- a/src/Ryujinx.Graphics.OpenGL/Image/FormatConverter.cs
+++ b/src/Ryujinx.Graphics.OpenGL/Image/FormatConverter.cs
@@ -1,4 +1,6 @@
+using Ryujinx.Common.Memory;
using System;
+using System.Buffers;
using System.Numerics;
using System.Runtime.InteropServices;
using System.Runtime.Intrinsics;
@@ -8,9 +10,11 @@ namespace Ryujinx.Graphics.OpenGL.Image
{
static class FormatConverter
{
- public unsafe static byte[] ConvertS8D24ToD24S8(ReadOnlySpan<byte> data)
+ public unsafe static IMemoryOwner<byte> ConvertS8D24ToD24S8(ReadOnlySpan<byte> data)
{
- byte[] output = new byte[data.Length];
+ IMemoryOwner<byte> outputMemory = ByteMemoryPool.Rent(data.Length);
+
+ Span<byte> output = outputMemory.Memory.Span;
int start = 0;
@@ -74,7 +78,7 @@ namespace Ryujinx.Graphics.OpenGL.Image
outSpan[i] = BitOperations.RotateLeft(dataSpan[i], 8);
}
- return output;
+ return outputMemory;
}
public unsafe static byte[] ConvertD24S8ToS8D24(ReadOnlySpan<byte> data)
diff --git a/src/Ryujinx.Graphics.OpenGL/Image/TextureBuffer.cs b/src/Ryujinx.Graphics.OpenGL/Image/TextureBuffer.cs
index f140b276..a8196541 100644
--- a/src/Ryujinx.Graphics.OpenGL/Image/TextureBuffer.cs
+++ b/src/Ryujinx.Graphics.OpenGL/Image/TextureBuffer.cs
@@ -1,7 +1,7 @@
using OpenTK.Graphics.OpenGL;
-using Ryujinx.Common.Memory;
using Ryujinx.Graphics.GAL;
using System;
+using System.Buffers;
namespace Ryujinx.Graphics.OpenGL.Image
{
@@ -54,19 +54,24 @@ namespace Ryujinx.Graphics.OpenGL.Image
throw new NotImplementedException();
}
- public void SetData(SpanOrArray<byte> data)
+ /// <inheritdoc/>
+ public void SetData(IMemoryOwner<byte> data)
{
- var dataSpan = data.AsSpan();
+ var dataSpan = data.Memory.Span;
Buffer.SetData(_buffer, _bufferOffset, dataSpan[..Math.Min(dataSpan.Length, _bufferSize)]);
+
+ data.Dispose();
}
- public void SetData(SpanOrArray<byte> data, int layer, int level)
+ /// <inheritdoc/>
+ public void SetData(IMemoryOwner<byte> data, int layer, int level)
{
throw new NotSupportedException();
}
- public void SetData(SpanOrArray<byte> data, int layer, int level, Rectangle<int> region)
+ /// <inheritdoc/>
+ public void SetData(IMemoryOwner<byte> data, int layer, int level, Rectangle<int> region)
{
throw new NotSupportedException();
}
diff --git a/src/Ryujinx.Graphics.OpenGL/Image/TextureView.cs b/src/Ryujinx.Graphics.OpenGL/Image/TextureView.cs
index 7f1b1c38..8a18e613 100644
--- a/src/Ryujinx.Graphics.OpenGL/Image/TextureView.cs
+++ b/src/Ryujinx.Graphics.OpenGL/Image/TextureView.cs
@@ -1,8 +1,8 @@
using OpenTK.Graphics.OpenGL;
using Ryujinx.Common;
-using Ryujinx.Common.Memory;
using Ryujinx.Graphics.GAL;
using System;
+using System.Buffers;
using System.Diagnostics;
namespace Ryujinx.Graphics.OpenGL.Image
@@ -448,70 +448,59 @@ namespace Ryujinx.Graphics.OpenGL.Image
}
}
- public void SetData(SpanOrArray<byte> data)
+ public void SetData(IMemoryOwner<byte> data)
{
- var dataSpan = data.AsSpan();
-
- if (Format == Format.S8UintD24Unorm)
- {
- dataSpan = FormatConverter.ConvertS8D24ToD24S8(dataSpan);
- }
-
- unsafe
+ using (data = EnsureDataFormat(data))
{
- fixed (byte* ptr = dataSpan)
+ unsafe
{
- ReadFrom((IntPtr)ptr, dataSpan.Length);
+ var dataSpan = data.Memory.Span;
+ fixed (byte* ptr = dataSpan)
+ {
+ ReadFrom((IntPtr)ptr, dataSpan.Length);
+ }
}
}
}
- public void SetData(SpanOrArray<byte> data, int layer, int level)
+ public void SetData(IMemoryOwner<byte> data, int layer, int level)
{
- var dataSpan = data.AsSpan();
-
- if (Format == Format.S8UintD24Unorm)
- {
- dataSpan = FormatConverter.ConvertS8D24ToD24S8(dataSpan);
- }
-
- unsafe
+ using (data = EnsureDataFormat(data))
{
- fixed (byte* ptr = dataSpan)
+ unsafe
{
- int width = Math.Max(Info.Width >> level, 1);
- int height = Math.Max(Info.Height >> level, 1);
+ fixed (byte* ptr = data.Memory.Span)
+ {
+ int width = Math.Max(Info.Width >> level, 1);
+ int height = Math.Max(Info.Height >> level, 1);
- ReadFrom2D((IntPtr)ptr, layer, level, 0, 0, width, height);
+ ReadFrom2D((IntPtr)ptr, layer, level, 0, 0, width, height);
+ }
}
}
}
- public void SetData(SpanOrArray<byte> data, int layer, int level, Rectangle<int> region)
+ public void SetData(IMemoryOwner<byte> data, int layer, int level, Rectangle<int> region)
{
- var dataSpan = data.AsSpan();
-
- if (Format == Format.S8UintD24Unorm)
+ using (data = EnsureDataFormat(data))
{
- dataSpan = FormatConverter.ConvertS8D24ToD24S8(dataSpan);
- }
-
- int wInBlocks = BitUtils.DivRoundUp(region.Width, Info.BlockWidth);
- int hInBlocks = BitUtils.DivRoundUp(region.Height, Info.BlockHeight);
+ int wInBlocks = BitUtils.DivRoundUp(region.Width, Info.BlockWidth);
+ int hInBlocks = BitUtils.DivRoundUp(region.Height, Info.BlockHeight);
- unsafe
- {
- fixed (byte* ptr = dataSpan)
+ unsafe
{
- ReadFrom2D(
- (IntPtr)ptr,
- layer,
- level,
- region.X,
- region.Y,
- region.Width,
- region.Height,
- BitUtils.AlignUp(wInBlocks * Info.BytesPerPixel, 4) * hInBlocks);
+ fixed (byte* ptr = data.Memory.Span)
+ {
+ ReadFrom2D(
+ (IntPtr)ptr,
+ layer,
+ level,
+ region.X,
+ region.Y,
+ region.Width,
+ region.Height,
+ BitUtils.AlignUp(wInBlocks * Info.BytesPerPixel, 4) * hInBlocks);
+ }
}
}
}
@@ -533,6 +522,19 @@ namespace Ryujinx.Graphics.OpenGL.Image
ReadFrom2D(data, layer, level, x, y, width, height, mipSize);
}
+ private IMemoryOwner<byte> EnsureDataFormat(IMemoryOwner<byte> data)
+ {
+ if (Format == Format.S8UintD24Unorm)
+ {
+ using (data)
+ {
+ return FormatConverter.ConvertS8D24ToD24S8(data.Memory.Span);
+ }
+ }
+
+ return data;
+ }
+
private void ReadFrom2D(IntPtr data, int layer, int level, int x, int y, int width, int height, int mipSize)
{
TextureTarget target = Target.Convert();