diff options
Diffstat (limited to 'Ryujinx.Graphics.Texture')
| -rw-r--r-- | Ryujinx.Graphics.Texture/PixelConverter.cs | 39 |
1 files changed, 39 insertions, 0 deletions
diff --git a/Ryujinx.Graphics.Texture/PixelConverter.cs b/Ryujinx.Graphics.Texture/PixelConverter.cs new file mode 100644 index 00000000..d7e45a69 --- /dev/null +++ b/Ryujinx.Graphics.Texture/PixelConverter.cs @@ -0,0 +1,39 @@ +using System; +using System.Runtime.InteropServices; +using System.Runtime.Intrinsics; +using System.Runtime.Intrinsics.X86; + +namespace Ryujinx.Graphics.Texture +{ + public static class PixelConverter + { + public unsafe static byte[] ConvertR4G4ToR4G4B4A4(ReadOnlySpan<byte> data) + { + byte[] output = new byte[data.Length * 2]; + int start = 0; + + if (Sse41.IsSupported) + { + int sizeTrunc = data.Length & ~7; + start = sizeTrunc; + + fixed (byte* inputPtr = data, outputPtr = output) + { + for (ulong offset = 0; offset < (ulong)sizeTrunc; offset += 8) + { + Sse2.Store(outputPtr + offset * 2, Sse41.ConvertToVector128Int16(inputPtr + offset).AsByte()); + } + } + } + + Span<ushort> outputSpan = MemoryMarshal.Cast<byte, ushort>(output); + + for (int i = start; i < data.Length; i++) + { + outputSpan[i] = (ushort)data[i]; + } + + return output; + } + } +} |
