Add platform detection.

This commit is contained in:
scorpioblood 2024-05-23 21:38:12 +02:00
parent 50383903ae
commit 78ebbb11b1
3 changed files with 536 additions and 0 deletions

View File

@ -0,0 +1,82 @@
// This file includes the necessary header for vectorization intrinsics. If no specifics are defined SSE4.2 is used.
//
// ARM is not supported.
#include "Core/public/Math/SIMD/Platform.h"
#include <nmmintrin.h> // SSE4.2
#ifdef __AVX__
# include <immintrin.h>
#endif
namespace Phanes::Core::Math::SIMD
{
// XMM Register wrapper for 4x1 floats
struct VectorRegister4f
{
public:
__m128 data;
};
typedef VectorRegister4f VectorRegister4f32;
// XMM Register wrapper for 2x1 doubles
struct VectorRegister2d
{
public:
__m128d data;
};
typedef VectorRegister2d VectorRegister2f64;
// XMM Register wrapper for 4x1 integers
struct VectorRegister4i
{
public:
__m128i data;
};
typedef VectorRegister4i VectorRegister4i32;
# ifdef __AVX__
// AVX specific types
// XMM Register wrapper for 4x1 doubles
struct VectorRegister4d
{
public:
__m256d data;
};
typedef VectorRegister4d VectorRegister4f64;
# endif
# ifdef __AVX2__
// AVX2 specific types
// XMM Register wrapper for 4x1 doubles
struct VectorRegister4i64
{
public:
__m256i data;
};
# endif
}

View File

@ -0,0 +1,227 @@
// Platform / Compiler detection.
#pragma once
// Set platform MACRO depending on defined build
// User defines build platform
#ifdef P_WIN_BUILD
#define P_PLATFORM 0
#elif P_LINUX_BUILD
#define P_PLATFORM 1
#elif P_APPLE_BUILD
#define P_PLATFORM 2
#elif P_PS5_BUILD
#define P_PLATFORM 3
#else
#error Your target system is either not supported, or you have yet to define it.
#endif
// Set compiler depending on defined compiler
// Compiler macro definition
// ID's defines like [0-9][0-x]
// First bracket is compiler, second is the version of the compiler.
// Visual C++
#define P_COMPILER_VC22 001
#define P_COMPILER_VC19 002
#define P_COMPILER_VC17 003
#define P_COMPILER_VC15 004
#define P_COMPILER_VC13 005
#define P_COMPILER_VC12 006
#define P_COMPILER_VC10 007
#define P_COMPILER_VC08 008
#define P_COMPILER_VC05 009
#define P_COMPILER_VC03 010
#define P_COMPILER_VC02 011
#define P_COMPILER_VCSP 012
// Clang
#define P_COMPILER_CLANG34 101
#define P_COMPILER_CLANG35 102
#define P_COMPILER_CLANG36 103
#define P_COMPILER_CLANG37 104
#define P_COMPILER_CLANG38 105
#define P_COMPILER_CLANG39 106
#define P_COMPILER_CLANG4 107
#define P_COMPILER_CLANG5 108
#define P_COMPILER_CLANG6 109
#define P_COMPILER_CLANG7 110
#define P_COMPILER_CLANG8 111
#define P_COMPILER_CLANG9 112
#define P_COMPILER_CLANG10 113
#define P_COMPILER_CLANG11 114
#define P_COMPILER_CLANG12 115
#define P_COMPILER_CLANG13 116
#define P_COMPILER_CLANG14 117
#define P_COMPILER_CLANG15 118
#define P_COMPILER_CLANG16 119
#define P_COMPILER_CLANG17 120
#define P_COMPILER_CLANG18 121
#define P_COMPILER_CLANG19 122
// G++
#define P_COMPILER_GCC46 201
#define P_COMPILER_GCC47 202
#define P_COMPILER_GCC48 203
#define P_COMPILER_GCC49 204
#define P_COMPILER_GCC5 205
#define P_COMPILER_GCC6 206
#define P_COMPILER_GCC61 207
#define P_COMPILER_GCC7 208
#define P_COMPILER_GCC8 209
#define P_COMPILER_GCC9 210
#define P_COMPILER_GCC10 211
#define P_COMPILER_GCC11 212
#define P_COMPILER_GCC12 213
#define P_COMPILER_GCC13 214
#define P_COMPILER_GCC14 215
// Intel C++
#define P_COMPILER_INTEL14 301
#define P_COMPILER_INTEL15 302
#define P_COMPILER_INTEL16 303
#define P_COMPILER_INTEL17 304
#define P_COMPILER_INTEL18 305
#define P_COMPILER_INTEL19 306
#define P_COMPILER_INTEL21 307
// Visual studio
#ifdef _MSC_VER
# if _MSC_VER >= 1930
# define P_COMPILER P_COMPILER_VC22
# elif _MSC_VER >= 1920
# define P_COMPILER P_COMPILER_VC19
# elif _MSC_VER >= 1910
# define P_COMPILER P_COMPILER_VC17
# elif _MSC_VER >= 1900
# define P_COMPILER P_COMPILER_VC15
# elif _MSC_VER >= 1800
# define P_COMPILER P_COMPILER_VC13
# elif _MSC_VER >= 1700
# define P_COMPILER P_COMPILER_VC12
# elif _MSC_VER >= 1600
# define P_COMPILER P_COMPILER_VC10
# elif _MSC_VER >= 1500
# define P_COMPILER P_COMPILER_VC08
# elif _MSC_VER >= 1400
# define P_COMPILER P_COMPILER_VC05
# elif _MSC_VER >= 1310
# define P_COMPILER P_COMPILER_VC03
# elif _MSC_VER >= 1300
# define P_COMPILER P_COMPILER_VC02
# elif _MSC_VER >= 1200
# define P_COMPILER P_COMPILER_VCSP
# endif
// Clang
#elif (defined(__clang__))
# if defined(__apple_build_version__)
#
# if (__clang_major__ < 6)
# error "GLM requires Clang 3.4 / Apple Clang 6.0 or higher"
# elif __clang_major__ == 6 && __clang_minor__ == 0
# define P_COMPILER P_COMPILER_CLANG35
# elif __clang_major__ == 6 && __clang_minor__ >= 1
# define P_COMPILER P_COMPILER_CLANG36
# elif __clang_major__ >= 7
# define P_COMPILER P_COMPILER_CLANG37
# endif
# else
# if ((__clang_major__ == 3) && (__clang_minor__ < 4)) || (__clang_major__ < 3)
# error "GLM requires Clang 3.4 or higher"
# elif __clang_major__ == 3 && __clang_minor__ == 4
# define P_COMPILER P_COMPILER_CLANG34
# elif __clang_major__ == 3 && __clang_minor__ == 5
# define P_COMPILER P_COMPILER_CLANG35
# elif __clang_major__ == 3 && __clang_minor__ == 6
# define P_COMPILER P_COMPILER_CLANG36
# elif __clang_major__ == 3 && __clang_minor__ == 7
# define P_COMPILER P_COMPILER_CLANG37
# elif __clang_major__ == 3 && __clang_minor__ == 8
# define P_COMPILER P_COMPILER_CLANG38
# elif __clang_major__ == 3 && __clang_minor__ >= 9
# define P_COMPILER P_COMPILER_CLANG39
# elif __clang_major__ == 4 && __clang_minor__ == 0
# define P_COMPILER P_COMPILER_CLANG4
# elif __clang_major__ == 5
# define P_COMPILER P_COMPILER_CLANG5
# elif __clang_major__ == 6
# define P_COMPILER P_COMPILER_CLANG6
# elif __clang_major__ == 7
# define P_COMPILER P_COMPILER_CLANG7
# elif __clang_major__ == 8
# define P_COMPILER P_COMPILER_CLANG8
# elif __clang_major__ == 9
# define P_COMPILER P_COMPILER_CLANG9
# elif __clang_major__ == 10
# define P_COMPILER P_COMPILER_CLANG10
# elif __clang_major__ == 11
# define P_COMPILER P_COMPILER_CLANG11
# elif __clang_major__ == 12
# define P_COMPILER P_COMPILER_CLANG12
# elif __clang_major__ == 13
# define P_COMPILER P_COMPILER_CLANG13
# elif __clang_major__ == 14
# define P_COMPILER P_COMPILER_CLANG14
# elif __clang_major__ == 15
# define P_COMPILER P_COMPILER_CLANG15
# elif __clang_major__ == 16
# define P_COMPILER P_COMPILER_CLANG16
# elif __clang_major__ == 17
# define P_COMPILER P_COMPILER_CLANG17
# elif __clang_major__ == 18
# define P_COMPILER P_COMPILER_CLANG18
# elif __clang_major__ >= 19
# define P_COMPILER P_COMPILER_CLANG19
# endif
# endif
// G++
#elif defined(__GNUC__) || defined(__MINGW32__)
# if __GNUC__ >= 14
# define P_COMPILER P_COMPILER_GCC14
# elif __GNUC__ >= 13
# define P_COMPILER P_COMPILER_GCC13
# elif __GNUC__ >= 12
# define P_COMPILER P_COMPILER_GCC12
# elif __GNUC__ >= 11
# define P_COMPILER P_COMPILER_GCC11
# elif __GNUC__ >= 10
# define P_COMPILER P_COMPILER_GCC10
# elif __GNUC__ >= 9
# define P_COMPILER P_COMPILER_GCC9
# elif __GNUC__ >= 8
# define P_COMPILER P_COMPILER_GCC8
# elif __GNUC__ >= 7
# define P_COMPILER P_COMPILER_GCC7
# elif __GNUC__ >= 6
# define P_COMPILER P_COMPILER_GCC6
# elif __GNUC__ >= 5
# define P_COMPILER P_COMPILER_GCC5
# elif __GNUC__ == 4 && __GNUC_MINOR__ >= 9
# define P_COMPILER P_COMPILER_GCC49
# elif __GNUC__ == 4 && __GNUC_MINOR__ >= 8
# define P_COMPILER P_COMPILER_GCC48
# elif __GNUC__ == 4 && __GNUC_MINOR__ >= 7
# define P_COMPILER P_COMPILER_GCC47
# elif __GNUC__ == 4 && __GNUC_MINOR__ >= 6
# define P_COMPILER P_COMPILER_GCC46
# elif ((__GNUC__ == 4) && (__GNUC_MINOR__ < 6)) || (__GNUC__ < 4)
# error PhanesEngine does not support your compiler.
# endif
#elif defined(__CUDACC__)
# error CUDA C++ is not supported by PhanesEngine
#endif

View File

@ -0,0 +1,227 @@
// Platform / Compiler detection.
#pragma once
// Set platform MACRO depending on defined build
// User defines build platform
#ifdef P_WIN_BUILD
#define P_PLATFORM 0
#elif P_LINUX_BUILD
#define P_PLATFORM 1
#elif P_APPLE_BUILD
#define P_PLATFORM 2
#elif P_PS5_BUILD
#define P_PLATFORM 3
#else
#error Your target system is either not supported, or you have yet to define it.
#endif
// Set compiler depending on defined compiler
// Compiler macro definition
// ID's defines like [0-9][0-x]
// First bracket is compiler, second is the version of the compiler.
// Visual C++
#define P_COMPILER_VC22 001
#define P_COMPILER_VC19 002
#define P_COMPILER_VC17 003
#define P_COMPILER_VC15 004
#define P_COMPILER_VC13 005
#define P_COMPILER_VC12 006
#define P_COMPILER_VC10 007
#define P_COMPILER_VC08 008
#define P_COMPILER_VC05 009
#define P_COMPILER_VC03 010
#define P_COMPILER_VC02 011
#define P_COMPILER_VCSP 012
// Clang
#define P_COMPILER_CLANG34 101
#define P_COMPILER_CLANG35 102
#define P_COMPILER_CLANG36 103
#define P_COMPILER_CLANG37 104
#define P_COMPILER_CLANG38 105
#define P_COMPILER_CLANG39 106
#define P_COMPILER_CLANG4 107
#define P_COMPILER_CLANG5 108
#define P_COMPILER_CLANG6 109
#define P_COMPILER_CLANG7 110
#define P_COMPILER_CLANG8 111
#define P_COMPILER_CLANG9 112
#define P_COMPILER_CLANG10 113
#define P_COMPILER_CLANG11 114
#define P_COMPILER_CLANG12 115
#define P_COMPILER_CLANG13 116
#define P_COMPILER_CLANG14 117
#define P_COMPILER_CLANG15 118
#define P_COMPILER_CLANG16 119
#define P_COMPILER_CLANG17 120
#define P_COMPILER_CLANG18 121
#define P_COMPILER_CLANG19 122
// G++
#define P_COMPILER_GCC46 201
#define P_COMPILER_GCC47 202
#define P_COMPILER_GCC48 203
#define P_COMPILER_GCC49 204
#define P_COMPILER_GCC5 205
#define P_COMPILER_GCC6 206
#define P_COMPILER_GCC61 207
#define P_COMPILER_GCC7 208
#define P_COMPILER_GCC8 209
#define P_COMPILER_GCC9 210
#define P_COMPILER_GCC10 211
#define P_COMPILER_GCC11 212
#define P_COMPILER_GCC12 213
#define P_COMPILER_GCC13 214
#define P_COMPILER_GCC14 215
// Intel C++
#define P_COMPILER_INTEL14 301
#define P_COMPILER_INTEL15 302
#define P_COMPILER_INTEL16 303
#define P_COMPILER_INTEL17 304
#define P_COMPILER_INTEL18 305
#define P_COMPILER_INTEL19 306
#define P_COMPILER_INTEL21 307
// Visual studio
#ifdef _MSC_VER
# if _MSC_VER >= 1930
# define P_COMPILER P_COMPILER_VC22
# elif _MSC_VER >= 1920
# define P_COMPILER P_COMPILER_VC19
# elif _MSC_VER >= 1910
# define P_COMPILER P_COMPILER_VC17
# elif _MSC_VER >= 1900
# define P_COMPILER P_COMPILER_VC15
# elif _MSC_VER >= 1800
# define P_COMPILER P_COMPILER_VC13
# elif _MSC_VER >= 1700
# define P_COMPILER P_COMPILER_VC12
# elif _MSC_VER >= 1600
# define P_COMPILER P_COMPILER_VC10
# elif _MSC_VER >= 1500
# define P_COMPILER P_COMPILER_VC08
# elif _MSC_VER >= 1400
# define P_COMPILER P_COMPILER_VC05
# elif _MSC_VER >= 1310
# define P_COMPILER P_COMPILER_VC03
# elif _MSC_VER >= 1300
# define P_COMPILER P_COMPILER_VC02
# elif _MSC_VER >= 1200
# define P_COMPILER P_COMPILER_VCSP
# endif
// Clang
#elif (defined(__clang__))
# if defined(__apple_build_version__)
#
# if (__clang_major__ < 6)
# error "GLM requires Clang 3.4 / Apple Clang 6.0 or higher"
# elif __clang_major__ == 6 && __clang_minor__ == 0
# define P_COMPILER P_COMPILER_CLANG35
# elif __clang_major__ == 6 && __clang_minor__ >= 1
# define P_COMPILER P_COMPILER_CLANG36
# elif __clang_major__ >= 7
# define P_COMPILER P_COMPILER_CLANG37
# endif
# else
# if ((__clang_major__ == 3) && (__clang_minor__ < 4)) || (__clang_major__ < 3)
# error "GLM requires Clang 3.4 or higher"
# elif __clang_major__ == 3 && __clang_minor__ == 4
# define P_COMPILER P_COMPILER_CLANG34
# elif __clang_major__ == 3 && __clang_minor__ == 5
# define P_COMPILER P_COMPILER_CLANG35
# elif __clang_major__ == 3 && __clang_minor__ == 6
# define P_COMPILER P_COMPILER_CLANG36
# elif __clang_major__ == 3 && __clang_minor__ == 7
# define P_COMPILER P_COMPILER_CLANG37
# elif __clang_major__ == 3 && __clang_minor__ == 8
# define P_COMPILER P_COMPILER_CLANG38
# elif __clang_major__ == 3 && __clang_minor__ >= 9
# define P_COMPILER P_COMPILER_CLANG39
# elif __clang_major__ == 4 && __clang_minor__ == 0
# define P_COMPILER P_COMPILER_CLANG4
# elif __clang_major__ == 5
# define P_COMPILER P_COMPILER_CLANG5
# elif __clang_major__ == 6
# define P_COMPILER P_COMPILER_CLANG6
# elif __clang_major__ == 7
# define P_COMPILER P_COMPILER_CLANG7
# elif __clang_major__ == 8
# define P_COMPILER P_COMPILER_CLANG8
# elif __clang_major__ == 9
# define P_COMPILER P_COMPILER_CLANG9
# elif __clang_major__ == 10
# define P_COMPILER P_COMPILER_CLANG10
# elif __clang_major__ == 11
# define P_COMPILER P_COMPILER_CLANG11
# elif __clang_major__ == 12
# define P_COMPILER P_COMPILER_CLANG12
# elif __clang_major__ == 13
# define P_COMPILER P_COMPILER_CLANG13
# elif __clang_major__ == 14
# define P_COMPILER P_COMPILER_CLANG14
# elif __clang_major__ == 15
# define P_COMPILER P_COMPILER_CLANG15
# elif __clang_major__ == 16
# define P_COMPILER P_COMPILER_CLANG16
# elif __clang_major__ == 17
# define P_COMPILER P_COMPILER_CLANG17
# elif __clang_major__ == 18
# define P_COMPILER P_COMPILER_CLANG18
# elif __clang_major__ >= 19
# define P_COMPILER P_COMPILER_CLANG19
# endif
# endif
// G++
#elif defined(__GNUC__) || defined(__MINGW32__)
# if __GNUC__ >= 14
# define P_COMPILER P_COMPILER_GCC14
# elif __GNUC__ >= 13
# define P_COMPILER P_COMPILER_GCC13
# elif __GNUC__ >= 12
# define P_COMPILER P_COMPILER_GCC12
# elif __GNUC__ >= 11
# define P_COMPILER P_COMPILER_GCC11
# elif __GNUC__ >= 10
# define P_COMPILER P_COMPILER_GCC10
# elif __GNUC__ >= 9
# define P_COMPILER P_COMPILER_GCC9
# elif __GNUC__ >= 8
# define P_COMPILER P_COMPILER_GCC8
# elif __GNUC__ >= 7
# define P_COMPILER P_COMPILER_GCC7
# elif __GNUC__ >= 6
# define P_COMPILER P_COMPILER_GCC6
# elif __GNUC__ >= 5
# define P_COMPILER P_COMPILER_GCC5
# elif __GNUC__ == 4 && __GNUC_MINOR__ >= 9
# define P_COMPILER P_COMPILER_GCC49
# elif __GNUC__ == 4 && __GNUC_MINOR__ >= 8
# define P_COMPILER P_COMPILER_GCC48
# elif __GNUC__ == 4 && __GNUC_MINOR__ >= 7
# define P_COMPILER P_COMPILER_GCC47
# elif __GNUC__ == 4 && __GNUC_MINOR__ >= 6
# define P_COMPILER P_COMPILER_GCC46
# elif ((__GNUC__ == 4) && (__GNUC_MINOR__ < 6)) || (__GNUC__ < 4)
# error PhanesEngine does not support your compiler.
# endif
#elif defined(__CUDACC__)
# error CUDA C++ is not supported by PhanesEngine
#endif