Browse Source

Moved Accumulate to Numerics

pull/1630/head
TechPizza 5 years ago
parent
commit
78b6d78058
  1. 14
      src/ImageSharp/Common/Helpers/Numerics.cs
  2. 19
      src/ImageSharp/Formats/Png/Filters/PaethFilter.cs

14
src/ImageSharp/Common/Helpers/Numerics.cs

@ -748,5 +748,19 @@ namespace SixLabors.ImageSharp
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static float Lerp(float value1, float value2, float amount)
=> ((value2 - value1) * amount) + value1;
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static void Accumulate(ref Vector<uint> accumulator, Vector<byte> values)
{
Vector.Widen(values, out Vector<ushort> shortLow, out Vector<ushort> shortHigh);
Vector.Widen(shortLow, out Vector<uint> intLow, out Vector<uint> intHigh);
accumulator += intLow;
accumulator += intHigh;
Vector.Widen(shortHigh, out intLow, out intHigh);
accumulator += intLow;
accumulator += intHigh;
}
}
}

19
src/ImageSharp/Formats/Png/Filters/PaethFilter.cs

@ -86,7 +86,7 @@ namespace SixLabors.ImageSharp.Formats.Png.Filters
#if SUPPORTS_RUNTIME_INTRINSICS
if (Vector.IsHardwareAccelerated)
{
Vector<int> sumAccumulator = Vector<int>.Zero;
Vector<uint> sumAccumulator = Vector<uint>.Zero;
for (int xLeft = x - bytesPerPixel; x + Vector<byte>.Count <= scanline.Length; xLeft += Vector<byte>.Count)
{
@ -99,23 +99,12 @@ namespace SixLabors.ImageSharp.Formats.Png.Filters
res.CopyTo(result.Slice(x + 1)); // + 1 to skip filter type
x += Vector<byte>.Count;
Vector.Widen(
Vector.Abs(Vector.AsVectorSByte(res)),
out Vector<short> shortLow,
out Vector<short> shortHigh);
Vector.Widen(shortLow, out Vector<int> intLow, out Vector<int> intHigh);
sumAccumulator += intLow;
sumAccumulator += intHigh;
Vector.Widen(shortHigh, out intLow, out intHigh);
sumAccumulator += intLow;
sumAccumulator += intHigh;
Numerics.Accumulate(ref sumAccumulator, Vector.AsVectorByte(Vector.Abs(Vector.AsVectorSByte(res))));
}
for (int i = 0; i < Vector<int>.Count; i++)
for (int i = 0; i < Vector<uint>.Count; i++)
{
sum += sumAccumulator[i];
sum += (int)sumAccumulator[i];
}
}
#endif

Loading…
Cancel
Save