|
|
@ -46,7 +46,7 @@ namespace SixLabors.ImageSharp.Tests.TestUtilities.Tests |
|
|
public void AllowsAllHwIntrinsicFeatures() |
|
|
public void AllowsAllHwIntrinsicFeatures() |
|
|
{ |
|
|
{ |
|
|
FeatureTestRunner.RunWithHwIntrinsicsFeature( |
|
|
FeatureTestRunner.RunWithHwIntrinsicsFeature( |
|
|
() => Assert.True(Vector.IsHardwareAccelerated, nameof(Vector.IsHardwareAccelerated)), |
|
|
() => Assert.True(Vector.IsHardwareAccelerated), |
|
|
HwIntrinsics.AllowAll); |
|
|
HwIntrinsics.AllowAll); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
@ -54,7 +54,7 @@ namespace SixLabors.ImageSharp.Tests.TestUtilities.Tests |
|
|
public void CanLimitHwIntrinsicSIMDFeatures() |
|
|
public void CanLimitHwIntrinsicSIMDFeatures() |
|
|
{ |
|
|
{ |
|
|
FeatureTestRunner.RunWithHwIntrinsicsFeature( |
|
|
FeatureTestRunner.RunWithHwIntrinsicsFeature( |
|
|
() => Assert.False(Vector.IsHardwareAccelerated, nameof(Vector.IsHardwareAccelerated)), |
|
|
() => Assert.False(Vector.IsHardwareAccelerated), |
|
|
HwIntrinsics.DisableSIMD); |
|
|
HwIntrinsics.DisableSIMD); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
@ -87,170 +87,195 @@ namespace SixLabors.ImageSharp.Tests.TestUtilities.Tests |
|
|
} |
|
|
} |
|
|
#endif
|
|
|
#endif
|
|
|
|
|
|
|
|
|
// [Fact]
|
|
|
[Fact] |
|
|
// public void CanLimitHwIntrinsicFeaturesWithIntrinsicsParam()
|
|
|
public void CanLimitHwIntrinsicFeaturesWithIntrinsicsParam() |
|
|
// {
|
|
|
{ |
|
|
// static void AssertHwIntrinsicsFeatureDisabled(string intrinsic)
|
|
|
static void AssertHwIntrinsicsFeatureDisabled(string intrinsic) |
|
|
// {
|
|
|
{ |
|
|
// Assert.NotNull(intrinsic);
|
|
|
Assert.NotNull(intrinsic); |
|
|
|
|
|
|
|
|
// switch ((HwIntrinsics)Enum.Parse(typeof(HwIntrinsics), intrinsic))
|
|
|
switch ((HwIntrinsics)Enum.Parse(typeof(HwIntrinsics), intrinsic)) |
|
|
// {
|
|
|
{ |
|
|
// case HwIntrinsics.DisableSIMD:
|
|
|
case HwIntrinsics.DisableSIMD: |
|
|
// Assert.False(Vector.IsHardwareAccelerated);
|
|
|
Assert.False(Vector.IsHardwareAccelerated); |
|
|
// break;
|
|
|
break; |
|
|
//#if SUPPORTS_RUNTIME_INTRINSICS
|
|
|
#if SUPPORTS_RUNTIME_INTRINSICS
|
|
|
// case HwIntrinsics.DisableHWIntrinsic:
|
|
|
case HwIntrinsics.DisableHWIntrinsic: |
|
|
// Assert.False(Vector.IsHardwareAccelerated);
|
|
|
Assert.False(Sse.IsSupported); |
|
|
// break;
|
|
|
Assert.False(Sse2.IsSupported); |
|
|
// case HwIntrinsics.DisableSSE:
|
|
|
Assert.False(Aes.IsSupported); |
|
|
// Assert.False(Sse.IsSupported);
|
|
|
Assert.False(Pclmulqdq.IsSupported); |
|
|
// break;
|
|
|
Assert.False(Sse3.IsSupported); |
|
|
// case HwIntrinsics.DisableSSE2:
|
|
|
Assert.False(Ssse3.IsSupported); |
|
|
// Assert.False(Sse2.IsSupported);
|
|
|
Assert.False(Sse41.IsSupported); |
|
|
// break;
|
|
|
Assert.False(Sse42.IsSupported); |
|
|
// case HwIntrinsics.DisableAES:
|
|
|
Assert.False(Popcnt.IsSupported); |
|
|
// Assert.False(Aes.IsSupported);
|
|
|
Assert.False(Avx.IsSupported); |
|
|
// break;
|
|
|
Assert.False(Fma.IsSupported); |
|
|
// case HwIntrinsics.DisablePCLMULQDQ:
|
|
|
Assert.False(Avx2.IsSupported); |
|
|
// Assert.False(Pclmulqdq.IsSupported);
|
|
|
Assert.False(Bmi1.IsSupported); |
|
|
// break;
|
|
|
Assert.False(Bmi2.IsSupported); |
|
|
// case HwIntrinsics.DisableSSE3:
|
|
|
Assert.False(Lzcnt.IsSupported); |
|
|
// Assert.False(Sse3.IsSupported);
|
|
|
break; |
|
|
// break;
|
|
|
case HwIntrinsics.DisableSSE: |
|
|
// case HwIntrinsics.DisableSSSE3:
|
|
|
Assert.False(Sse.IsSupported); |
|
|
// Assert.False(Ssse3.IsSupported);
|
|
|
break; |
|
|
// break;
|
|
|
case HwIntrinsics.DisableSSE2: |
|
|
// case HwIntrinsics.DisableSSE41:
|
|
|
Assert.False(Sse2.IsSupported); |
|
|
// Assert.False(Sse41.IsSupported);
|
|
|
break; |
|
|
// break;
|
|
|
case HwIntrinsics.DisableAES: |
|
|
// case HwIntrinsics.DisableSSE42:
|
|
|
Assert.False(Aes.IsSupported); |
|
|
// Assert.False(Sse42.IsSupported);
|
|
|
break; |
|
|
// break;
|
|
|
case HwIntrinsics.DisablePCLMULQDQ: |
|
|
// case HwIntrinsics.DisablePOPCNT:
|
|
|
Assert.False(Pclmulqdq.IsSupported); |
|
|
// Assert.False(Popcnt.IsSupported);
|
|
|
break; |
|
|
// break;
|
|
|
case HwIntrinsics.DisableSSE3: |
|
|
// case HwIntrinsics.DisableAVX:
|
|
|
Assert.False(Sse3.IsSupported); |
|
|
// Assert.False(Avx.IsSupported);
|
|
|
break; |
|
|
// break;
|
|
|
case HwIntrinsics.DisableSSSE3: |
|
|
// case HwIntrinsics.DisableFMA:
|
|
|
Assert.False(Ssse3.IsSupported); |
|
|
// Assert.False(Fma.IsSupported);
|
|
|
break; |
|
|
// break;
|
|
|
case HwIntrinsics.DisableSSE41: |
|
|
// case HwIntrinsics.DisableAVX2:
|
|
|
Assert.False(Sse41.IsSupported); |
|
|
// Assert.False(Avx2.IsSupported);
|
|
|
break; |
|
|
// break;
|
|
|
case HwIntrinsics.DisableSSE42: |
|
|
// case HwIntrinsics.DisableBMI1:
|
|
|
Assert.False(Sse42.IsSupported); |
|
|
// Assert.False(Bmi1.IsSupported);
|
|
|
break; |
|
|
// break;
|
|
|
case HwIntrinsics.DisablePOPCNT: |
|
|
// case HwIntrinsics.DisableBMI2:
|
|
|
Assert.False(Popcnt.IsSupported); |
|
|
// Assert.False(Bmi2.IsSupported);
|
|
|
break; |
|
|
// break;
|
|
|
case HwIntrinsics.DisableAVX: |
|
|
// case HwIntrinsics.DisableLZCNT:
|
|
|
Assert.False(Avx.IsSupported); |
|
|
// Assert.False(Lzcnt.IsSupported);
|
|
|
break; |
|
|
// break;
|
|
|
case HwIntrinsics.DisableFMA: |
|
|
//#endif
|
|
|
Assert.False(Fma.IsSupported); |
|
|
// }
|
|
|
break; |
|
|
// }
|
|
|
case HwIntrinsics.DisableAVX2: |
|
|
|
|
|
Assert.False(Avx2.IsSupported); |
|
|
|
|
|
break; |
|
|
|
|
|
case HwIntrinsics.DisableBMI1: |
|
|
|
|
|
Assert.False(Bmi1.IsSupported); |
|
|
|
|
|
break; |
|
|
|
|
|
case HwIntrinsics.DisableBMI2: |
|
|
|
|
|
Assert.False(Bmi2.IsSupported); |
|
|
|
|
|
break; |
|
|
|
|
|
case HwIntrinsics.DisableLZCNT: |
|
|
|
|
|
Assert.False(Lzcnt.IsSupported); |
|
|
|
|
|
break; |
|
|
|
|
|
#endif
|
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
// foreach (HwIntrinsics intrinsic in (HwIntrinsics[])Enum.GetValues(typeof(HwIntrinsics)))
|
|
|
foreach (HwIntrinsics intrinsic in (HwIntrinsics[])Enum.GetValues(typeof(HwIntrinsics))) |
|
|
// {
|
|
|
{ |
|
|
// FeatureTestRunner.RunWithHwIntrinsicsFeature(AssertHwIntrinsicsFeatureDisabled, intrinsic);
|
|
|
FeatureTestRunner.RunWithHwIntrinsicsFeature(AssertHwIntrinsicsFeatureDisabled, intrinsic); |
|
|
// }
|
|
|
} |
|
|
// }
|
|
|
} |
|
|
|
|
|
|
|
|
// [Fact]
|
|
|
[Fact] |
|
|
// public void CanLimitHwIntrinsicFeaturesWithSerializableParam()
|
|
|
public void CanLimitHwIntrinsicFeaturesWithSerializableParam() |
|
|
// {
|
|
|
{ |
|
|
// static void AssertHwIntrinsicsFeatureDisabled(string serializable)
|
|
|
static void AssertHwIntrinsicsFeatureDisabled(string serializable) |
|
|
// {
|
|
|
{ |
|
|
// Assert.NotNull(serializable);
|
|
|
Assert.NotNull(serializable); |
|
|
// Assert.NotNull(FeatureTestRunner.Deserialize<FakeSerializable>(serializable));
|
|
|
Assert.NotNull(FeatureTestRunner.Deserialize<FakeSerializable>(serializable)); |
|
|
|
|
|
|
|
|
//#if SUPPORTS_RUNTIME_INTRINSICS
|
|
|
#if SUPPORTS_RUNTIME_INTRINSICS
|
|
|
// Assert.False(Sse.IsSupported);
|
|
|
Assert.False(Sse.IsSupported); |
|
|
//#endif
|
|
|
#endif
|
|
|
// }
|
|
|
} |
|
|
|
|
|
|
|
|
// foreach (HwIntrinsics intrinsic in (HwIntrinsics[])Enum.GetValues(typeof(HwIntrinsics)))
|
|
|
FeatureTestRunner.RunWithHwIntrinsicsFeature( |
|
|
// {
|
|
|
AssertHwIntrinsicsFeatureDisabled, |
|
|
// FeatureTestRunner.RunWithHwIntrinsicsFeature(
|
|
|
HwIntrinsics.DisableSSE, |
|
|
// AssertHwIntrinsicsFeatureDisabled,
|
|
|
new FakeSerializable()); |
|
|
// HwIntrinsics.DisableSSE,
|
|
|
} |
|
|
// new FakeSerializable());
|
|
|
|
|
|
// }
|
|
|
|
|
|
// }
|
|
|
|
|
|
|
|
|
|
|
|
// [Fact]
|
|
|
[Fact] |
|
|
// public void CanLimitHwIntrinsicFeaturesWithSerializableAndIntrinsicsParams()
|
|
|
public void CanLimitHwIntrinsicFeaturesWithSerializableAndIntrinsicsParams() |
|
|
// {
|
|
|
{ |
|
|
// static void AssertHwIntrinsicsFeatureDisabled(string serializable, string intrinsic)
|
|
|
static void AssertHwIntrinsicsFeatureDisabled(string serializable, string intrinsic) |
|
|
// {
|
|
|
{ |
|
|
// Assert.NotNull(serializable);
|
|
|
Assert.NotNull(serializable); |
|
|
// Assert.NotNull(FeatureTestRunner.Deserialize<FakeSerializable>(serializable));
|
|
|
Assert.NotNull(FeatureTestRunner.Deserialize<FakeSerializable>(serializable)); |
|
|
|
|
|
|
|
|
// switch ((HwIntrinsics)Enum.Parse(typeof(HwIntrinsics), intrinsic))
|
|
|
switch ((HwIntrinsics)Enum.Parse(typeof(HwIntrinsics), intrinsic)) |
|
|
// {
|
|
|
{ |
|
|
// case HwIntrinsics.DisableSIMD:
|
|
|
case HwIntrinsics.DisableSIMD: |
|
|
// Assert.False(Vector.IsHardwareAccelerated, nameof(Vector.IsHardwareAccelerated));
|
|
|
Assert.False(Vector.IsHardwareAccelerated, nameof(Vector.IsHardwareAccelerated)); |
|
|
// break;
|
|
|
break; |
|
|
//#if SUPPORTS_RUNTIME_INTRINSICS
|
|
|
#if SUPPORTS_RUNTIME_INTRINSICS
|
|
|
// case HwIntrinsics.DisableHWIntrinsic:
|
|
|
case HwIntrinsics.DisableHWIntrinsic: |
|
|
// Assert.False(Vector.IsHardwareAccelerated, nameof(Vector.IsHardwareAccelerated));
|
|
|
Assert.False(Sse.IsSupported); |
|
|
// break;
|
|
|
Assert.False(Sse2.IsSupported); |
|
|
// case HwIntrinsics.DisableSSE:
|
|
|
Assert.False(Aes.IsSupported); |
|
|
// Assert.False(Sse.IsSupported);
|
|
|
Assert.False(Pclmulqdq.IsSupported); |
|
|
// break;
|
|
|
Assert.False(Sse3.IsSupported); |
|
|
// case HwIntrinsics.DisableSSE2:
|
|
|
Assert.False(Ssse3.IsSupported); |
|
|
// Assert.False(Sse2.IsSupported);
|
|
|
Assert.False(Sse41.IsSupported); |
|
|
// break;
|
|
|
Assert.False(Sse42.IsSupported); |
|
|
// case HwIntrinsics.DisableAES:
|
|
|
Assert.False(Popcnt.IsSupported); |
|
|
// Assert.False(Aes.IsSupported);
|
|
|
Assert.False(Avx.IsSupported); |
|
|
// break;
|
|
|
Assert.False(Fma.IsSupported); |
|
|
// case HwIntrinsics.DisablePCLMULQDQ:
|
|
|
Assert.False(Avx2.IsSupported); |
|
|
// Assert.False(Pclmulqdq.IsSupported);
|
|
|
Assert.False(Bmi1.IsSupported); |
|
|
// break;
|
|
|
Assert.False(Bmi2.IsSupported); |
|
|
// case HwIntrinsics.DisableSSE3:
|
|
|
Assert.False(Lzcnt.IsSupported); |
|
|
// Assert.False(Sse3.IsSupported);
|
|
|
break; |
|
|
// break;
|
|
|
case HwIntrinsics.DisableSSE: |
|
|
// case HwIntrinsics.DisableSSSE3:
|
|
|
Assert.False(Sse.IsSupported); |
|
|
// Assert.False(Ssse3.IsSupported);
|
|
|
break; |
|
|
// break;
|
|
|
case HwIntrinsics.DisableSSE2: |
|
|
// case HwIntrinsics.DisableSSE41:
|
|
|
Assert.False(Sse2.IsSupported); |
|
|
// Assert.False(Sse41.IsSupported);
|
|
|
break; |
|
|
// break;
|
|
|
case HwIntrinsics.DisableAES: |
|
|
// case HwIntrinsics.DisableSSE42:
|
|
|
Assert.False(Aes.IsSupported); |
|
|
// Assert.False(Sse42.IsSupported);
|
|
|
break; |
|
|
// break;
|
|
|
case HwIntrinsics.DisablePCLMULQDQ: |
|
|
// case HwIntrinsics.DisablePOPCNT:
|
|
|
Assert.False(Pclmulqdq.IsSupported); |
|
|
// Assert.False(Popcnt.IsSupported);
|
|
|
break; |
|
|
// break;
|
|
|
case HwIntrinsics.DisableSSE3: |
|
|
// case HwIntrinsics.DisableAVX:
|
|
|
Assert.False(Sse3.IsSupported); |
|
|
// Assert.False(Avx.IsSupported);
|
|
|
break; |
|
|
// break;
|
|
|
case HwIntrinsics.DisableSSSE3: |
|
|
// case HwIntrinsics.DisableFMA:
|
|
|
Assert.False(Ssse3.IsSupported); |
|
|
// Assert.False(Fma.IsSupported);
|
|
|
break; |
|
|
// break;
|
|
|
case HwIntrinsics.DisableSSE41: |
|
|
// case HwIntrinsics.DisableAVX2:
|
|
|
Assert.False(Sse41.IsSupported); |
|
|
// Assert.False(Avx2.IsSupported);
|
|
|
break; |
|
|
// break;
|
|
|
case HwIntrinsics.DisableSSE42: |
|
|
// case HwIntrinsics.DisableBMI1:
|
|
|
Assert.False(Sse42.IsSupported); |
|
|
// Assert.False(Bmi1.IsSupported);
|
|
|
break; |
|
|
// break;
|
|
|
case HwIntrinsics.DisablePOPCNT: |
|
|
// case HwIntrinsics.DisableBMI2:
|
|
|
Assert.False(Popcnt.IsSupported); |
|
|
// Assert.False(Bmi2.IsSupported);
|
|
|
break; |
|
|
// break;
|
|
|
case HwIntrinsics.DisableAVX: |
|
|
// case HwIntrinsics.DisableLZCNT:
|
|
|
Assert.False(Avx.IsSupported); |
|
|
// Assert.False(Lzcnt.IsSupported);
|
|
|
break; |
|
|
// break;
|
|
|
case HwIntrinsics.DisableFMA: |
|
|
//#endif
|
|
|
Assert.False(Fma.IsSupported); |
|
|
// }
|
|
|
break; |
|
|
// }
|
|
|
case HwIntrinsics.DisableAVX2: |
|
|
|
|
|
Assert.False(Avx2.IsSupported); |
|
|
|
|
|
break; |
|
|
|
|
|
case HwIntrinsics.DisableBMI1: |
|
|
|
|
|
Assert.False(Bmi1.IsSupported); |
|
|
|
|
|
break; |
|
|
|
|
|
case HwIntrinsics.DisableBMI2: |
|
|
|
|
|
Assert.False(Bmi2.IsSupported); |
|
|
|
|
|
break; |
|
|
|
|
|
case HwIntrinsics.DisableLZCNT: |
|
|
|
|
|
Assert.False(Lzcnt.IsSupported); |
|
|
|
|
|
break; |
|
|
|
|
|
#endif
|
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
// foreach (HwIntrinsics intrinsic in (HwIntrinsics[])Enum.GetValues(typeof(HwIntrinsics)))
|
|
|
foreach (HwIntrinsics intrinsic in (HwIntrinsics[])Enum.GetValues(typeof(HwIntrinsics))) |
|
|
// {
|
|
|
{ |
|
|
// FeatureTestRunner.RunWithHwIntrinsicsFeature(AssertHwIntrinsicsFeatureDisabled, intrinsic, new FakeSerializable());
|
|
|
FeatureTestRunner.RunWithHwIntrinsicsFeature(AssertHwIntrinsicsFeatureDisabled, intrinsic, new FakeSerializable()); |
|
|
// }
|
|
|
} |
|
|
// }
|
|
|
} |
|
|
|
|
|
|
|
|
public class FakeSerializable : IXunitSerializable |
|
|
public class FakeSerializable : IXunitSerializable |
|
|
{ |
|
|
{ |
|
|
|