diff options
| author | jhorv <38920027+jhorv@users.noreply.github.com> | 2024-08-03 14:50:53 -0400 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-08-03 19:50:53 +0100 |
| commit | 59ddb26628fc2ab94f1c274a254c76b3e368f8b6 (patch) | |
| tree | 57a91040e67a4afb1aec5350704990592efe1acc /src/Ryujinx.Graphics.Texture/BCnDecoder.cs | |
| parent | 83fda10f6ef68950de395b5f9f6ab0bf58adced4 (diff) | |
replace ByteMemoryPool usage in Ryujinx.Graphics (#7129)
* chore: replace `ByteMemoryPool` usage with `MemoryOwner<byte>`
* refactor: `PixelConverter.ConvertR4G4ToR4G4B4A4()` - rename old `outputSpan` to `outputSpanUInt16`, reuse same output `Span<byte>` as newly-freed name `outputSpan`
* eliminate temporary buffer allocations
* chore, perf: use MemoryOwner<byte> instead of IMemoryOwner<byte>
Diffstat (limited to 'src/Ryujinx.Graphics.Texture/BCnDecoder.cs')
| -rw-r--r-- | src/Ryujinx.Graphics.Texture/BCnDecoder.cs | 43 |
1 files changed, 21 insertions, 22 deletions
diff --git a/src/Ryujinx.Graphics.Texture/BCnDecoder.cs b/src/Ryujinx.Graphics.Texture/BCnDecoder.cs index eb85334a..d7b1f0fa 100644 --- a/src/Ryujinx.Graphics.Texture/BCnDecoder.cs +++ b/src/Ryujinx.Graphics.Texture/BCnDecoder.cs @@ -1,7 +1,6 @@ using Ryujinx.Common; using Ryujinx.Common.Memory; using System; -using System.Buffers; using System.Buffers.Binary; using System.Runtime.InteropServices; using System.Runtime.Intrinsics; @@ -14,7 +13,7 @@ namespace Ryujinx.Graphics.Texture private const int BlockWidth = 4; private const int BlockHeight = 4; - public static IMemoryOwner<byte> DecodeBC1(ReadOnlySpan<byte> data, int width, int height, int depth, int levels, int layers) + public static MemoryOwner<byte> DecodeBC1(ReadOnlySpan<byte> data, int width, int height, int depth, int levels, int layers) { int size = 0; @@ -23,12 +22,12 @@ namespace Ryujinx.Graphics.Texture size += Math.Max(1, width >> l) * Math.Max(1, height >> l) * Math.Max(1, depth >> l) * layers * 4; } - IMemoryOwner<byte> output = ByteMemoryPool.Rent(size); + MemoryOwner<byte> output = MemoryOwner<byte>.Rent(size); Span<byte> tile = stackalloc byte[BlockWidth * BlockHeight * 4]; Span<uint> tileAsUint = MemoryMarshal.Cast<byte, uint>(tile); - Span<uint> outputAsUint = MemoryMarshal.Cast<byte, uint>(output.Memory.Span); + Span<uint> outputAsUint = MemoryMarshal.Cast<byte, uint>(output.Span); Span<Vector128<byte>> tileAsVector128 = MemoryMarshal.Cast<byte, Vector128<byte>>(tile); @@ -102,7 +101,7 @@ namespace Ryujinx.Graphics.Texture return output; } - public static IMemoryOwner<byte> DecodeBC2(ReadOnlySpan<byte> data, int width, int height, int depth, int levels, int layers) + public static MemoryOwner<byte> DecodeBC2(ReadOnlySpan<byte> data, int width, int height, int depth, int levels, int layers) { int size = 0; @@ -111,12 +110,12 @@ namespace Ryujinx.Graphics.Texture size += Math.Max(1, width >> l) * Math.Max(1, height >> l) * Math.Max(1, depth >> l) * layers * 4; } - IMemoryOwner<byte> output = ByteMemoryPool.Rent(size); + MemoryOwner<byte> output = MemoryOwner<byte>.Rent(size); Span<byte> tile = stackalloc byte[BlockWidth * BlockHeight * 4]; Span<uint> tileAsUint = MemoryMarshal.Cast<byte, uint>(tile); - Span<uint> outputAsUint = MemoryMarshal.Cast<byte, uint>(output.Memory.Span); + Span<uint> outputAsUint = MemoryMarshal.Cast<byte, uint>(output.Span); Span<Vector128<byte>> tileAsVector128 = MemoryMarshal.Cast<byte, Vector128<byte>>(tile); @@ -197,7 +196,7 @@ namespace Ryujinx.Graphics.Texture return output; } - public static IMemoryOwner<byte> DecodeBC3(ReadOnlySpan<byte> data, int width, int height, int depth, int levels, int layers) + public static MemoryOwner<byte> DecodeBC3(ReadOnlySpan<byte> data, int width, int height, int depth, int levels, int layers) { int size = 0; @@ -206,13 +205,13 @@ namespace Ryujinx.Graphics.Texture size += Math.Max(1, width >> l) * Math.Max(1, height >> l) * Math.Max(1, depth >> l) * layers * 4; } - IMemoryOwner<byte> output = ByteMemoryPool.Rent(size); + MemoryOwner<byte> output = MemoryOwner<byte>.Rent(size); Span<byte> tile = stackalloc byte[BlockWidth * BlockHeight * 4]; Span<byte> rPal = stackalloc byte[8]; Span<uint> tileAsUint = MemoryMarshal.Cast<byte, uint>(tile); - Span<uint> outputAsUint = MemoryMarshal.Cast<byte, uint>(output.Memory.Span); + Span<uint> outputAsUint = MemoryMarshal.Cast<byte, uint>(output.Span); Span<Vector128<byte>> tileAsVector128 = MemoryMarshal.Cast<byte, Vector128<byte>>(tile); @@ -294,7 +293,7 @@ namespace Ryujinx.Graphics.Texture return output; } - public static IMemoryOwner<byte> DecodeBC4(ReadOnlySpan<byte> data, int width, int height, int depth, int levels, int layers, bool signed) + public static MemoryOwner<byte> DecodeBC4(ReadOnlySpan<byte> data, int width, int height, int depth, int levels, int layers, bool signed) { int size = 0; @@ -306,8 +305,8 @@ namespace Ryujinx.Graphics.Texture // Backends currently expect a stride alignment of 4 bytes, so output width must be aligned. int alignedWidth = BitUtils.AlignUp(width, 4); - IMemoryOwner<byte> output = ByteMemoryPool.Rent(size); - Span<byte> outputSpan = output.Memory.Span; + MemoryOwner<byte> output = MemoryOwner<byte>.Rent(size); + Span<byte> outputSpan = output.Span; ReadOnlySpan<ulong> data64 = MemoryMarshal.Cast<byte, ulong>(data); @@ -402,7 +401,7 @@ namespace Ryujinx.Graphics.Texture return output; } - public static IMemoryOwner<byte> DecodeBC5(ReadOnlySpan<byte> data, int width, int height, int depth, int levels, int layers, bool signed) + public static MemoryOwner<byte> DecodeBC5(ReadOnlySpan<byte> data, int width, int height, int depth, int levels, int layers, bool signed) { int size = 0; @@ -414,7 +413,7 @@ namespace Ryujinx.Graphics.Texture // Backends currently expect a stride alignment of 4 bytes, so output width must be aligned. int alignedWidth = BitUtils.AlignUp(width, 2); - IMemoryOwner<byte> output = ByteMemoryPool.Rent(size); + MemoryOwner<byte> output = MemoryOwner<byte>.Rent(size); ReadOnlySpan<ulong> data64 = MemoryMarshal.Cast<byte, ulong>(data); @@ -423,7 +422,7 @@ namespace Ryujinx.Graphics.Texture Span<byte> rPal = stackalloc byte[8]; Span<byte> gPal = stackalloc byte[8]; - Span<ushort> outputAsUshort = MemoryMarshal.Cast<byte, ushort>(output.Memory.Span); + Span<ushort> outputAsUshort = MemoryMarshal.Cast<byte, ushort>(output.Span); Span<uint> rTileAsUint = MemoryMarshal.Cast<byte, uint>(rTile); Span<uint> gTileAsUint = MemoryMarshal.Cast<byte, uint>(gTile); @@ -527,7 +526,7 @@ namespace Ryujinx.Graphics.Texture return output; } - public static IMemoryOwner<byte> DecodeBC6(ReadOnlySpan<byte> data, int width, int height, int depth, int levels, int layers, bool signed) + public static MemoryOwner<byte> DecodeBC6(ReadOnlySpan<byte> data, int width, int height, int depth, int levels, int layers, bool signed) { int size = 0; @@ -536,8 +535,8 @@ namespace Ryujinx.Graphics.Texture size += Math.Max(1, width >> l) * Math.Max(1, height >> l) * Math.Max(1, depth >> l) * layers * 8; } - IMemoryOwner<byte> output = ByteMemoryPool.Rent(size); - Span<byte> outputSpan = output.Memory.Span; + MemoryOwner<byte> output = MemoryOwner<byte>.Rent(size); + Span<byte> outputSpan = output.Span; int inputOffset = 0; int outputOffset = 0; @@ -566,7 +565,7 @@ namespace Ryujinx.Graphics.Texture return output; } - public static IMemoryOwner<byte> DecodeBC7(ReadOnlySpan<byte> data, int width, int height, int depth, int levels, int layers) + public static MemoryOwner<byte> DecodeBC7(ReadOnlySpan<byte> data, int width, int height, int depth, int levels, int layers) { int size = 0; @@ -575,8 +574,8 @@ namespace Ryujinx.Graphics.Texture size += Math.Max(1, width >> l) * Math.Max(1, height >> l) * Math.Max(1, depth >> l) * layers * 4; } - IMemoryOwner<byte> output = ByteMemoryPool.Rent(size); - Span<byte> outputSpan = output.Memory.Span; + MemoryOwner<byte> output = MemoryOwner<byte>.Rent(size); + Span<byte> outputSpan = output.Span; int inputOffset = 0; int outputOffset = 0; |
