From 69cd2f337d2b587a357b8b0ca40d6e07aff68b18 Mon Sep 17 00:00:00 2001 From: James Jackson-South Date: Mon, 15 Jun 2020 13:12:12 +0100 Subject: [PATCH 1/3] Update Adler32 to correctly filter intrinsics. Fix #1228 --- src/ImageSharp/Formats/Png/Zlib/Adler32.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ImageSharp/Formats/Png/Zlib/Adler32.cs b/src/ImageSharp/Formats/Png/Zlib/Adler32.cs index 163d4cbcf6..534aba8f5a 100644 --- a/src/ImageSharp/Formats/Png/Zlib/Adler32.cs +++ b/src/ImageSharp/Formats/Png/Zlib/Adler32.cs @@ -63,7 +63,7 @@ public static uint Calculate(uint adler, ReadOnlySpan buffer) } #if SUPPORTS_RUNTIME_INTRINSICS - if (Sse3.IsSupported && buffer.Length >= MinBufferSize) + if (Ssse3.IsSupported && buffer.Length >= MinBufferSize) { return CalculateSse(adler, buffer); } From 5f78f1960588efb8aff40927628fc669d09c4244 Mon Sep 17 00:00:00 2001 From: James Jackson-South Date: Mon, 15 Jun 2020 20:53:06 +0100 Subject: [PATCH 2/3] Add tests --- .../Formats/Png/PngEncoderTests.cs | 48 ++++++++++++++++++- .../TestUtilities/TestEnvironment.Features.cs | 34 +++++++++++++ 2 files changed, 81 insertions(+), 1 deletion(-) create mode 100644 tests/ImageSharp.Tests/TestUtilities/TestEnvironment.Features.cs diff --git a/tests/ImageSharp.Tests/Formats/Png/PngEncoderTests.cs b/tests/ImageSharp.Tests/Formats/Png/PngEncoderTests.cs index 83ac400f4e..b9f5f16fa5 100644 --- a/tests/ImageSharp.Tests/Formats/Png/PngEncoderTests.cs +++ b/tests/ImageSharp.Tests/Formats/Png/PngEncoderTests.cs @@ -2,14 +2,19 @@ // Licensed under the Apache License, Version 2.0. // ReSharper disable InconsistentNaming +using System.Diagnostics; using System.IO; using System.Linq; - +#if SUPPORTS_RUNTIME_INTRINSICS +using System.Runtime.Intrinsics.X86; +#endif +using Microsoft.DotNet.RemoteExecutor; using SixLabors.ImageSharp.Formats; using SixLabors.ImageSharp.Formats.Png; using SixLabors.ImageSharp.Metadata; using SixLabors.ImageSharp.PixelFormats; using SixLabors.ImageSharp.Processing.Processors.Quantization; +using SixLabors.ImageSharp.Tests.TestUtilities; using SixLabors.ImageSharp.Tests.TestUtilities.ImageComparison; using Xunit; @@ -529,6 +534,47 @@ public void Encode_WorksWithDiscontiguousBuffers(TestImageProvider(TestImageProvider provider) + where TPixel : unmanaged, IPixel + { + static void RunTest(string providerDump) + { + TestImageProvider provider = + BasicSerializer.Deserialize>(providerDump); +#if SUPPORTS_RUNTIME_INTRINSICS + Assert.False(Ssse3.IsSupported); +#endif + + foreach (PngInterlaceMode interlaceMode in InterlaceMode) + { + TestPngEncoderCore( + provider, + PngColorType.Rgb, + PngFilterMethod.Adaptive, + PngBitDepth.Bit8, + interlaceMode, + appendPixelType: true, + appendPngColorType: true); + } + } + + string providerDump = BasicSerializer.Serialize(provider); + + var processStartInfo = new ProcessStartInfo(); + processStartInfo.Environment[TestEnvironment.Features.EnableSSE3] = TestEnvironment.Features.Off; + + RemoteExecutor.Invoke( + RunTest, + providerDump, + new RemoteInvokeOptions + { + StartInfo = processStartInfo + }) + .Dispose(); + } + private static void TestPngEncoderCore( TestImageProvider provider, PngColorType pngColorType, diff --git a/tests/ImageSharp.Tests/TestUtilities/TestEnvironment.Features.cs b/tests/ImageSharp.Tests/TestUtilities/TestEnvironment.Features.cs new file mode 100644 index 0000000000..06d91a0eca --- /dev/null +++ b/tests/ImageSharp.Tests/TestUtilities/TestEnvironment.Features.cs @@ -0,0 +1,34 @@ +// Copyright (c) Six Labors. +// Licensed under the Apache License, Version 2.0. + +namespace SixLabors.ImageSharp.Tests +{ + public static partial class TestEnvironment + { + internal static class Features + { + public const string On = "1"; + public const string Off = "0"; + + public const string EnableAES = "COMPlus_EnableAES"; + public const string EnableAVX = "COMPlus_EnableAVX"; + public const string EnableAVX2 = "COMPlus_EnableAVX2"; + public const string EnableBMI1 = "COMPlus_EnableBMI1"; + public const string EnableBMI2 = "COMPlus_EnableBMI2"; + public const string EnableFMA = "COMPlus_EnableFMA"; + public const string EnableHWIntrinsic = "COMPlus_EnableHWIntrinsic"; + public const string EnableIncompleteISAClass = "COMPlus_EnableIncompleteISAClass"; + public const string EnableLZCNT = "COMPlus_EnableLZCNT"; + public const string EnablePCLMULQDQ = "COMPlus_EnablePCLMULQDQ"; + public const string EnablePOPCNT = "COMPlus_EnablePOPCNT"; + public const string EnableSSE = "COMPlus_EnableSSE"; + public const string EnableSSE2 = "COMPlus_EnableSSE2"; + public const string EnableSSE3 = "COMPlus_EnableSSE3"; + public const string EnableSSE3_4 = "COMPlus_EnableSSE3_4"; + public const string EnableSSE41 = "COMPlus_EnableSSE41"; + public const string EnableSSE42 = "COMPlus_EnableSSE42"; + public const string EnableSSSE3 = "COMPlus_EnableSSSE3"; + public const string FeatureSIMD = "COMPlus_FeatureSIMD"; + } + } +} From e0d705a5ae78d4a50f469ae581fbd240e307604e Mon Sep 17 00:00:00 2001 From: James Jackson-South Date: Mon, 15 Jun 2020 23:49:43 +0100 Subject: [PATCH 3/3] Update TestEnvironment.Features.cs --- .../TestUtilities/TestEnvironment.Features.cs | 22 ++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/tests/ImageSharp.Tests/TestUtilities/TestEnvironment.Features.cs b/tests/ImageSharp.Tests/TestUtilities/TestEnvironment.Features.cs index 06d91a0eca..3568c1e5dc 100644 --- a/tests/ImageSharp.Tests/TestUtilities/TestEnvironment.Features.cs +++ b/tests/ImageSharp.Tests/TestUtilities/TestEnvironment.Features.cs @@ -10,6 +10,27 @@ internal static class Features public const string On = "1"; public const string Off = "0"; + // See https://github.com/SixLabors/ImageSharp/pull/1229#discussion_r440477861 + // * EnableHWIntrinsic + // * EnableSSE + // * EnableSSE2 + // * EnableAES + // * EnablePCLMULQDQ + // * EnableSSE3 + // * EnableSSSE3 + // * EnableSSE41 + // * EnableSSE42 + // * EnablePOPCNT + // * EnableAVX + // * EnableFMA + // * EnableAVX2 + // * EnableBMI1 + // * EnableBMI2 + // * EnableLZCNT + // + // `FeatureSIMD` ends up impacting all SIMD support(including `System.Numerics`) but not things + // like `LZCNT`, `BMI1`, or `BMI2` + // `EnableSSE3_4` is a legacy switch that exists for compat and is basically the same as `EnableSSE3` public const string EnableAES = "COMPlus_EnableAES"; public const string EnableAVX = "COMPlus_EnableAVX"; public const string EnableAVX2 = "COMPlus_EnableAVX2"; @@ -17,7 +38,6 @@ internal static class Features public const string EnableBMI2 = "COMPlus_EnableBMI2"; public const string EnableFMA = "COMPlus_EnableFMA"; public const string EnableHWIntrinsic = "COMPlus_EnableHWIntrinsic"; - public const string EnableIncompleteISAClass = "COMPlus_EnableIncompleteISAClass"; public const string EnableLZCNT = "COMPlus_EnableLZCNT"; public const string EnablePCLMULQDQ = "COMPlus_EnablePCLMULQDQ"; public const string EnablePOPCNT = "COMPlus_EnablePOPCNT";