diff --git a/Source/Engine/Platform/Defines.h b/Source/Engine/Platform/Defines.h
index 40b250983..7f79bba81 100644
--- a/Source/Engine/Platform/Defines.h
+++ b/Source/Engine/Platform/Defines.h
@@ -221,6 +221,15 @@ API_ENUM() enum class ArchitectureType
#if defined(__SSE4_2__)
#define PLATFORM_SIMD_SSE4_2 1
#endif
+#if defined(__AVX__)
+#define PLATFORM_SIMD_AVX 1
+#endif
+#if defined(__AVX2__)
+#define PLATFORM_SIMD_AVX2 1
+#endif
+#if defined(__AVX512F__) && defined(__AVX512CD__) && defined(__AVX512BW__) && defined(__AVX512DQ__) && defined(__AVX512VL__)
+#define PLATFORM_SIMD_AVX512 1
+#endif
#endif
#if defined(_M_ARM) || defined(__ARM_NEON__) || defined(__ARM_NEON)
#define PLATFORM_SIMD_NEON 1
diff --git a/Source/Tools/Flax.Build/Build/NativeCpp/CompileEnvironment.cs b/Source/Tools/Flax.Build/Build/NativeCpp/CompileEnvironment.cs
index eac85e17e..75427995c 100644
--- a/Source/Tools/Flax.Build/Build/NativeCpp/CompileEnvironment.cs
+++ b/Source/Tools/Flax.Build/Build/NativeCpp/CompileEnvironment.cs
@@ -84,6 +84,36 @@ namespace Flax.Build.NativeCpp
Latest,
}
+ ///
+ /// The CPU architecture / instruction set.
+ ///
+ public enum CpuArchitecture
+ {
+ ///
+ /// Default architecture (unspecified)
+ ///
+ Default,
+
+ // X86-64 instruction sets:
+
+ ///
+ /// AVX
+ ///
+ AVX,
+
+ ///
+ /// AVX2
+ ///
+ AVX2,
+
+ ///
+ /// AVX512
+ ///
+ AVX512,
+
+ // TODO: Add other instruction sets for ARM and other platforms.
+ }
+
///
/// The C++ compilation environment required to build source files in the native modules.
///
@@ -174,6 +204,11 @@ namespace Flax.Build.NativeCpp
///
public bool IntrinsicFunctions = false;
+ ///
+ /// The minimum target CPU architecture.
+ ///
+ public CpuArchitecture Architecture = CpuArchitecture.Default;
+
///
/// Enables buffer security checks.
///
@@ -236,6 +271,7 @@ namespace Flax.Build.NativeCpp
RuntimeChecks = RuntimeChecks,
StringPooling = StringPooling,
IntrinsicFunctions = IntrinsicFunctions,
+ Architecture = Architecture,
BufferSecurityCheck = BufferSecurityCheck,
TreatWarningsAsErrors = TreatWarningsAsErrors,
PrecompiledHeaderUsage = PrecompiledHeaderUsage,
diff --git a/Source/Tools/Flax.Build/Platforms/Apple/AppleToolchain.cs b/Source/Tools/Flax.Build/Platforms/Apple/AppleToolchain.cs
index 8461d6aac..7c002d23f 100644
--- a/Source/Tools/Flax.Build/Platforms/Apple/AppleToolchain.cs
+++ b/Source/Tools/Flax.Build/Platforms/Apple/AppleToolchain.cs
@@ -124,6 +124,7 @@ namespace Flax.Build.Platforms
switch (Architecture)
{
case TargetArchitecture.x64:
+ // TODO: compileEnvironment.Architecture?
commonArgs.Add("-msse2");
break;
}
diff --git a/Source/Tools/Flax.Build/Platforms/Unix/UnixToolchain.cs b/Source/Tools/Flax.Build/Platforms/Unix/UnixToolchain.cs
index b03dcbb90..ace2a4b39 100644
--- a/Source/Tools/Flax.Build/Platforms/Unix/UnixToolchain.cs
+++ b/Source/Tools/Flax.Build/Platforms/Unix/UnixToolchain.cs
@@ -348,6 +348,25 @@ namespace Flax.Build.Platforms
break;
}
+ if (Architecture == TargetArchitecture.x86 || Architecture == TargetArchitecture.x64)
+ {
+ switch (compileEnvironment.Architecture)
+ {
+ case CpuArchitecture.Default:
+ //commonArgs.Add("-march=x86-64");
+ break;
+ case CpuArchitecture.AVX:
+ commonArgs.Add("-march=sandybridge");
+ break;
+ case CpuArchitecture.AVX2:
+ commonArgs.Add("-march=x86-64-v3");
+ break;
+ case CpuArchitecture.AVX512:
+ commonArgs.Add("-march=x86-64-v4");
+ break;
+ }
+ }
+
commonArgs.Add("-Wdelete-non-virtual-dtor");
commonArgs.Add("-fno-math-errno");
commonArgs.Add("-fdiagnostics-format=msvc");
diff --git a/Source/Tools/Flax.Build/Platforms/Windows/WindowsToolchainBase.cs b/Source/Tools/Flax.Build/Platforms/Windows/WindowsToolchainBase.cs
index c1cdcb0ee..418938c9e 100644
--- a/Source/Tools/Flax.Build/Platforms/Windows/WindowsToolchainBase.cs
+++ b/Source/Tools/Flax.Build/Platforms/Windows/WindowsToolchainBase.cs
@@ -469,6 +469,26 @@ namespace Flax.Build.Platforms
if (compileEnvironment.IntrinsicFunctions)
commonArgs.Add("/Oi");
+ // Minimum target architecture
+ if (Architecture == TargetArchitecture.x64)
+ {
+ switch (compileEnvironment.Architecture)
+ {
+ case CpuArchitecture.AVX:
+ commonArgs.Add("/arch:AVX");
+ break;
+ case CpuArchitecture.AVX2:
+ commonArgs.Add("/arch:AVX2");
+ break;
+ case CpuArchitecture.AVX512:
+ commonArgs.Add("/arch:AVX512");
+ break;
+ case CpuArchitecture.Default:
+ default:
+ break;
+ }
+ }
+
// Enable Function-Level Linking
if (compileEnvironment.FunctionLevelLinking)
commonArgs.Add("/Gy");
diff --git a/Source/Tools/Flax.Build/Projects/VisualStudio/VCProjectGenerator.cs b/Source/Tools/Flax.Build/Projects/VisualStudio/VCProjectGenerator.cs
index 13c728b30..b653c8d18 100644
--- a/Source/Tools/Flax.Build/Projects/VisualStudio/VCProjectGenerator.cs
+++ b/Source/Tools/Flax.Build/Projects/VisualStudio/VCProjectGenerator.cs
@@ -327,7 +327,7 @@ namespace Flax.Build.Projects.VisualStudio
vcFiltersFileContent.AppendLine(" ");
// IntelliSense information
-
+ var additionalDefinitions = project.Defines.ToList();
var additionalOptions = new List();
switch (project.Configurations[0].TargetBuildOptions.CompileEnv.CppVersion)
{
@@ -345,8 +345,28 @@ namespace Flax.Build.Projects.VisualStudio
break;
}
+ switch (project.Configurations[0].TargetBuildOptions.CompileEnv.Architecture)
+ {
+ case CpuArchitecture.Default:
+ break;
+ case CpuArchitecture.AVX512:
+ additionalDefinitions.Add("__AVX512F__");
+ additionalDefinitions.Add("__AVX512CD__");
+ additionalDefinitions.Add("__AVX512BW__");
+ additionalDefinitions.Add("__AVX512DQ__");
+ additionalDefinitions.Add("__AVX512VL__");
+ goto case CpuArchitecture.AVX2;
+ case CpuArchitecture.AVX2:
+ additionalDefinitions.Add("__AVX2__");
+ goto case CpuArchitecture.AVX;
+ case CpuArchitecture.AVX:
+ additionalDefinitions.Add("__AVX__");
+ break;
+
+ }
+
vcProjectFileContent.AppendLine(" ");
- vcProjectFileContent.AppendLine(string.Format(" $(NMakePreprocessorDefinitions){0}", (project.Defines.Count > 0 ? (";" + string.Join(";", project.Defines)) : "")));
+ vcProjectFileContent.AppendLine(string.Format(" $(NMakePreprocessorDefinitions){0}", (additionalDefinitions.Count > 0 ? (";" + string.Join(";", additionalDefinitions)) : "")));
vcProjectFileContent.AppendLine(string.Format(" $(NMakeIncludeSearchPath){0}", (project.SearchPaths.Length > 0 ? (";" + string.Join(";", project.SearchPaths)) : "")));
vcProjectFileContent.AppendLine(" $(NMakeForcedIncludes)");
vcProjectFileContent.AppendLine(" $(NMakeAssemblySearchPath)");