Browse Source

Resizing converter no longer depends on avx converter only

pull/2076/head
Dmitry Pentin 5 years ago
parent
commit
a10be094f0
  1. 5
      src/ImageSharp/Formats/Jpeg/Components/Decoder/ColorConverters/JpegColorConverterAvx.cs
  2. 9
      src/ImageSharp/Formats/Jpeg/Components/Decoder/ColorConverters/JpegColorConverterBase.cs
  3. 4
      src/ImageSharp/Formats/Jpeg/Components/Decoder/ColorConverters/JpegColorConverterScalar.cs
  4. 6
      src/ImageSharp/Formats/Jpeg/Components/Decoder/ColorConverters/JpegColorConverterVector.cs
  5. 12
      src/ImageSharp/Formats/Jpeg/Components/Decoder/SpectralConversion/ResizingSpectralConverter{TPixel}.cs

5
src/ImageSharp/Formats/Jpeg/Components/Decoder/ColorConverters/JpegColorConverterAvx.cs

@ -1,6 +1,7 @@
// Copyright (c) Six Labors. // Copyright (c) Six Labors.
// Licensed under the Apache License, Version 2.0. // Licensed under the Apache License, Version 2.0.
#if SUPPORTS_RUNTIME_INTRINSICS #if SUPPORTS_RUNTIME_INTRINSICS
using System.Runtime.Intrinsics;
using System.Runtime.Intrinsics.X86; using System.Runtime.Intrinsics.X86;
namespace SixLabors.ImageSharp.Formats.Jpeg.Components.Decoder.ColorConverters namespace SixLabors.ImageSharp.Formats.Jpeg.Components.Decoder.ColorConverters
@ -25,7 +26,9 @@ namespace SixLabors.ImageSharp.Formats.Jpeg.Components.Decoder.ColorConverters
{ {
} }
public override bool IsAvailable => Avx.IsSupported; public sealed override bool IsAvailable => Avx.IsSupported;
public sealed override int ElementsPerBatch => Vector256<float>.Count;
} }
} }
} }

9
src/ImageSharp/Formats/Jpeg/Components/Decoder/ColorConverters/JpegColorConverterBase.cs

@ -35,6 +35,15 @@ namespace SixLabors.ImageSharp.Formats.Jpeg.Components.Decoder.ColorConverters
/// </summary> /// </summary>
public abstract bool IsAvailable { get; } public abstract bool IsAvailable { get; }
/// <summary>
/// Gets a value indicating how many pixels are processed in a single batch.
/// </summary>
/// <remarks>
/// This generaly should be equal to register size,
/// e.g. 1 for scalar implementation, 8 for AVX implementation and so on.
/// </remarks>
public abstract int ElementsPerBatch { get; }
/// <summary> /// <summary>
/// Gets the <see cref="JpegColorSpace"/> of this converter. /// Gets the <see cref="JpegColorSpace"/> of this converter.
/// </summary> /// </summary>

4
src/ImageSharp/Formats/Jpeg/Components/Decoder/ColorConverters/JpegColorConverterScalar.cs

@ -16,7 +16,9 @@ namespace SixLabors.ImageSharp.Formats.Jpeg.Components.Decoder.ColorConverters
{ {
} }
public override bool IsAvailable => true; public sealed override bool IsAvailable => true;
public sealed override int ElementsPerBatch => 1;
} }
} }
} }

6
src/ImageSharp/Formats/Jpeg/Components/Decoder/ColorConverters/JpegColorConverterVector.cs

@ -17,7 +17,7 @@ namespace SixLabors.ImageSharp.Formats.Jpeg.Components.Decoder.ColorConverters
/// Even though real life data is guaranteed to be of size /// Even though real life data is guaranteed to be of size
/// divisible by 8 newer SIMD instructions like AVX512 won't work with /// divisible by 8 newer SIMD instructions like AVX512 won't work with
/// such data out of the box. These converters have fallback code /// such data out of the box. These converters have fallback code
/// for 'remainder' data. /// for remainder data.
/// </remarks> /// </remarks>
internal abstract class JpegColorConverterVector : JpegColorConverterBase internal abstract class JpegColorConverterVector : JpegColorConverterBase
{ {
@ -28,7 +28,9 @@ namespace SixLabors.ImageSharp.Formats.Jpeg.Components.Decoder.ColorConverters
public sealed override bool IsAvailable => Vector.IsHardwareAccelerated && Vector<float>.Count % 4 == 0; public sealed override bool IsAvailable => Vector.IsHardwareAccelerated && Vector<float>.Count % 4 == 0;
public override void ConvertToRgbInplace(in ComponentValues values) public sealed override int ElementsPerBatch => Vector<float>.Count;
public sealed override void ConvertToRgbInplace(in ComponentValues values)
{ {
DebugGuard.IsTrue(this.IsAvailable, $"{this.GetType().Name} converter is not supported on current hardware."); DebugGuard.IsTrue(this.IsAvailable, $"{this.GetType().Name} converter is not supported on current hardware.");

12
src/ImageSharp/Formats/Jpeg/Components/Decoder/SpectralConversion/ResizingSpectralConverter{TPixel}.cs

@ -91,10 +91,13 @@ namespace SixLabors.ImageSharp.Formats.Jpeg.Components.Decoder
int blockPixelSize = 8 / scaleDenominator; int blockPixelSize = 8 / scaleDenominator;
this.pixelRowsPerStep = majorVerticalSamplingFactor * blockPixelSize; this.pixelRowsPerStep = majorVerticalSamplingFactor * blockPixelSize;
// BUFFER SIZE MUST BE DIVISIBLE BY 8 ATM // color converter
// TODO: fix this mess JpegColorConverterBase converter = this.GetColorConverter(frame, jpegData);
this.colorConverter = converter;
int bufferWidth = majorBlockWidth * blockPixelSize; int bufferWidth = majorBlockWidth * blockPixelSize;
int correctedBufferWidth = bufferWidth + (8 - (bufferWidth % 8)); int batchSize = converter.ElementsPerBatch;
int correctedBufferWidth = bufferWidth + (batchSize - (bufferWidth % batchSize));
var postProcessorBufferSize = new Size(correctedBufferWidth, this.pixelRowsPerStep); var postProcessorBufferSize = new Size(correctedBufferWidth, this.pixelRowsPerStep);
this.componentProcessors = new JpegComponentPostProcessor8[frame.Components.Length]; this.componentProcessors = new JpegComponentPostProcessor8[frame.Components.Length];
@ -102,9 +105,6 @@ namespace SixLabors.ImageSharp.Formats.Jpeg.Components.Decoder
{ {
this.componentProcessors[i] = new JpegComponentPostProcessor8(allocator, frame, jpegData, postProcessorBufferSize, frame.Components[i]); this.componentProcessors[i] = new JpegComponentPostProcessor8(allocator, frame, jpegData, postProcessorBufferSize, frame.Components[i]);
} }
// color converter
this.colorConverter = this.GetColorConverter(frame, jpegData);
} }
public override void ConvertStrideBaseline() public override void ConvertStrideBaseline()

Loading…
Cancel
Save