diff --git a/avx512_build_setup/ADDITIONAL_README_FOR_AVX512_Version.md b/avx512_build_setup/ADDITIONAL_README_FOR_AVX512_Version.md new file mode 100644 index 000000000..0210dc2a9 --- /dev/null +++ b/avx512_build_setup/ADDITIONAL_README_FOR_AVX512_Version.md @@ -0,0 +1,62 @@ +Notes for AVX512 Windows build +============================== + +The visual studio version was updated from vs2015 to vs2022 to enable support of AVX512 Version +1. Set the configuration in solution file to Release-AVX512 | x64 +2. Select the 'Generic POV-Ray > povbase' project and expand 'Backend Headers', then open the + file `build.h`(source/base/build.h) listed within it.In it replace with name + and email of person who builds the code in `BUILT_BY` flag and comment the #error directive (line 129) + +Steps for console build: +1. In syspovconfig.h(windows/povconfig/syspovconfig.h) uncomment the #define _CONSOLE. (line 56) +2. Build the solution file and in the vs2022/bin64 folder we can run the POVRAY examples with povconsole64-avx512.exe. +``` + General command example - povconsole64-avx512.exe +Ibenchmark.pov + Single worker thread - povconsole64-avx512.exe +WT1 benchmark.pov + Output image - benchmark.png +``` +Results with the AVX512 version has been attached in the same folder. + +Notes for UNIX build +==================== + +Dependencies for unix build +``` + libboost-dev + libboost-date-time-dev + libboost-thread-dev + libz-dev + libpng-dev + libjpeg-dev + libtiff-dev + libopenexr-dev + pkg-config (if its already not there) +``` + +Steps : +Generating configure and building the code : +``` + % cd unix/ + % ./prebuild.sh + % cd ../ + % ./configure COMPILED_BY="your name " + % make +``` + +To build with icpc : +``` + % source /opt/intel/oneapi/setvars.sh + % cd unix/ + % ./prebuild.sh + % cd ../ + % ./configure COMPILED_BY="your name " CXX=icpc + % make +``` + +Sample commands (inside the unix folder) : +``` + General command example - ./povray +Ibenchmark.pov + Single worker thread - ./povray +WT1 benchmark.pov + Output image - benchmark.png +``` + diff --git a/avx512_build_setup/POVRAY Compiled Results - AVX512 - AMD 7600X and Intel I5-1035 G1 with +WT1 Option.xlsx b/avx512_build_setup/POVRAY Compiled Results - AVX512 - AMD 7600X and Intel I5-1035 G1 with +WT1 Option.xlsx new file mode 100644 index 000000000..4aa0bbb02 Binary files /dev/null and b/avx512_build_setup/POVRAY Compiled Results - AVX512 - AMD 7600X and Intel I5-1035 G1 with +WT1 Option.xlsx differ diff --git a/libraries/boost/libs/thread/src/win32/tss_pe.cpp b/libraries/boost/libs/thread/src/win32/tss_pe.cpp index 841f98b87..eec7043d8 100644 --- a/libraries/boost/libs/thread/src/win32/tss_pe.cpp +++ b/libraries/boost/libs/thread/src/win32/tss_pe.cpp @@ -112,7 +112,7 @@ extern BOOL (WINAPI * const _pDefaultRawDllMainOrig)(HANDLE, DWORD, LPVOID) = NU //Definitions required by implementation - #if (_MSC_VER < 1300) || (_MSC_VER > 1900) // 1300 == VC++ 7.0, 1900 == VC++ 14.0 + #if (_MSC_VER < 1300) || (_MSC_VER > 1941) // 1300 == VC++ 7.0, 1941 == VC++ 14.32 typedef void (__cdecl *_PVFV)(); #define INIRETSUCCESS #define PVAPI void __cdecl diff --git a/libraries/openexr/IlmImf/ImfAttribute.cpp b/libraries/openexr/IlmImf/ImfAttribute.cpp index cb4ac3607..ecee8dda0 100644 --- a/libraries/openexr/IlmImf/ImfAttribute.cpp +++ b/libraries/openexr/IlmImf/ImfAttribute.cpp @@ -63,14 +63,14 @@ Attribute::~Attribute () {} namespace { -struct NameCompare: std::binary_function -{ - bool - operator () (const char *x, const char *y) const + struct NameCompare { - return strcmp (x, y) < 0; - } -}; + bool + operator () (const char* x, const char* y) const + { + return strcmp(x, y) < 0; + } + }; typedef Attribute* (*Constructor)(); diff --git a/platform/x86/avx512/avx512noise.cpp b/platform/x86/avx512/avx512noise.cpp new file mode 100644 index 000000000..aa5f440a6 --- /dev/null +++ b/platform/x86/avx512/avx512noise.cpp @@ -0,0 +1,1435 @@ +//****************************************************************************** +/// +/// @file platform/x86/avx512/avx512noise.cpp +/// +/// This file contains implementations of the noise generator optimized for the +/// AVX512 instruction set. +/// +/// @note +/// This file shares lots of code with @ref platform/x86/avxnoise.cpp, +/// essentially differing only in a few macro definitions and some +// identifier names. +/// +/// @author Original optimizations by MCW +/// +/// @copyright +/// @parblock +/// +/// Persistence of Vision Ray Tracer ('POV-Ray') version 3.8. +/// Copyright 1991-2017 Persistence of Vision Raytracer Pty. Ltd. +/// +/// POV-Ray is free software: you can redistribute it and/or modify +/// it under the terms of the GNU Affero General Public License as +/// published by the Free Software Foundation, either version 3 of the +/// License, or (at your option) any later version. +/// +/// POV-Ray is distributed in the hope that it will be useful, +/// but WITHOUT ANY WARRANTY; without even the implied warranty of +/// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/// GNU Affero General Public License for more details. +/// +/// You should have received a copy of the GNU Affero General Public License +/// along with this program. If not, see . +/// +/// ---------------------------------------------------------------------------- +/// +/// POV-Ray is based on the popular DKB raytracer version 2.12. +/// DKBTrace was originally written by David K. Buck. +/// DKBTrace Ver 2.0-2.12 were written by David K. Buck & Aaron A. Collins. +/// +/// @endparblock +/// +//****************************************************************************** + +// Unit header file must be the first file included within POV-Ray *.cpp files (pulls in config) +#include "avx512noise.h" + +#ifdef MACHINE_INTRINSICS_H +#include MACHINE_INTRINSICS_H +#endif + +#include "core/material/noise.h" + + +/// @file +/// @attention +/// This file **must not** contain any code that might get called before CPU +/// support for this optimized implementation has been confirmed. Most +/// notably, the function to detect support itself must not reside in this +/// file. + +/*****************************************************************************/ + + +#ifdef TRY_OPTIMIZED_NOISE_AVX512 + +namespace pov +{ + +#ifndef DISABLE_OPTIMIZED_NOISE_AVX512 + +const bool kAVX512NoiseEnabled = true; +// Predefined Vectors used for computations +__m512i mask_incrsump_s11; +__m512i mask_incrsump_s12; +__m512i mask_incrsump_s13; +__m512i mask_ij1; +__m512i mask_incrsump_s21; +__m512i mask_incrsump_s22; +__m512i mask_incrsump_s23; +__m512i mask_ij2; +// Below masks are to fetch and set to specific elements +__m512i mask_permute_fetch1; +__m512i mask_permute_fetch2; +__m512i mask_permute_fetch3; +__m512i mask_permute_fetch4; +__m512d multiplicand_mask; +__m512d omega_values; +__m512d TWO_PD; +__m512d FOUR_PD; +__m512d addition_factor_range; +__m512d multiplication_factor_range; +__m512d addition_factor_perlin; +__m512d multiplication_factor_perlin; +__m512d POINT_FIVE; +// Below three masks are used to combine iii and jjj +__m512i blendmask2; +__m512i blendmask3; +__m512i blendmask4; +// Constant vectors used +__m512d ONE_PD; +__m256d ONE_PD_SHORT; +__m512d epsy; +__m256d short_epsy; +__m256i vector_allhigh; +__m128i short_si128; +__m512d three_vector_pd; +__m256d short_three_vector_pd; +__m512d zero_vector_pd; +__m256d short_zero_vector_pd; +/******************************************************/ +/* Use avx2 intrinsics for vpermpd and native fma3 */ +/******************************************************/ + +#define FMA_PD(a,b,c) _mm256_fmadd_pd((a),(b),(c)) +#define FMA_PD_AVX512(a,b,c) _mm512_fmadd_pd((a),(b),(c)) +#define PERMUTE4x64(a,i) _mm256_permute4x64_pd((a),(i)) + + +#ifdef NO_SPLITS +#define AVX512TABLETYPE __m256d + +#define Hash1dRTableIndexAVX(a,b) \ + (((unsigned char)hashTable[(int)(a) ^ (b)]) * 4) + + +#define LOAD_32BYTES_FROM_TABLE(m) (*(m)) + +#else + +#define AVX512TABLETYPE DBL + +#define Hash1dRTableIndexAVX(a,b) \ + (((unsigned char)hashTable[(int)(a) ^ (b)])) + +#define LOAD_32BYTES_FROM_TABLE(m) (_mm256_loadu_pd(m)) +#define LOAD_32BYTES_FROM_TABLE(m) (_mm256_loadu_pd(m)) + +#endif + +// Used to accumulate the sum value in the single coordinate noise implementation - sum is reduced to noise +#define INCSUMAVX(sum, m, s_vec, i, j, mask) sum = FMA_PD(s_vec, _mm256_mul_pd(_mm256_blend_pd(i, j, mask),LOAD_32BYTES_FROM_TABLE(m)), sum) + +// Used to accumulate the sum value in the single coordinate noise implementation - without a blend operation +#define INCSUMAVX_NOBLEND(sum, m, s_vec, i) sum = FMA_PD(s_vec, _mm256_mul_pd(i, LOAD_32BYTES_FROM_TABLE(m)),sum) + +// Used to accumulate the sum value in the multiple coordinate noise implementation - sum is reduced to noise +#define INCSUMAVX512(sum, m1, m2, s_vec, i, j, mask) \ + c1 = _mm512_castpd256_pd512(LOAD_32BYTES_FROM_TABLE(m1)); \ + c1 = _mm512_mask_loadu_pd(c1, 0xF0, m2 - 4); \ + sum = FMA_PD_AVX512(s_vec, _mm512_mul_pd(_mm512_mask_blend_pd(mask, i, j), c1), sum); + +// Used to initialise the sum value in the multiple coordinate noise implementation (before start of accumulation) +#define INCSUMAVX512_INITIALIZE(sum, m1, m2, s_vec, i, j, mask) \ + c1 = _mm512_castpd256_pd512(LOAD_32BYTES_FROM_TABLE(m1)); \ + c1 = _mm512_mask_loadu_pd(c1, 0xF0, m2 - 4); \ + sum = _mm512_mul_pd(s_vec, _mm512_mul_pd(_mm512_mask_blend_pd(mask, i, j), c1)); + +// Used to accumulate x, y, z values that is eventually reduced to DNoise output in single coordinate implementation +#define INCSUMAVX_VECTOR(m, s, blend) \ + x = FMA_PD(s, _mm256_mul_pd(blend, LOAD_32BYTES_FROM_TABLE(m)), x); \ + m+=4; \ + y = FMA_PD(s, _mm256_mul_pd(blend, LOAD_32BYTES_FROM_TABLE(m)), y); \ + m+=4; \ + z = FMA_PD(s, _mm256_mul_pd(blend, LOAD_32BYTES_FROM_TABLE(m)), z); + +// Used to accumulate x, y, z values that is eventually reduced to DNoise output in multiple coordinate implementation +// Defined with generic names x_vec, y_vec, z_vec to accomodate different variable for different coordinates +#define INCSUMAVX512_VECTOR(x_vec, y_vec, z_vec, m1, m2, s_vec, blend) \ + c1 = _mm512_castpd256_pd512(LOAD_32BYTES_FROM_TABLE(m1)); \ + c1 = _mm512_mask_loadu_pd(c1, 0xF0, m2 - 4); \ + x_vec = _mm512_fmadd_pd(s_vec, _mm512_mul_pd(blend, c1), x_vec); \ + m1 += 4; \ + c1 = _mm512_castpd256_pd512(LOAD_32BYTES_FROM_TABLE(m1)); \ + c1 = _mm512_mask_loadu_pd(c1, 0xF0, m2); \ + y_vec = _mm512_fmadd_pd(s_vec, _mm512_mul_pd(blend, c1), y_vec); \ + m1 += 4; \ + m2 += 4; \ + c1 = _mm512_castpd256_pd512(LOAD_32BYTES_FROM_TABLE(m1)); \ + c1 = _mm512_mask_loadu_pd(c1, 0xF0, m2); \ + z_vec = _mm512_fmadd_pd(s_vec, _mm512_mul_pd(blend, c1), z_vec); + +// Used to initialise x, y, z values that is eventually reduced to DNoise output in multiple coordinate implementation (before accumulation) +// Defined with generic names x_vec, y_vec, z_vec to accomodate different variable for different coordinates +#define INCSUMAVX512_VECTOR_INITIALIZE(x_vec, y_vec, z_vec, m1, m2, s_vec, blend) \ + c1 = _mm512_castpd256_pd512(LOAD_32BYTES_FROM_TABLE(m1)); \ + c1 = _mm512_mask_loadu_pd(c1, 0xF0, m2 - 4); \ + x_vec = _mm512_mul_pd(s_vec, _mm512_mul_pd(blend, c1)); \ + m1 += 4; \ + c1 = _mm512_castpd256_pd512(LOAD_32BYTES_FROM_TABLE(m1)); \ + c1 = _mm512_mask_loadu_pd(c1, 0xF0, m2); \ + y_vec = _mm512_mul_pd(s_vec, _mm512_mul_pd(blend, c1)); \ + m1 += 4; \ + m2 += 4; \ + c1 = _mm512_castpd256_pd512(LOAD_32BYTES_FROM_TABLE(m1)); \ + c1 = _mm512_mask_loadu_pd(c1, 0xF0, m2); \ + z_vec = _mm512_mul_pd(s_vec, _mm512_mul_pd(blend, c1)); + +// Initial computations in multiple coordinate implementation, defined as a macro for better readability +// Some of these compuatations are i_xyzn based on which hash compuatation is done, s_xyzn_extended and t_xyzn used for multiplicand formation for sum compuatation, +// and also the masks and vector that are used in the computation of the former +#define COMPUTE_INITIAL_VECTORS_AVX512(xyzn) \ + xyzn_e = _mm512_sub_pd(xyzn, epsy); \ + masktmp_xyzn = _mm512_cmp_pd_mask(xyzn, zero_vector_pd, 1); \ + tmp_xyzn = _mm512_cvttpd_epi32(_mm512_mask_blend_pd(masktmp_xyzn, xyzn, xyzn_e)); \ + xyz_ixyzn_extended = _mm512_sub_pd(xyzn, _mm512_cvtepi32_pd(tmp_xyzn)); \ + xyz_jxyzn_extended = _mm512_sub_pd(xyz_ixyzn_extended, ONE_PD); \ + i_xyzn = _mm256_and_si256(_mm256_sub_epi32(tmp_xyzn, noise_min_xyzn), vector_allhigh); \ + s_xyzn_extended = _mm512_mul_pd(xyz_ixyzn_extended, _mm512_mul_pd(xyz_ixyzn_extended, _mm512_sub_pd(three_vector_pd, _mm512_add_pd(xyz_ixyzn_extended, xyz_ixyzn_extended)))); \ + t_xyzn = _mm512_sub_pd(ONE_PD, s_xyzn_extended); \ + _mm256_storeu_si256((__m256i*)(ints), i_xyzn); + +// Initial computations in single coordinate implementation, defined as a macro for better readability +// Some of these compuatations are i_xyzn based on which hash compuatation is done, s_xyzn and t_xyzn used for multiplicand formation for sum compuatation, +// and also the vectors that are used in the computation of the former +#define COMPUTE_INITIAL_VECTORS_AVX(xyzn) \ + xyzn_e = _mm256_sub_pd(xyzn, short_epsy); \ + tmp_xyzn = _mm256_cvttpd_epi32(_mm256_blendv_pd(xyzn, xyzn_e, xyzn)); \ + xyz_ixyzn = _mm256_sub_pd(xyzn, _mm256_cvtepi32_pd(tmp_xyzn)); \ + xyz_jxyzn = _mm256_sub_pd(xyz_ixyzn, ONE_PD_SHORT); \ + i_xyzn = _mm_and_si128(_mm_sub_epi32(tmp_xyzn, noise_min_xyzn),short_si128); \ + s_xyzn = _mm256_mul_pd(xyz_ixyzn, _mm256_mul_pd(xyz_ixyzn, _mm256_sub_pd(short_three_vector_pd, _mm256_add_pd(xyz_ixyzn, xyz_ixyzn)))); \ + t_xyzn = _mm256_sub_pd(ONE_PD_SHORT, s_xyzn); \ + _mm_storeu_si128((__m128i*)(ints), i_xyzn); + +// Used in the computation of vectors that will be permuted to form multiplicand that will be used to compute values that will be accumulated to form noise and dnoise outputs +// Permutation is done in a way that one value from vector incrsump_s will form first 4 values and another value from incrsump_s forms next 4 values of vector +#define COMPUTE_INCRSUMP_AVX512(t_xyzn, s_xyzn_extended) \ + incrsump_s11 = _mm512_permutex2var_pd(t_xyzn, mask_incrsump_s11, s_xyzn_extended); \ + incrsump_s12 = _mm512_permutex2var_pd(t_xyzn, mask_incrsump_s12, s_xyzn_extended); \ + incrsump_s13 = _mm512_permutex2var_pd(t_xyzn, mask_incrsump_s13, s_xyzn_extended); \ + incrsump_s21 = _mm512_permutex2var_pd(t_xyzn, mask_incrsump_s21, s_xyzn_extended); \ + incrsump_s22 = _mm512_permutex2var_pd(t_xyzn, mask_incrsump_s22, s_xyzn_extended); \ + incrsump_s23 = _mm512_permutex2var_pd(t_xyzn, mask_incrsump_s23, s_xyzn_extended); \ + incrsump_s11 = _mm512_mul_pd(incrsump_s11, _mm512_mul_pd(incrsump_s12, incrsump_s13)); \ + incrsump_s21 = _mm512_mul_pd(incrsump_s21, _mm512_mul_pd(incrsump_s22, incrsump_s23)); + +// Used in the computation of vectors that will be permuted to form multiplicand that will be used to compute values that will be accumulated to form noise and dnoise outputs +// Permutation is done in a way that one value from vector is used for multiplication +#define COMPUTE_INCRSUMP_AVX(t_xyzn, s_xyzn) \ + txtysxsy = _mm256_permute2f128_pd(t_xyzn, s_xyzn, 0x20); \ + txsxtxsx = PERMUTE4x64(txtysxsy, _MM_SHUFFLE(2, 0, 2, 0)); \ + tytysysy = PERMUTE4x64(txtysxsy, _MM_SHUFFLE(3, 3, 1, 1)); \ + txtysxtytxsysxsy = _mm256_mul_pd(txsxtxsx, tytysysy); \ + incrsump_s1 = _mm256_mul_pd(txtysxtytxsysxsy, PERMUTE4x64(t_xyzn, _MM_SHUFFLE(2, 2, 2, 2))); \ + incrsump_s2 = _mm256_mul_pd(txtysxtytxsysxsy, PERMUTE4x64(s_xyzn, _MM_SHUFFLE(2, 2, 2, 2))); + +// 4 hashes are formed based on two inputs a and b (2^2 = 4) +#define COMPUTE_IJ_HASHES(ixiy_hash, jxiy_hash, ixjy_hash, jxjy_hash, a, b) \ + ixiy_hash = Hash2d(a, b); \ + jxiy_hash = Hash2d(a + 1, b); \ + ixjy_hash = Hash2d(a, b + 1); \ + jxjy_hash = Hash2d(a + 1, b + 1); + +// Computed outputs will be typically of the form [0.5, a, b, c, 0.5, d, e, f] +// Used in multiplication for accumulation of noise values +#define COMPUTE_MULTIPLICAND_INPUTS(xyz_ixyzn_extended, xyz_jxyzn_extended) \ + iii1 = _mm512_permutex2var_pd(xyz_ixyzn_extended, mask_ij1, multiplicand_mask); \ + jjj1 = _mm512_permutex2var_pd(xyz_jxyzn_extended, mask_ij1, multiplicand_mask); \ + iii2 = _mm512_permutex2var_pd(xyz_ixyzn_extended, mask_ij2, multiplicand_mask); \ + jjj2 = _mm512_permutex2var_pd(xyz_jxyzn_extended, mask_ij2, multiplicand_mask); + +// Gets references from AVX512RTable which is used to load values used for sum accumulation for npoise calculation and permuatation of incrsump_s for multiple coordinates as mentioned earlier +#define GET_INCSUMAVX512_INPUTS(ij_hash1, iz_input1, ij_hash2, iz_input2, incrsump_s, permute_mask) \ + mp1 = &AVX512RTable[Hash1dRTableIndexAVX(ij_hash1, iz_input1)]; \ + mp2 = &AVX512RTable[Hash1dRTableIndexAVX(ij_hash2, iz_input2)]; \ + ss1 = _mm512_permutexvar_pd(permute_mask, incrsump_s); + +/********************************************************************************************/ +/* AVX512 Specific optimizations: Its found that more than 50% of the time is spent in */ +/* Noise and DNoise. These functions have been optimized using AVX512 instructions */ +/********************************************************************************************/ + +extern DBL RTable[]; + +ALIGN32 static AVX512TABLETYPE AVX512RTable[267]; + +// Initialisation function used for initialisation of avx512 table and vectors used for lookup +void AVX512NoiseInit() +{ + int i; + DBL *avx512table = (DBL *)AVX512RTable; + for (i = 0; i < 267; i++) + { +#ifndef NO_SPLITS + avx512table[i] = RTable[2 * i]; +#else + avx512table[(4 * i) + 0] = RTable[2 * i + 0]; + avx512table[(4 * i) + 1] = RTable[2 * i + 2]; + avx512table[(4 * i) + 2] = RTable[2 * i + 4]; + avx512table[(4 * i) + 3] = RTable[2 * i + 6]; +#endif + // Masks used for permutation purposes + mask_incrsump_s11 = _mm512_set_epi32(0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0); + mask_incrsump_s12 = _mm512_set_epi32(0, 9, 0, 9, 0, 1, 0, 1, 0, 9, 0, 9, 0, 1, 0, 1); + mask_incrsump_s13 = _mm512_set_epi32(0, 10, 0, 10, 0, 10, 0, 10, 0, 2, 0, 2, 0, 2, 0, 2); + mask_ij1 = _mm512_set_epi32(0, 2, 0, 1, 0, 0, 0, 8, 0, 2, 0, 1, 0, 0, 0, 8); + mask_incrsump_s21 = _mm512_set_epi32(0, 12, 0, 4, 0, 12, 0, 4, 0, 12, 0, 4, 0, 12, 0, 4); + mask_incrsump_s22 = _mm512_set_epi32(0, 13, 0, 13, 0, 5, 0, 5, 0, 13, 0, 13, 0, 5, 0, 5); + mask_incrsump_s23 = _mm512_set_epi32(0, 14, 0, 14, 0, 14, 0, 14, 0, 6, 0, 6, 0, 6, 0, 6); + mask_ij2 = _mm512_set_epi32(0, 6, 0, 5, 0, 4, 0, 8, 0, 6, 0, 5, 0, 4, 0, 8); + // Below masks are to fetch and set to specific elements + mask_permute_fetch1 = _mm512_set_epi32(0, 7, 0, 7, 0, 7, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0); + mask_permute_fetch2 = _mm512_set_epi32(0, 3, 0, 3, 0, 3, 0, 3, 0, 2, 0, 2, 0, 2, 0, 2); + mask_permute_fetch3 = _mm512_set_epi32(0, 5, 0, 5, 0, 5, 0, 5, 0, 4, 0, 4, 0, 4, 0, 4); + mask_permute_fetch4 = _mm512_set_epi32(0, 1, 0, 1, 0, 1, 0, 1, 0, 6, 0, 6, 0, 6, 0, 6); + multiplicand_mask = _mm512_set_pd(0, 0, 0, 0.5, 0, 0, 0, 0.5); + omega_values = _mm512_set_pd(0.00390625, 0.0078125, 0.015625, 0.03125, 0.0625, 0.125, 0.25, 0.5); + TWO_PD = _mm512_set1_pd(2.0); + FOUR_PD = _mm512_set1_pd(4.0); + addition_factor_range = _mm512_set1_pd(1.05242); + multiplication_factor_range = _mm512_set1_pd(0.48985582); + addition_factor_perlin = _mm512_set1_pd(0.985); + multiplication_factor_perlin = _mm512_set1_pd(1.59); + POINT_FIVE = _mm512_set1_pd(0.5); + // Constant vectors used + ONE_PD = _mm512_set1_pd(1.0); + ONE_PD_SHORT = _mm256_set1_pd(1.0); + epsy = _mm512_set1_pd(1.0 - EPSILON); + short_epsy = _mm256_set1_pd(1.0 - EPSILON); + vector_allhigh = _mm256_set1_epi32(0xfff); + short_si128 = _mm_set1_epi32(0xfff); + three_vector_pd = _mm512_set1_pd(3.0); + short_three_vector_pd = _mm256_set1_pd(3.0); + zero_vector_pd = _mm512_setzero_pd(); + short_zero_vector_pd = _mm256_setzero_pd(); + } +} + +/***************************************************************************** +* +* FUNCTION +* +* AVX512Noise +* +* INPUT +* +* EPoint -- 3-D point at which noise is evaluated +* +* OUTPUT +* +* RETURNS +* +* DBL noise value +* +* AUTHOR +* +* Robert Skinner based on Ken Perlin +* +* DESCRIPTION +* +* Used for computation of Noise based on single input +* The function is used whenever a single Vector3D input needs to be processed at a time - Uses AVX2 calls to process data for a single input +* Initial computation done for the single Vector3D, followed by Hash Compuatation, sum accumulation and reduction to noise +* +* CHANGES +* Modified by AAC to ensure uniformly distributed clamped values +* between 0 and 1.0... +* +* Feb 8, 2001: modified function based on MegaPov 0.7 to remove +* bugs that showed up when noise was translated. +* +* +******************************************************************************/ + +DBL AVX512Noise(const Vector3d& EPoint, int noise_generator) +{ + AVX512TABLETYPE* mp; + DBL sum = 0.0; + + // TODO FIXME - global statistics reference + // Stats[Calls_To_Noise]++; + + if (noise_generator == kNoiseGen_Perlin) + { + // The 1.59 and 0.985 are to correct for some biasing problems with + // the random # generator used to create the noise tables. Final + // range of values is about 5.0e-4 below 0.0 and above 1.0. Mean + // value is 0.49 (ideally it would be 0.5). + sum = 0.5 * (1.59 * SolidNoise(EPoint) + 0.985); + + // Clamp final value to 0-1 range + if (sum < 0.0) sum = 0.0; + if (sum > 1.0) sum = 1.0; + + return sum; + } + + int ints[4]; + // Initialised input EPoint into xyzn and also a vector used for noise min values + const __m256d xyzn = _mm256_setr_pd(EPoint[X], EPoint[Y], EPoint[Z], 0); + const __m128i noise_min_xyzn = _mm_setr_epi32(NOISE_MINX, NOISE_MINY, NOISE_MINZ, 0); + + __m256d xyzn_e, xyz_ixyzn, xyz_jxyzn, s_xyzn, t_xyzn; + __m128i tmp_xyzn, i_xyzn; + + // Initial set of computation - Computes the vectors defined above, i_xyzn used to generate hashes, s_xyzn, t_xyzn used to compute vectors that will be blended to form multiplicands for noise accumulation + COMPUTE_INITIAL_VECTORS_AVX(xyzn); + + __m256d txtysxsy, txsxtxsx, tytysysy, txtysxtytxsysxsy, incrsump_s1, incrsump_s2; + + // Used in computing incrsump_s1 and incrsump_s2 whose values are taken one by one and used for noise acculumulation calculation + COMPUTE_INCRSUMP_AVX(t_xyzn, s_xyzn); + + // Hash values generated using combination of ints[0] and ints[1] + int ixiy_hash, jxiy_hash, ixjy_hash, jxjy_hash; + COMPUTE_IJ_HASHES(ixiy_hash, jxiy_hash, ixjy_hash, jxjy_hash, ints[0], ints[1]); + + const int iz = ints[2]; + + // Multiplicand inputs - Typically of the form [0.5, a, b, c] + const __m256d iii = _mm256_blend_pd(PERMUTE4x64(xyz_ixyzn, _MM_SHUFFLE(2, 1, 0, 0)), _mm256_set_pd(0, 0, 0, 0.5), 0x1); + const __m256d jjj = _mm256_blend_pd(PERMUTE4x64(xyz_jxyzn, _MM_SHUFFLE(2, 1, 0, 0)), _mm256_set_pd(0, 0, 0, 0.5), 0x1); + + __m256d sumr = _mm256_setzero_pd(); + __m256d sumr1 = _mm256_setzero_pd(); + + // Gets references from table for all 8 combinations of hash (2^3 from ints[0], ints[1], ints[2]) and uses them along with other precomputed values for noise accumulation + mp = &AVX512RTable[Hash1dRTableIndexAVX(ixiy_hash, iz)]; + INCSUMAVX_NOBLEND(sumr, mp, PERMUTE4x64(incrsump_s1, _MM_SHUFFLE(0, 0, 0, 0)), iii); + + mp = &AVX512RTable[Hash1dRTableIndexAVX(jxiy_hash, iz)]; + INCSUMAVX(sumr1, mp, PERMUTE4x64(incrsump_s1, _MM_SHUFFLE(1, 1, 1, 1)), iii, jjj, 2); + + mp = &AVX512RTable[Hash1dRTableIndexAVX(ixjy_hash, iz)]; + INCSUMAVX(sumr, mp, PERMUTE4x64(incrsump_s1, _MM_SHUFFLE(2, 2, 2, 2)), iii, jjj, 4); + + mp = &AVX512RTable[Hash1dRTableIndexAVX(jxjy_hash, iz)]; + INCSUMAVX(sumr1, mp, PERMUTE4x64(incrsump_s1, _MM_SHUFFLE(3, 3, 3, 3)), iii, jjj, 6); + + mp = &AVX512RTable[Hash1dRTableIndexAVX(ixiy_hash, iz + 1)]; + INCSUMAVX(sumr, mp, PERMUTE4x64(incrsump_s2, _MM_SHUFFLE(0, 0, 0, 0)), iii, jjj, 8); + + mp = &AVX512RTable[Hash1dRTableIndexAVX(jxiy_hash, iz + 1)]; + INCSUMAVX(sumr1, mp, PERMUTE4x64(incrsump_s2, _MM_SHUFFLE(1, 1, 1, 1)), iii, jjj, 10); + + mp = &AVX512RTable[Hash1dRTableIndexAVX(ixjy_hash, iz + 1)]; + INCSUMAVX(sumr, mp, PERMUTE4x64(incrsump_s2, _MM_SHUFFLE(2, 2, 2, 2)), iii, jjj, 12); + + mp = &AVX512RTable[Hash1dRTableIndexAVX(jxjy_hash, iz + 1)]; + INCSUMAVX_NOBLEND(sumr1, mp, PERMUTE4x64(incrsump_s2, _MM_SHUFFLE(3, 3, 3, 3)), jjj); + + // Reduction to get resultant noise + { + sumr = _mm256_add_pd(sumr, sumr1); + + __m128d sumr_up = _mm256_extractf128_pd(sumr, 1); + sumr_up = _mm_add_pd(_mm256_castpd256_pd128(sumr), sumr_up); + sumr_up = _mm_hadd_pd(sumr_up, sumr_up); + sum = _mm_cvtsd_f64(sumr_up); + } + + if (noise_generator == kNoiseGen_RangeCorrected) + { + /* details of range here: + Min, max: -1.05242, 0.988997 + Mean: -0.0191481, Median: -0.535493, Std Dev: 0.256828 + + We want to change it to as close to [0,1] as possible. + */ + sum += 1.05242; + sum *= 0.48985582; + /*sum *= 0.5; + sum += 0.5;*/ + + if (sum < 0.0) + sum = 0.0; + if (sum > 1.0) + sum = 1.0; + } + else + { + sum = sum + 0.5; /* range at this point -0.5 - 0.5... */ + + if (sum < 0.0) + sum = 0.0; + if (sum > 1.0) + sum = 1.0; + } + + + +#if CHECK_FUNCTIONAL + { + DBL orig_sum = PortableNoise(EPoint, noise_generator); + if (fabs(orig_sum - sum) >= EPSILON) + { + throw POV_EXCEPTION_STRING("Noise error"); + } + + } + +#endif + + _mm256_zeroupper(); + return (sum); +} + + +/***************************************************************************** +* +* FUNCTION +* +* AVX512DNoise +* +* INPUT +* +* EPoint -- 3-D point at which noise is evaluated +* +* OUTPUT +* +* Vector3d& result +* +* RETURNS +* +* AUTHOR +* +* Robert Skinner based on Ken Perlin +* +* DESCRIPTION +* +* Vector-valued version of "Noise" +* Used for computation of DNoise based on single input +* The function is used whenever a single Vector3D input needs to be processed at a time - Uses AVX2 calls to process data for a single input +* Initial computation done for the single Vector3D, followed by Hash Compuatation, sum accumulation and reduction to result vector of DNoise +* +* CHANGES +* Modified by AAC to ensure uniformly distributed clamped values +* between 0 and 1.0... +* +* Feb 8, 2001: modified function based on MegaPov 0.7 to remove +* bugs that showed up when noise was translated. +* +* +******************************************************************************/ + +void AVX512DNoise(Vector3d& result, const Vector3d& EPoint) +{ +#if CHECK_FUNCTIONAL + Vector3d param(EPoint); +#endif + + AVX512TABLETYPE* mp; + + // TODO FIXME - global statistics reference + // Stats[Calls_To_DNoise]++; + + int ints[4]; + // Initialised input EPoint into xyzn and also a vector used for noise min values + const __m256d xyzn = _mm256_setr_pd(EPoint[X], EPoint[Y], EPoint[Z], 0); + const __m128i noise_min_xyzn = _mm_setr_epi32(NOISE_MINX, NOISE_MINY, NOISE_MINZ, 0); + + __m256d xyzn_e, xyz_ixyzn, xyz_jxyzn, s_xyzn, t_xyzn; + __m128i tmp_xyzn, i_xyzn; + + // Initial set of computation - Computes the vectors defined above, i_xyzn used to generate hashes, s_xyzn, t_xyzn used to compute vectors that will be blended to form multiplicands for DNoise output accumulation + COMPUTE_INITIAL_VECTORS_AVX(xyzn); + + __m256d txtysxsy, txsxtxsx, tytysysy, txtysxtytxsysxsy, incrsump_s1, incrsump_s2; + + // Used in computing incrsump_s1 and incrsump_s2 whose values are taken one by one and used for DNoise acculumulation calculation + COMPUTE_INCRSUMP_AVX(t_xyzn, s_xyzn); + + int ixiy_hash, jxiy_hash, ixjy_hash, jxjy_hash; + // Hash values generated using combination of ints[0] and ints[1] + COMPUTE_IJ_HASHES(ixiy_hash, jxiy_hash, ixjy_hash, jxjy_hash, ints[0], ints[1]); + + const int iz = ints[2]; + + // Multiplicand inputs - Typically of the form [0.5, a, b, c] + const __m256d iii = _mm256_blend_pd(PERMUTE4x64(xyz_ixyzn, _MM_SHUFFLE(2, 1, 0, 0)), _mm256_set_pd(0, 0, 0, 0.5), 0x1); + const __m256d jjj = _mm256_blend_pd(PERMUTE4x64(xyz_jxyzn, _MM_SHUFFLE(2, 1, 0, 0)), _mm256_set_pd(0, 0, 0, 0.5), 0x1); + + __m256d ss; + __m256d blend; + + __m256d x = _mm256_setzero_pd(), y = _mm256_setzero_pd(), z = _mm256_setzero_pd(); + + // Gets references from table for all 8 combinations of hash (2^3 from ints[0], ints[1], ints[2]) and uses them along with other precomputed values for DNoise accumulation + mp = &AVX512RTable[Hash1dRTableIndexAVX(ixiy_hash, iz)]; + ss = PERMUTE4x64(incrsump_s1, _MM_SHUFFLE(0, 0, 0, 0)); + // blend = _mm256_blend_pd(iii, jjj, 0); + + INCSUMAVX_VECTOR(mp, ss, iii); + + mp = &AVX512RTable[Hash1dRTableIndexAVX(jxiy_hash, iz)]; + ss = PERMUTE4x64(incrsump_s1, _MM_SHUFFLE(1, 1, 1, 1)); + blend = _mm256_blend_pd(iii, jjj, 2); + + INCSUMAVX_VECTOR(mp, ss, blend); + + mp = &AVX512RTable[Hash1dRTableIndexAVX(jxjy_hash, iz)]; + ss = PERMUTE4x64(incrsump_s1, _MM_SHUFFLE(3, 3, 3, 3)); + blend = _mm256_blend_pd(iii, jjj, 6); + + INCSUMAVX_VECTOR(mp, ss, blend); + + mp = &AVX512RTable[Hash1dRTableIndexAVX(ixjy_hash, iz)]; + ss = PERMUTE4x64(incrsump_s1, _MM_SHUFFLE(2, 2, 2, 2)); + blend = _mm256_blend_pd(iii, jjj, 4); + + INCSUMAVX_VECTOR(mp, ss, blend); + + mp = &AVX512RTable[Hash1dRTableIndexAVX(ixjy_hash, iz + 1)]; + ss = PERMUTE4x64(incrsump_s2, _MM_SHUFFLE(2, 2, 2, 2)); + blend = _mm256_blend_pd(iii, jjj, 12); + + INCSUMAVX_VECTOR(mp, ss, blend); + + mp = &AVX512RTable[Hash1dRTableIndexAVX(jxjy_hash, iz + 1)]; + ss = PERMUTE4x64(incrsump_s2, _MM_SHUFFLE(3, 3, 3, 3)); + // blend = _mm256_blend_pd(iii, jjj, 14); + + INCSUMAVX_VECTOR(mp, ss, jjj); + + mp = &AVX512RTable[Hash1dRTableIndexAVX(jxiy_hash, iz + 1)]; + ss = PERMUTE4x64(incrsump_s2, _MM_SHUFFLE(1, 1, 1, 1)); + blend = _mm256_blend_pd(iii, jjj, 10); + + INCSUMAVX_VECTOR(mp, ss, blend); + + mp = &AVX512RTable[Hash1dRTableIndexAVX(ixiy_hash, iz + 1)]; + ss = PERMUTE4x64(incrsump_s2, _MM_SHUFFLE(0, 0, 0, 0)); + blend = _mm256_blend_pd(iii, jjj, 8); + + INCSUMAVX_VECTOR(mp, ss, blend); + + // Reduction to get overall DNoise output result vector + __m256d xy = _mm256_hadd_pd(x, y); + __m128d xy_up = _mm256_extractf128_pd(xy, 1); + xy_up = _mm_add_pd(_mm256_castpd256_pd128(xy), xy_up); + _mm_storeu_pd(&result[X], xy_up); + + __m128d z_up = _mm256_extractf128_pd(z, 1); + z_up = _mm_add_pd(_mm256_castpd256_pd128(z), z_up); + z_up = _mm_hadd_pd(z_up, z_up); + result[Z] = _mm_cvtsd_f64(z_up); + + +#if CHECK_FUNCTIONAL + { + Vector3d portable_res; + PortableDNoise(portable_res, param); + if (fabs(portable_res[X] - result[X]) >= EPSILON) + { + throw POV_EXCEPTION_STRING("DNoise X error"); + } + if (fabs(portable_res[Y] - result[Y]) >= EPSILON) + { + throw POV_EXCEPTION_STRING("DNoise Y error"); + } + if (fabs(portable_res[Z] - result[Z]) >= EPSILON) + { + throw POV_EXCEPTION_STRING("DNoise Z error"); + } + + } + +#endif + + + + _mm256_zeroupper(); + return; +} + +/***************************************************************************** +* +* FUNCTION +* +* AVX512Noise2D +* +* INPUT +* +* EPoint -- Two input 3-D points at which noise is evaluated +* +* OUTPUT +* +* double& value - Noise values for the input 3-D points +* +* RETURNS +* +* AUTHOR +* +* Robert Skinner based on Ken Perlin +* +* DESCRIPTION +* +* Used for computation of Noise based on two input +* The function is used whenever two Vector3D input needs to be processed at a time - Uses AVX512 calls to process data for a two inputs +* Initial computation done for the both Vector3D, followed by Hash Compuatation, sum accumulation and reduction to noise for each of the input 3D points +* +* CHANGES +* Modified by AAC to ensure uniformly distributed clamped values +* between 0 and 1.0... +* +* Feb 8, 2001: modified function based on MegaPov 0.7 to remove +* bugs that showed up when noise was translated. +* +* +******************************************************************************/ + +// Used for computation of Noise based on two inputs +void AVX512Noise2D(const Vector3d& EPoint, int noise_generator, double& value) { + + AVX512TABLETYPE* mp1, * mp2; + DBL* sum = &value; + sum[0] = sum[1] = 0.0; + const Vector3d* input_vector; + input_vector = &EPoint; + + if (noise_generator == kNoiseGen_Perlin) + { + // The 1.59 and 0.985 are to correct for some biasing problems with + // the random # generator used to create the noise tables. Final + // range of values is about 5.0e-4 below 0.0 and above 1.0. Mean + // value is 0.49 (ideally it would be 0.5). + sum[0] = 0.5 * (1.59 * SolidNoise(input_vector[0]) + 0.985); + + // Clamp final value to 0-1 range + if (sum[0] < 0.0) sum[0] = 0.0; + if (sum[0] > 1.0) sum[0] = 1.0; + + sum[1] = 0.5 * (1.59 * SolidNoise(input_vector[1]) + 0.985); + if (sum[1] < 0.0) sum[1] = 0.0; + if (sum[1] > 1.0) sum[1] = 1.0; + + return; + } + + int ints[8]; + // Initialised input EPoints into xyzn and also a vector used for noise min values + const __m512d xyzn = _mm512_setr_pd(input_vector[0][X], input_vector[0][Y], input_vector[0][Z], 0, input_vector[1][X], input_vector[1][Y], input_vector[1][Z], 0); + const __m256i noise_min_xyzn = _mm256_setr_epi32(NOISE_MINX, NOISE_MINY, NOISE_MINZ, 0, NOISE_MINX, NOISE_MINY, NOISE_MINZ, 0); + __m512d xyzn_e, s_xyzn_extended, t_xyzn, xyz_ixyzn_extended, xyz_jxyzn_extended, iii1, jjj1, iii2, jjj2; + __m256i tmp_xyzn, i_xyzn; + __mmask8 masktmp_xyzn; + + // Initial set of computation - Computes the vectors defined above, i_xyzn used to generate hashes, s_xyzn_extended, t_xyzn used to compute vectors that will be blended to form multiplicands for Noise output accumulation + COMPUTE_INITIAL_VECTORS_AVX512(xyzn); + + __m512d incrsump_s11, incrsump_s12, incrsump_s13, incrsump_s21, incrsump_s22, incrsump_s23; + + // Used in computing incrsump_s1 and incrsump_s2 whose values are taken one by one and used for Noise acculumulation calculation + COMPUTE_INCRSUMP_AVX512(t_xyzn, s_xyzn_extended); + + int ixiy_hash1, jxiy_hash1, ixjy_hash1, jxjy_hash1; + + // Hash values generated using combination of ints[0] and ints[1] + COMPUTE_IJ_HASHES(ixiy_hash1, jxiy_hash1, ixjy_hash1, jxjy_hash1, ints[0], ints[1]); + + const int iz1 = ints[2]; + + // Multiplicand inputs - Typically of the form [0.5, a, b, c, 0.5, d, e, f] + COMPUTE_MULTIPLICAND_INPUTS(xyz_ixyzn_extended, xyz_jxyzn_extended); + + __m512d ss1; + __m512d blend1; + __m512i blend1mask; + __m256d m1, m2; + __m512d c1; + __m512d sumr1, sumr2; + + // Gets references from table for all 8 combinations of hash (2^3 from ints[0], ints[1], ints[2]) and uses them along with other precomputed values for Noise accumulation + GET_INCSUMAVX512_INPUTS(ixiy_hash1, iz1, jxjy_hash1, iz1 + 1, incrsump_s11, mask_permute_fetch1); + INCSUMAVX512_INITIALIZE(sumr1, mp1, mp2, ss1, iii1, jjj1, 0xF0); + + GET_INCSUMAVX512_INPUTS(ixjy_hash1, iz1, jxjy_hash1, iz1, incrsump_s11, mask_permute_fetch2); + INCSUMAVX512(sumr1, mp1, mp2, ss1, iii1, jjj1, 0x64); + + GET_INCSUMAVX512_INPUTS(ixiy_hash1, iz1 + 1, jxiy_hash1, iz1 + 1, incrsump_s11, mask_permute_fetch3); + INCSUMAVX512(sumr1, mp1, mp2, ss1, iii1, jjj1, 0xA8); + + GET_INCSUMAVX512_INPUTS(ixjy_hash1, iz1 + 1, jxiy_hash1, iz1, incrsump_s11, mask_permute_fetch4); + INCSUMAVX512(sumr1, mp1, mp2, ss1, iii1, jjj1, 0x2C); + + // Similar steps from hash computation done for second input coordinate + + int ixiy_hash2, jxiy_hash2, ixjy_hash2, jxjy_hash2; + + COMPUTE_IJ_HASHES(ixiy_hash2, jxiy_hash2, ixjy_hash2, jxjy_hash2, ints[4], ints[5]); + + const int iz2 = ints[6]; + + GET_INCSUMAVX512_INPUTS(ixiy_hash2, iz2, jxjy_hash2, iz2 + 1, incrsump_s21, mask_permute_fetch1); + INCSUMAVX512_INITIALIZE(sumr2, mp1, mp2, ss1, iii2, jjj2, 0xF0); + + GET_INCSUMAVX512_INPUTS(ixjy_hash2, iz2, jxjy_hash2, iz2, incrsump_s21, mask_permute_fetch2); + INCSUMAVX512(sumr2, mp1, mp2, ss1, iii2, jjj2, 0x64); + + GET_INCSUMAVX512_INPUTS(ixiy_hash2, iz2 + 1, jxiy_hash2, iz2 + 1, incrsump_s21, mask_permute_fetch3); + INCSUMAVX512(sumr2, mp1, mp2, ss1, iii2, jjj2, 0xA8); + + GET_INCSUMAVX512_INPUTS(ixjy_hash2, iz2 + 1, jxiy_hash2, iz2, incrsump_s21, mask_permute_fetch4); + INCSUMAVX512(sumr2, mp1, mp2, ss1, iii2, jjj2, 0x2C); + + // Reduction to get noise values for both inputs + sum[0] = _mm512_reduce_add_pd(sumr1); + sum[1] = _mm512_reduce_add_pd(sumr2); + + if (noise_generator == kNoiseGen_RangeCorrected) + { + /* details of range here: + Min, max: -1.05242, 0.988997 + Mean: -0.0191481, Median: -0.535493, Std Dev: 0.256828 + + We want to change it to as close to [0,1] as possible. + */ + sum[0] += 1.05242; + sum[0] *= 0.48985582; + + if (sum[0] < 0.0) + sum[0] = 0.0; + if (sum[0] > 1.0) + sum[0] = 1.0; + + sum[1] += 1.05242; + sum[1] *= 0.48985582; + if (sum[1] < 0.0) + sum[1] = 0.0; + if (sum[1] > 1.0) + sum[1] = 1.0; + } + else + { + sum[0] = sum[0] + 0.5; /* range at this point -0.5 - 0.5... */ + + if (sum[0] < 0.0) + sum[0] = 0.0; + if (sum[0] > 1.0) + sum[0] = 1.0; + + sum[1] = sum[1] + 0.5; + + if (sum[1] < 0.0) + sum[1] = 0.0; + if (sum[1] > 1.0) + sum[1] = 1.0; + } + +#if CHECK_FUNCTIONAL + { + DBL orig_sum[2]; + orig_sum[0] = PortableNoise(input_vector[0], noise_generator); + orig_sum[1] = PortableNoise(input_vector[1], noise_generator); + if (fabs(orig_sum[0] - sum[0]) >= EPSILON) + { + throw POV_EXCEPTION_STRING("Noise error"); + } + if (fabs(orig_sum[1] - sum[1]) >= EPSILON) + { + throw POV_EXCEPTION_STRING("Noise error"); + } + + } + +#endif + _mm256_zeroupper(); + return; +} + +/***************************************************************************** +* +* FUNCTION +* +* AVX512Noise2D +* +* INPUT +* +* EPoint -- Two input 3-D points at which noise is evaluated +* +* OUTPUT +* +* Vector3D& result - Resultant two 3D points for the two input 3D points +* +* RETURNS +* +* AUTHOR +* +* Robert Skinner based on Ken Perlin +* +* DESCRIPTION +* +* Vector valued version of noise for two input 3D points +* Used for computation of DNoise based on two input +* The function is used whenever two Vector3D input needs to be processed at a time - Uses AVX512 calls to process data for a two inputs +* Initial computation done for the both Vector3D, followed by Hash Compuatation, sum accumulation and reduction to result vector for each of the input 3D points +* +* +* CHANGES +* Modified by AAC to ensure uniformly distributed clamped values +* between 0 and 1.0... +* +* Feb 8, 2001: modified function based on MegaPov 0.7 to remove +* bugs that showed up when noise was translated. +* +* +******************************************************************************/ +// Used for computation of DNoise based on two inputs +void AVX512DNoise2D(Vector3d& result, const Vector3d& EPoint) { + AVX512TABLETYPE* mp1, * mp2; + // TODO FIXME - global statistics reference + // Stats[Calls_To_DNoise]++; + Vector3d* result_vector; + result_vector = &result; + const Vector3d* input_vector; + input_vector = &EPoint; + +#if CHECK_FUNCTIONAL + Vector3d param[2]; + param[0] = input_vector[0]; + param[1] = input_vector[1]; +#endif + + + int ints[8]; + // Initialised input EPoints into xyzn and also a vector used for noise min values + const __m512d xyzn = _mm512_setr_pd(input_vector[0][X], input_vector[0][Y], input_vector[0][Z], 0, input_vector[1][X], input_vector[1][Y], input_vector[1][Z], 0); + const __m256i noise_min_xyzn = _mm256_setr_epi32(NOISE_MINX, NOISE_MINY, NOISE_MINZ, 0, NOISE_MINX, NOISE_MINY, NOISE_MINZ, 0); + __m512d xyzn_e, s_xyzn_extended, t_xyzn, xyz_ixyzn_extended, xyz_jxyzn_extended, iii1, jjj1, iii2, jjj2; + __m256i tmp_xyzn, i_xyzn; + __mmask8 masktmp_xyzn; + + // Initial set of computation - Computes the vectors defined above, i_xyzn used to generate hashes, s_xyzn_extended, t_xyzn used to compute vectors that will be blended to form multiplicands for dnoise output accumulation + COMPUTE_INITIAL_VECTORS_AVX512(xyzn); + + __m512d incrsump_s11, incrsump_s12, incrsump_s13, incrsump_s21, incrsump_s22, incrsump_s23; + + // Used in computing incrsump_s1 and incrsump_s2 whose values are taken one by one and used for DNoise acculumulation calculation + COMPUTE_INCRSUMP_AVX512(t_xyzn, s_xyzn_extended); + + int ixiy_hash1, jxiy_hash1, ixjy_hash1, jxjy_hash1; + + // Hash values generated using combination of ints[0] and ints[1] + COMPUTE_IJ_HASHES(ixiy_hash1, jxiy_hash1, ixjy_hash1, jxjy_hash1, ints[0], ints[1]); + + const int iz1 = ints[2]; + + // Multiplicand inputs - Typically of the form [0.5, a, b, c, 0.5, d, e, f] + COMPUTE_MULTIPLICAND_INPUTS(xyz_ixyzn_extended, xyz_jxyzn_extended); + + __m512d ss1; + __m512d blend1; + __m512i blend1mask; + __m256d m1, m2; + __m512d c1; + __m512d x1, y1, z1; + + // Gets references from table for all 8 combinations of hash (2^3 from ints[0], ints[1], ints[2]) and uses them along with other precomputed values for DNoise accumulation + GET_INCSUMAVX512_INPUTS(ixiy_hash1, iz1, jxjy_hash1, iz1 + 1, incrsump_s11, mask_permute_fetch1); + blend1 = _mm512_mask_blend_pd(0xF0, iii1, jjj1); + INCSUMAVX512_VECTOR_INITIALIZE(x1, y1, z1, mp1, mp2, ss1, blend1); + + GET_INCSUMAVX512_INPUTS(ixjy_hash1, iz1, jxjy_hash1, iz1, incrsump_s11, mask_permute_fetch2); + blend1 = _mm512_mask_blend_pd(0x64, iii1, jjj1); + INCSUMAVX512_VECTOR(x1, y1, z1, mp1, mp2, ss1, blend1); + + GET_INCSUMAVX512_INPUTS(ixiy_hash1, iz1 + 1, jxiy_hash1, iz1 + 1, incrsump_s11, mask_permute_fetch3); + blend1 = _mm512_mask_blend_pd(0xA8, iii1, jjj1); + INCSUMAVX512_VECTOR(x1, y1, z1, mp1, mp2, ss1, blend1); + + GET_INCSUMAVX512_INPUTS(ixjy_hash1, iz1 + 1, jxiy_hash1, iz1, incrsump_s11, mask_permute_fetch4); + blend1 = _mm512_mask_blend_pd(0x2C, iii1, jjj1); + INCSUMAVX512_VECTOR(x1, y1, z1, mp1, mp2, ss1, blend1); + + + // Similar steps from hash computation done for second input coordinate + int ixiy_hash2, jxiy_hash2, ixjy_hash2, jxjy_hash2; + COMPUTE_IJ_HASHES(ixiy_hash2, jxiy_hash2, ixjy_hash2, jxjy_hash2, ints[4], ints[5]); + + const int iz2 = ints[6]; + + __m512d x2, y2, z2; + + GET_INCSUMAVX512_INPUTS(ixiy_hash2, iz2, jxjy_hash2, iz2 + 1, incrsump_s21, mask_permute_fetch1); + blend1 = _mm512_mask_blend_pd(0xF0, iii2, jjj2); + INCSUMAVX512_VECTOR_INITIALIZE(x2, y2, z2, mp1, mp2, ss1, blend1); + + GET_INCSUMAVX512_INPUTS(ixjy_hash2, iz2, jxjy_hash2, iz2, incrsump_s21, mask_permute_fetch2); + blend1 = _mm512_mask_blend_pd(0x64, iii2, jjj2); + INCSUMAVX512_VECTOR(x2, y2, z2, mp1, mp2, ss1, blend1); + + GET_INCSUMAVX512_INPUTS(ixiy_hash2, iz2 + 1, jxiy_hash2, iz2 + 1, incrsump_s21, mask_permute_fetch3); + blend1 = _mm512_mask_blend_pd(0xA8, iii2, jjj2); + INCSUMAVX512_VECTOR(x2, y2, z2, mp1, mp2, ss1, blend1); + + GET_INCSUMAVX512_INPUTS(ixjy_hash2, iz2 + 1, jxiy_hash2, iz2, incrsump_s21, mask_permute_fetch4); + blend1 = _mm512_mask_blend_pd(0x2C, iii2, jjj2); + INCSUMAVX512_VECTOR(x2, y2, z2, mp1, mp2, ss1, blend1); + + // Reduction to get result vectors + result_vector[0][X] = _mm512_reduce_add_pd(x1); + result_vector[0][Y] = _mm512_reduce_add_pd(y1); + result_vector[0][Z] = _mm512_reduce_add_pd(z1); + result_vector[1][X] = _mm512_reduce_add_pd(x2); + result_vector[1][Y] = _mm512_reduce_add_pd(y2); + result_vector[1][Z] = _mm512_reduce_add_pd(z2); + +#if CHECK_FUNCTIONAL + { + Vector3d portable_res[2]; + PortableDNoise(portable_res[0], param[0]); + PortableDNoise(portable_res[1], param[1]); + if (fabs(portable_res[0][X] - result_vector[0][X]) >= EPSILON) + { + throw POV_EXCEPTION_STRING("DNoise X error"); + } + if (fabs(portable_res[0][Y] - result_vector[0][Y]) >= EPSILON) + { + throw POV_EXCEPTION_STRING("DNoise Y error"); + } + if (fabs(portable_res[0][Z] - result_vector[0][Z]) >= EPSILON) + { + throw POV_EXCEPTION_STRING("DNoise Z error"); + } + if (fabs(portable_res[1][X] - result_vector[1][X]) >= EPSILON) + { + throw POV_EXCEPTION_STRING("DNoise X error"); + } + if (fabs(portable_res[1][Y] - result_vector[1][Y]) >= EPSILON) + { + throw POV_EXCEPTION_STRING("DNoise Y error"); + } + if (fabs(portable_res[1][Z] - result_vector[1][Z]) >= EPSILON) + { + throw POV_EXCEPTION_STRING("DNoise Z error"); + } + + } + +#endif + + _mm256_zeroupper(); + return; +} + +/***************************************************************************** +* +* FUNCTION +* +* AVX512Noise8D +* +* INPUT +* +* EPoint -- Input 3-D point whose noise and its multiples noise is evaluated +* +* OUTPUT +* +* RETURNS +* +* sum_value - Noise values of all 8 eight multiples of input are multiplied with omega_values and reduced add to get the resultant cumulative noise value +* +* AUTHOR +* +* Robert Skinner based on Ken Perlin +* +* DESCRIPTION +* +* Used for computation of Noise for 8 multiples of a single input +* Uses AVX512 calls to process data for the 8 input points based on a single point +* Initial computation done for the two muliples of input Vector3D, followed by Hash Compuatation, sum accumulation and reduction to noise for each of the two 3D points +* The above point is repeated four times and input of the next iteration is derived from the input of the previous +* +* CHANGES +* Modified by AAC to ensure uniformly distributed clamped values +* between 0 and 1.0... +* +* Feb 8, 2001: modified function based on MegaPov 0.7 to remove +* bugs that showed up when noise was translated. +* +* +******************************************************************************/ +DBL AVX512Noise8D(const Vector3d& EPoint, int noise_generator) { + + AVX512TABLETYPE* mp1, * mp2; + //DBL* sum = &value; + //sum[0] = sum[1] = 0.0; + DBL sum[8], sum_value; + + if (noise_generator == kNoiseGen_Perlin) + { + // The 1.59 and 0.985 are to correct for some biasing problems with + // the random # generator used to create the noise tables. Final + // range of values is about 5.0e-4 below 0.0 and above 1.0. Mean + // value is 0.49 (ideally it would be 0.5). + Vector3d EPoint_temp; + EPoint_temp = EPoint * 2.0; + sum[0] = SolidNoise(EPoint_temp); + EPoint_temp = EPoint_temp * 2.0; + sum[1] = SolidNoise(EPoint_temp); + EPoint_temp = EPoint_temp * 2.0; + sum[2] = SolidNoise(EPoint_temp); + EPoint_temp = EPoint_temp * 2.0; + sum[3] = SolidNoise(EPoint_temp); + EPoint_temp = EPoint_temp * 2.0; + sum[4] = SolidNoise(EPoint_temp); + EPoint_temp = EPoint_temp * 2.0; + sum[5] = SolidNoise(EPoint_temp); + EPoint_temp = EPoint_temp * 2.0; + sum[6] = SolidNoise(EPoint_temp); + EPoint_temp = EPoint_temp * 2.0; + sum[7] = SolidNoise(EPoint_temp); + + __m512d sum_vector = _mm512_loadu_pd(sum); + sum_vector = _mm512_mul_pd(sum_vector, multiplication_factor_perlin); + sum_vector = _mm512_add_pd(sum_vector, addition_factor_perlin); + sum_vector = _mm512_mul_pd(sum_vector, POINT_FIVE); + __mmask8 mask_zero = _mm512_cmplt_pd_mask(sum_vector, zero_vector_pd); + sum_vector = _mm512_mask_mov_pd(sum_vector, mask_zero, zero_vector_pd); + __mmask8 mask_one = _mm512_cmple_pd_mask(ONE_PD, sum_vector); + sum_vector = _mm512_mask_mov_pd(sum_vector, mask_one, ONE_PD); + sum_vector = _mm512_mul_pd(sum_vector, TWO_PD); + sum_vector = _mm512_sub_pd(sum_vector, POINT_FIVE); + mask_zero = _mm512_cmplt_pd_mask(sum_vector, zero_vector_pd); + sum_vector = _mm512_mask_mov_pd(sum_vector, mask_zero, zero_vector_pd); + mask_one = _mm512_cmple_pd_mask(ONE_PD, sum_vector); + sum_vector = _mm512_mul_pd(sum_vector, omega_values); + sum_value = _mm512_reduce_add_pd(sum_vector); + return sum_value; + +} + + int ints[8]; + Vector3d EPointOne = EPoint * 2.0; + Vector3d EPointTwo = EPointOne * 2.0; + + // Initialised input EPoints into xyzn and also a vector used for noise min values + __m512d xyzn = _mm512_setr_pd(EPointOne[X], EPointOne[Y], EPointOne[Z], 0, EPointTwo[X], EPointTwo[Y], EPointTwo[Z], 0); + const __m256i noise_min_xyzn = _mm256_setr_epi32(NOISE_MINX, NOISE_MINY, NOISE_MINZ, 0, NOISE_MINX, NOISE_MINY, NOISE_MINZ, 0); + __m512d xyzn_e, s_xyzn_extended, t_xyzn, xyz_ixyzn_extended, xyz_jxyzn_extended, iii1, jjj1, iii2, jjj2; + __m256i tmp_xyzn, i_xyzn; + __mmask8 masktmp_xyzn; + + // Initial set of computation - Computes the vectors defined above, i_xyzn used to generate hashes, s_xyzn_extended, t_xyzn used to compute vectors that will be blended to form multiplicands for Noise output accumulation + COMPUTE_INITIAL_VECTORS_AVX512(xyzn); + + __m512d incrsump_s11, incrsump_s12, incrsump_s13, incrsump_s21, incrsump_s22, incrsump_s23; + + // Used in computing incrsump_s1 and incrsump_s2 whose values are taken one by one and used for Noise acculumulation calculation + COMPUTE_INCRSUMP_AVX512(t_xyzn, s_xyzn_extended); + + int ixiy_hash1, jxiy_hash1, ixjy_hash1, jxjy_hash1; + + // Computes 4 hashes (2^2) based on two inputs - ints[0] and ints[1] + COMPUTE_IJ_HASHES(ixiy_hash1, jxiy_hash1, ixjy_hash1, jxjy_hash1, ints[0], ints[1]); + + int iz1 = ints[2]; + + // Multiplicand inputs - Typically of the form [0.5, a, b, c, 0.5, d, e, f] + COMPUTE_MULTIPLICAND_INPUTS(xyz_ixyzn_extended, xyz_jxyzn_extended); + + // Noise is accumulated in 8 different vectors which will be reduced to get the noise for input EPoint + __m512d ss1; + __m512d blend1; + __m512i blend1mask; + __m256d m1, m2; + __m512d c1; + __m512d sumr1, sumr2, sumr3, sumr4, sumr5, sumr6, sumr7, sumr8, sum_vector; + + // Gets references from table for all 8 combinations of hash (2^3 from ints[0], ints[1], ints[2]) and uses them along with other precomputed values for Noise accumulation + GET_INCSUMAVX512_INPUTS(ixiy_hash1, iz1, jxjy_hash1, iz1 + 1, incrsump_s11, mask_permute_fetch1); + INCSUMAVX512_INITIALIZE(sumr1,mp1,mp2,ss1,iii1,jjj1,0xF0); + + GET_INCSUMAVX512_INPUTS(ixjy_hash1, iz1, jxjy_hash1, iz1, incrsump_s11, mask_permute_fetch2); + INCSUMAVX512(sumr1,mp1,mp2,ss1,iii1,jjj1,0x64); + + GET_INCSUMAVX512_INPUTS(ixiy_hash1, iz1 + 1, jxiy_hash1, iz1 + 1, incrsump_s11, mask_permute_fetch3); + INCSUMAVX512(sumr1,mp1,mp2,ss1,iii1,jjj1,0xA8); + + GET_INCSUMAVX512_INPUTS(ixjy_hash1, iz1 + 1, jxiy_hash1, iz1, incrsump_s11, mask_permute_fetch4); + INCSUMAVX512(sumr1,mp1,mp2,ss1,iii1,jjj1,0x2C); + + int ixiy_hash2, jxiy_hash2, ixjy_hash2, jxjy_hash2; + + // Hashing and similar compuatations for second vector + COMPUTE_IJ_HASHES(ixiy_hash2, jxiy_hash2, ixjy_hash2, jxjy_hash2, ints[4], ints[5]); + + int iz2 = ints[6]; + + GET_INCSUMAVX512_INPUTS(ixiy_hash2, iz2, jxjy_hash2, iz2 + 1, incrsump_s21, mask_permute_fetch1); + INCSUMAVX512_INITIALIZE(sumr2,mp1,mp2,ss1,iii2,jjj2,0xF0); + + GET_INCSUMAVX512_INPUTS(ixjy_hash2, iz2, jxjy_hash2, iz2, incrsump_s21, mask_permute_fetch2); + INCSUMAVX512(sumr2,mp1,mp2,ss1,iii2,jjj2,0x64); + + GET_INCSUMAVX512_INPUTS(ixiy_hash2, iz2 + 1, jxiy_hash2, iz2 + 1, incrsump_s21, mask_permute_fetch3); + INCSUMAVX512(sumr2,mp1,mp2,ss1,iii2,jjj2,0xA8); + + GET_INCSUMAVX512_INPUTS(ixjy_hash2, iz2 + 1, jxiy_hash2, iz2, incrsump_s21, mask_permute_fetch4); + INCSUMAVX512(sumr2,mp1,mp2,ss1,iii2,jjj2,0x2C); + + // For the next set of computations EPoint * 8, EPoint * 16 is used for computation after storing it in xyzn, similar to EPoint * 2, EPoint * 4 + xyzn = _mm512_mul_pd(xyzn, FOUR_PD); + COMPUTE_INITIAL_VECTORS_AVX512(xyzn); + + COMPUTE_INCRSUMP_AVX512(t_xyzn, s_xyzn_extended); + + COMPUTE_IJ_HASHES(ixiy_hash1, jxiy_hash1, ixjy_hash1, jxjy_hash1, ints[0], ints[1]); + + iz1 = ints[2]; + + COMPUTE_MULTIPLICAND_INPUTS(xyz_ixyzn_extended, xyz_jxyzn_extended); + + GET_INCSUMAVX512_INPUTS(ixiy_hash1, iz1, jxjy_hash1, iz1 + 1, incrsump_s11, mask_permute_fetch1); + INCSUMAVX512_INITIALIZE(sumr3, mp1, mp2, ss1, iii1, jjj1, 0xF0); + + GET_INCSUMAVX512_INPUTS(ixjy_hash1, iz1, jxjy_hash1, iz1, incrsump_s11, mask_permute_fetch2); + INCSUMAVX512(sumr3, mp1, mp2, ss1, iii1, jjj1, 0x64); + + GET_INCSUMAVX512_INPUTS(ixiy_hash1, iz1 + 1, jxiy_hash1, iz1 + 1, incrsump_s11, mask_permute_fetch3); + INCSUMAVX512(sumr3, mp1, mp2, ss1, iii1, jjj1, 0xA8); + + GET_INCSUMAVX512_INPUTS(ixjy_hash1, iz1 + 1, jxiy_hash1, iz1, incrsump_s11, mask_permute_fetch4); + INCSUMAVX512(sumr3, mp1, mp2, ss1, iii1, jjj1, 0x2C); + + COMPUTE_IJ_HASHES(ixiy_hash2, jxiy_hash2, ixjy_hash2, jxjy_hash2, ints[4], ints[5]); + + iz2 = ints[6]; + + GET_INCSUMAVX512_INPUTS(ixiy_hash2, iz2, jxjy_hash2, iz2 + 1, incrsump_s21, mask_permute_fetch1); + INCSUMAVX512_INITIALIZE(sumr4, mp1, mp2, ss1, iii2, jjj2, 0xF0); + + GET_INCSUMAVX512_INPUTS(ixjy_hash2, iz2, jxjy_hash2, iz2, incrsump_s21, mask_permute_fetch2); + INCSUMAVX512(sumr4, mp1, mp2, ss1, iii2, jjj2, 0x64); + + GET_INCSUMAVX512_INPUTS(ixiy_hash2, iz2 + 1, jxiy_hash2, iz2 + 1, incrsump_s21, mask_permute_fetch3); + INCSUMAVX512(sumr4, mp1, mp2, ss1, iii2, jjj2, 0xA8); + + GET_INCSUMAVX512_INPUTS(ixjy_hash2, iz2 + 1, jxiy_hash2, iz2, incrsump_s21, mask_permute_fetch4); + INCSUMAVX512(sumr4, mp1, mp2, ss1, iii2, jjj2, 0x2C); + + // Computation for EPoint * 32, EPoint * 64 + xyzn = _mm512_mul_pd(xyzn, FOUR_PD); + COMPUTE_INITIAL_VECTORS_AVX512(xyzn); + + COMPUTE_INCRSUMP_AVX512(t_xyzn, s_xyzn_extended); + + COMPUTE_IJ_HASHES(ixiy_hash1, jxiy_hash1, ixjy_hash1, jxjy_hash1, ints[0], ints[1]); + + iz1 = ints[2]; + + COMPUTE_MULTIPLICAND_INPUTS(xyz_ixyzn_extended, xyz_jxyzn_extended); + + GET_INCSUMAVX512_INPUTS(ixiy_hash1, iz1, jxjy_hash1, iz1 + 1, incrsump_s11, mask_permute_fetch1); + INCSUMAVX512_INITIALIZE(sumr5, mp1, mp2, ss1, iii1, jjj1, 0xF0); + + GET_INCSUMAVX512_INPUTS(ixjy_hash1, iz1, jxjy_hash1, iz1, incrsump_s11, mask_permute_fetch2); + INCSUMAVX512(sumr5, mp1, mp2, ss1, iii1, jjj1, 0x64); + + GET_INCSUMAVX512_INPUTS(ixiy_hash1, iz1 + 1, jxiy_hash1, iz1 + 1, incrsump_s11, mask_permute_fetch3); + INCSUMAVX512(sumr5, mp1, mp2, ss1, iii1, jjj1, 0xA8); + + GET_INCSUMAVX512_INPUTS(ixjy_hash1, iz1 + 1, jxiy_hash1, iz1, incrsump_s11, mask_permute_fetch4); + INCSUMAVX512(sumr5, mp1, mp2, ss1, iii1, jjj1, 0x2C); + + COMPUTE_IJ_HASHES(ixiy_hash2, jxiy_hash2, ixjy_hash2, jxjy_hash2, ints[4], ints[5]); + + iz2 = ints[6]; + + GET_INCSUMAVX512_INPUTS(ixiy_hash2, iz2, jxjy_hash2, iz2 + 1, incrsump_s21, mask_permute_fetch1); + INCSUMAVX512_INITIALIZE(sumr6, mp1, mp2, ss1, iii2, jjj2, 0xF0); + + GET_INCSUMAVX512_INPUTS(ixjy_hash2, iz2, jxjy_hash2, iz2, incrsump_s21, mask_permute_fetch2); + INCSUMAVX512(sumr6, mp1, mp2, ss1, iii2, jjj2, 0x64); + + GET_INCSUMAVX512_INPUTS(ixiy_hash2, iz2 + 1, jxiy_hash2, iz2 + 1, incrsump_s21, mask_permute_fetch3); + INCSUMAVX512(sumr6, mp1, mp2, ss1, iii2, jjj2, 0xA8); + + GET_INCSUMAVX512_INPUTS(ixjy_hash2, iz2 + 1, jxiy_hash2, iz2, incrsump_s21, mask_permute_fetch4); + INCSUMAVX512(sumr6, mp1, mp2, ss1, iii2, jjj2, 0x2C); + + // Computation for EPoint * 128, EPoint * 256 + xyzn = _mm512_mul_pd(xyzn, FOUR_PD); + COMPUTE_INITIAL_VECTORS_AVX512(xyzn); + + COMPUTE_INCRSUMP_AVX512(t_xyzn, s_xyzn_extended); + + COMPUTE_IJ_HASHES(ixiy_hash1, jxiy_hash1, ixjy_hash1, jxjy_hash1, ints[0], ints[1]); + + iz1 = ints[2]; + + COMPUTE_MULTIPLICAND_INPUTS(xyz_ixyzn_extended, xyz_jxyzn_extended); + + GET_INCSUMAVX512_INPUTS(ixiy_hash1, iz1, jxjy_hash1, iz1 + 1, incrsump_s11, mask_permute_fetch1); + INCSUMAVX512_INITIALIZE(sumr7, mp1, mp2, ss1, iii1, jjj1, 0xF0); + + GET_INCSUMAVX512_INPUTS(ixjy_hash1, iz1, jxjy_hash1, iz1, incrsump_s11, mask_permute_fetch2); + INCSUMAVX512(sumr7, mp1, mp2, ss1, iii1, jjj1, 0x64); + + GET_INCSUMAVX512_INPUTS(ixiy_hash1, iz1 + 1, jxiy_hash1, iz1 + 1, incrsump_s11, mask_permute_fetch3); + INCSUMAVX512(sumr7, mp1, mp2, ss1, iii1, jjj1, 0xA8); + + GET_INCSUMAVX512_INPUTS(ixjy_hash1, iz1 + 1, jxiy_hash1, iz1, incrsump_s11, mask_permute_fetch4); + INCSUMAVX512(sumr7, mp1, mp2, ss1, iii1, jjj1, 0x2C); + + COMPUTE_IJ_HASHES(ixiy_hash2, jxiy_hash2, ixjy_hash2, jxjy_hash2, ints[4], ints[5]); + + iz2 = ints[6]; + + GET_INCSUMAVX512_INPUTS(ixiy_hash2, iz2, jxjy_hash2, iz2 + 1, incrsump_s21, mask_permute_fetch1); + INCSUMAVX512_INITIALIZE(sumr8, mp1, mp2, ss1, iii2, jjj2, 0xF0); + + GET_INCSUMAVX512_INPUTS(ixjy_hash2, iz2, jxjy_hash2, iz2, incrsump_s21, mask_permute_fetch2); + INCSUMAVX512(sumr8, mp1, mp2, ss1, iii2, jjj2, 0x64); + + GET_INCSUMAVX512_INPUTS(ixiy_hash2, iz2 + 1, jxiy_hash2, iz2 + 1, incrsump_s21, mask_permute_fetch3); + INCSUMAVX512(sumr8, mp1, mp2, ss1, iii2, jjj2, 0xA8); + + GET_INCSUMAVX512_INPUTS(ixjy_hash2, iz2 + 1, jxiy_hash2, iz2, incrsump_s21, mask_permute_fetch4); + INCSUMAVX512(sumr8, mp1, mp2, ss1, iii2, jjj2, 0x2C); + + // Reduction of values to get noise for each EPoint whcih we load in a vector + sum[0] = _mm512_reduce_add_pd(sumr1); + sum[1] = _mm512_reduce_add_pd(sumr2); + sum[2] = _mm512_reduce_add_pd(sumr3); + sum[3] = _mm512_reduce_add_pd(sumr4); + sum[4] = _mm512_reduce_add_pd(sumr5); + sum[5] = _mm512_reduce_add_pd(sumr6); + sum[6] = _mm512_reduce_add_pd(sumr7); + sum[7] = _mm512_reduce_add_pd(sumr8); + + + if (noise_generator == kNoiseGen_RangeCorrected) + { + /* details of range here: + Min, max: -1.05242, 0.988997 + Mean: -0.0191481, Median: -0.535493, Std Dev: 0.256828 + + We want to change it to as close to [0,1] as possible. + */ + sum_vector = _mm512_loadu_pd(sum); + sum_vector = _mm512_add_pd(sum_vector, addition_factor_range); + sum_vector = _mm512_mul_pd(sum_vector, multiplication_factor_range); + __mmask8 mask_zero = _mm512_cmplt_pd_mask(sum_vector, zero_vector_pd); + sum_vector = _mm512_mask_mov_pd(sum_vector, mask_zero, zero_vector_pd); + __mmask8 mask_one = _mm512_cmple_pd_mask(ONE_PD, sum_vector); + sum_vector = _mm512_mask_mov_pd(sum_vector, mask_one, ONE_PD); + sum_vector = _mm512_mul_pd(sum_vector, TWO_PD); + sum_vector = _mm512_sub_pd(sum_vector, POINT_FIVE); + mask_zero = _mm512_cmplt_pd_mask(sum_vector, zero_vector_pd); + sum_vector = _mm512_mask_mov_pd(sum_vector, mask_zero, zero_vector_pd); + mask_one = _mm512_cmple_pd_mask(ONE_PD, sum_vector); + // Multiplication done with omega values which are multiples of 0.5. Reduced to get a double value that is accumulated in the function call + sum_vector = _mm512_mul_pd(sum_vector, omega_values); + sum_value = _mm512_reduce_add_pd(sum_vector); + } + else + { + /* range at this point -0.5 - 0.5... */ + + sum_vector = _mm512_loadu_pd(sum); + sum_vector = _mm512_add_pd(sum_vector, POINT_FIVE); + __mmask8 mask_zero = _mm512_cmplt_pd_mask(sum_vector, zero_vector_pd); + sum_vector = _mm512_mask_mov_pd(sum_vector, mask_zero, zero_vector_pd); + __mmask8 mask_one = _mm512_cmple_pd_mask(ONE_PD, sum_vector); + sum_vector = _mm512_mask_mov_pd(sum_vector, mask_one, ONE_PD); + // Multiplication done with omega values which are multiples of 0.5. Reduced to get a double value that is accumulated in the function cal + sum_vector = _mm512_mul_pd(sum_vector, omega_values); + sum_value = _mm512_reduce_add_pd(sum_vector); + } + +#if CHECK_FUNCTIONAL + { + DBL orig_sum[8]; + Vector3d EPoint_temp; + EPoint_temp = EPoint * 2.0; + orig_sum[0] = PortableNoise(EPoint, noise_generator); + EPoint_temp = EPoint_temp * 2.0; + orig_sum[1] = PortableNoise(EPoint, noise_generator); + EPoint_temp = EPoint_temp * 2.0; + orig_sum[2] = PortableNoise(EPoint, noise_generator); + EPoint_temp = EPoint_temp * 2.0; + orig_sum[3] = PortableNoise(EPoint, noise_generator); + EPoint_temp = EPoint_temp * 2.0; + orig_sum[4] = PortableNoise(EPoint, noise_generator); + EPoint_temp = EPoint_temp * 2.0; + orig_sum[5] = PortableNoise(EPoint, noise_generator); + EPoint_temp = EPoint_temp * 2.0; + orig_sum[6] = PortableNoise(EPoint, noise_generator); + EPoint_temp = EPoint_temp * 2.0; + orig_sum[7] = PortableNoise(EPoint, noise_generator); + if (fabs(orig_sum[0] - sum[0]) >= EPSILON) + { + throw POV_EXCEPTION_STRING("Noise error"); + } + if (fabs(orig_sum[1] - sum[1]) >= EPSILON) + { + throw POV_EXCEPTION_STRING("Noise error"); + } + if (fabs(orig_sum[2] - sum[2]) >= EPSILON) + { + throw POV_EXCEPTION_STRING("Noise error"); + } + if (fabs(orig_sum[3] - sum[3]) >= EPSILON) + { + throw POV_EXCEPTION_STRING("Noise error"); + } + if (fabs(orig_sum[4] - sum[4]) >= EPSILON) + { + throw POV_EXCEPTION_STRING("Noise error"); + } + if (fabs(orig_sum[5] - sum[5]) >= EPSILON) + { + throw POV_EXCEPTION_STRING("Noise error"); + } + if (fabs(orig_sum[6] - sum[6]) >= EPSILON) + { + throw POV_EXCEPTION_STRING("Noise error"); + } + if (fabs(orig_sum[7] - sum[7]) >= EPSILON) + { + throw POV_EXCEPTION_STRING("Noise error"); + } + } + +#endif + _mm256_zeroupper(); + return sum_value; +} + +#else // DISABLE_OPTIMIZED_NOISE_AVX512 + +const bool kAVX512NoiseEnabled = false; +void AVX512NoiseInit() { POV_ASSERT(false); } +DBL AVX512Noise(const Vector3d& EPoint, int noise_generator) { POV_ASSERT(false); return 0.0; } +void AVX512DNoise(Vector3d& result, const Vector3d& EPoint) { POV_ASSERT(false); } +void AVX512Noise2D(const Vector3d& EPoint, int noise_generator, double& value) { POV_ASSERT(false); } +void AVX512DNoise2D(Vector3d& result, const Vector3d& EPoint) { POV_ASSERT(false); } +DBL AVX512Noise8D(const Vector3d& EPoint, int noise_generator) { POV_ASSERT(false); return 0.0; } + +#endif // DISABLE_OPTIMIZED_NOISE_AVX512 + +} + +#endif // TRY_OPTIMIZED_NOISE_AVX512 + diff --git a/platform/x86/avx512/avx512noise.h b/platform/x86/avx512/avx512noise.h new file mode 100644 index 000000000..01caf07c2 --- /dev/null +++ b/platform/x86/avx512/avx512noise.h @@ -0,0 +1,73 @@ +//****************************************************************************** +/// +/// @file platform/x86/avx512/avx5123noise.h +/// +/// This file contains declarations related to implementations of the noise +/// generator optimized for the AVX512 instruction set. +/// +/// @copyright +/// @parblock +/// +/// Persistence of Vision Ray Tracer ('POV-Ray') version 3.8. +/// Copyright 1991-2017 Persistence of Vision Raytracer Pty. Ltd. +/// +/// POV-Ray is free software: you can redistribute it and/or modify +/// it under the terms of the GNU Affero General Public License as +/// published by the Free Software Foundation, either version 3 of the +/// License, or (at your option) any later version. +/// +/// POV-Ray is distributed in the hope that it will be useful, +/// but WITHOUT ANY WARRANTY; without even the implied warranty of +/// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/// GNU Affero General Public License for more details. +/// +/// You should have received a copy of the GNU Affero General Public License +/// along with this program. If not, see . +/// +/// ---------------------------------------------------------------------------- +/// +/// POV-Ray is based on the popular DKB raytracer version 2.12. +/// DKBTrace was originally written by David K. Buck. +/// DKBTrace Ver 2.0-2.12 were written by David K. Buck & Aaron A. Collins. +/// +/// @endparblock +/// +//****************************************************************************** + +#ifndef POVRAY_AVX512NOISE_H +#define POVRAY_AVX512NOISE_H + +#include "core/configcore.h" +#include "core/math/vector.h" + +#ifdef TRY_OPTIMIZED_NOISE_AVX512 + +namespace pov +{ + +extern const bool kAVX512NoiseEnabled; +void AVX512NoiseInit(); + +/// Optimized Noise function for single input for AVX512 architecture +DBL AVX512Noise(const Vector3d& EPoint, int noise_generator); + +/// Optimized DNoise function for single input for AVX512 architecture +void AVX512DNoise(Vector3d& result, const Vector3d& EPoint); + +/// Optimized Noise function for two inputs using AVX512 instructions +/// @author Optimized by MCW +void AVX512Noise2D(const Vector3d& EPoint, int noise_generator, double& value); + +/// Optimized DNoise function for two inputs using AVX512 instructions +/// @author Optimized by MCW +void AVX512DNoise2D(Vector3d& result, const Vector3d& EPoint); + +/// Optimized Noise function for 8 multiples of single input using AVX512 instructions. +/// @author Optimized by MCW +DBL AVX512Noise8D(const Vector3d& EPoint, int noise_generator); + +} + +#endif // TRY_OPTIMIZED_NOISE_AVX512 + +#endif // POVRAY_AVX512NOISE_H diff --git a/platform/x86/cpuid.cpp b/platform/x86/cpuid.cpp index 5b38296ca..81cfe8a6b 100644 --- a/platform/x86/cpuid.cpp +++ b/platform/x86/cpuid.cpp @@ -114,6 +114,7 @@ static unsigned long long getXCR0() #define CPUID_00000001_ECX_AVX_MASK (0x1 << 28) #define CPUID_00000001_EDX_SSE2_MASK (0x1 << 26) #define CPUID_00000007_EBX_AVX2_MASK (0x1 << 5) +#define CPUID_00000007_EBX_AVX512_MASK (0x1 << 16) #define CPUID_80000001_ECX_FMA4_MASK (0x1 << 16) // Masks for relevant XCR0 register bits. @@ -170,6 +171,7 @@ struct CPUIDInfo bool sse2 : 1; bool avx : 1; bool avx2 : 1; + bool avx512 : 1; bool fma3 : 1; bool fma4 : 1; #if POV_CPUINFO_DEBUG @@ -184,6 +186,7 @@ CPUIDInfo::CPUIDInfo() : sse2(false), avx(false), avx2(false), + avx512(false), fma3(false), fma4(false), vendorId(kCPUVendor_Unrecognized) @@ -220,6 +223,11 @@ CPUIDInfo::CPUIDInfo() : CPUID(info, 0x7); avx2 = ((info[CPUID_EBX] & CPUID_00000007_EBX_AVX2_MASK) != 0); } + if (maxLeaf >= 0x7) + { + CPUID(info, 0x7); + avx512 = ((info[CPUID_EBX] & CPUID_00000007_EBX_AVX512_MASK) != 0); + } CPUID(info, 0x80000000); int maxLeafExt = info[CPUID_EAX]; if (maxLeafExt >= (int)0x80000001) @@ -233,6 +241,7 @@ struct OSInfo { bool xcr0_sse : 1; bool xcr0_avx : 1; + bool xcr0_avx512 : 1; OSInfo(const CPUIDInfo& cpuinfo); }; @@ -278,6 +287,16 @@ bool CPUInfo::SupportsAVX() && gpData->osInfo.xcr0_avx; } +bool CPUInfo::SupportsAVX512() +{ + return gpData->cpuidInfo.osxsave + && gpData->cpuidInfo.avx + && gpData->cpuidInfo.avx2 + && gpData->cpuidInfo.avx512 + && gpData->osInfo.xcr0_sse + && gpData->osInfo.xcr0_avx; +} + bool CPUInfo::SupportsAVX2() { return gpData->cpuidInfo.osxsave @@ -329,6 +348,8 @@ std::string CPUInfo::GetFeatures() features.push_back("AVX"); if (SupportsAVX2()) features.push_back("AVX2"); + if (SupportsAVX512()) + features.push_back("AVX512"); if (SupportsFMA3()) features.push_back("FMA3"); if (SupportsFMA4()) @@ -356,6 +377,8 @@ std::string CPUInfo::GetDetails() cpuidFeatures.push_back("AVX"); if (gpData->cpuidInfo.avx2) cpuidFeatures.push_back("AVX2"); + if (gpData->cpuidInfo.avx512) + cpuidFeatures.push_back("AVX512"); if (gpData->cpuidInfo.fma3) cpuidFeatures.push_back("FMA"); if (gpData->cpuidInfo.fma4) @@ -371,6 +394,8 @@ std::string CPUInfo::GetDetails() if (gpData->osInfo.xcr0_avx) xcr0Features.push_back("AVX"); + if (gpData->osInfo.xcr0_avx) + xcr0Features.push_back("AVX512"); if (gpData->osInfo.xcr0_sse) xcr0Features.push_back("SSE"); diff --git a/platform/x86/cpuid.h b/platform/x86/cpuid.h index 4824c8ee8..fab1e4b29 100644 --- a/platform/x86/cpuid.h +++ b/platform/x86/cpuid.h @@ -45,6 +45,7 @@ class CPUInfo static bool SupportsSSE2(); ///< Test whether CPU and OS support SSE2. static bool SupportsAVX(); ///< Test whether CPU and OS support AVX. static bool SupportsAVX2(); ///< Test whether CPU and OS support AVX2. + static bool SupportsAVX512(); ///< Test whether CPU and OS support AVX512. static bool SupportsFMA3(); ///< Test whether CPU and OS support FMA3. static bool SupportsFMA4(); ///< Test whether CPU and OS support FMA4. static bool IsIntel(); ///< Test whether CPU is genuine Intel product. diff --git a/platform/x86/optimizednoise.cpp b/platform/x86/optimizednoise.cpp index 6ea010f9c..aae58e987 100644 --- a/platform/x86/optimizednoise.cpp +++ b/platform/x86/optimizednoise.cpp @@ -39,6 +39,10 @@ #include "core/material/noise.h" +#ifdef TRY_OPTIMIZED_NOISE_AVX512 +#include "avx512/avx512noise.h" +#endif + #ifdef TRY_OPTIMIZED_NOISE_AVX2FMA3 #include "avx2fma3/avx2fma3noise.h" #endif @@ -65,6 +69,7 @@ namespace pov static bool AVXSupported() { return CPUInfo::SupportsAVX(); } static bool AVXFMA4Supported() { return CPUInfo::SupportsAVX() && CPUInfo::SupportsFMA4(); } static bool AVX2FMA3Supported() { return CPUInfo::SupportsAVX2() && CPUInfo::SupportsFMA3(); } +static bool AVX512Supported() { return CPUInfo::SupportsAVX512(); } /// List of optimized noise implementations. /// @@ -72,12 +77,40 @@ static bool AVX2FMA3Supported() { return CPUInfo::SupportsAVX2() && CPUInfo::Sup /// Entries must be listed in descending order of preference. /// OptimizedNoiseInfo gaOptimizedNoiseInfo[] = { +#ifdef TRY_OPTIMIZED_NOISE_AVX512 + { + "avx512-mcw", // name, + "hand-optimized by MCW", // info, + AVX512Noise, // noise, + AVX512DNoise, // dNoise, + AVX512Noise2D, // noise2D, + AVX512DNoise2D, // dNoise2D, + AVX512Noise8D, // noise8D, + DTurbulenceAVX512, // DTurbulence + Initialize_WavesAVX512, // Initalize Waves + TurbulenceAVX512, // Turbulence + wrinklesAVX512, // wrinkles + true, // value to set versions of WrinklesPattern and GranitePattern + &kAVX512NoiseEnabled, // enabled, + AVX512Supported, // supported, + nullptr, // recommended, + AVX512NoiseInit // init + }, +#endif #ifdef TRY_OPTIMIZED_NOISE_AVX2FMA3 { "avx2fma3-intel", // name, "hand-optimized by Intel", // info, AVX2FMA3Noise, // noise, AVX2FMA3DNoise, // dNoise, + nullptr, // noise2D + nullptr, // dnoise2D, + nullptr, // noise8D, + DTurbulenceAVX, // DTurbulence + Initialize_WavesAVX, // Initalize Waves + TurbulenceAVX, // Turbulence + wrinklesAVX, // wrinkles + false, // value to set versions of WrinklesPattern and GranitePattern &kAVX2FMA3NoiseEnabled, // enabled, AVX2FMA3Supported, // supported, CPUInfo::IsIntel, // recommended, @@ -90,6 +123,14 @@ OptimizedNoiseInfo gaOptimizedNoiseInfo[] = { "hand-optimized by AMD, 2017-04 update", // info, AVXFMA4Noise, // noise, AVXFMA4DNoise, // dNoise, + nullptr, // noise2D + nullptr, // dnoise2D, + nullptr, // noise8D, + DTurbulenceAVX, // DTurbulence + Initialize_WavesAVX, // Initalize Waves + TurbulenceAVX, // Turbulence + wrinklesAVX, // wrinkles + false, // value to set versions of WrinklesPattern and GranitePattern &kAVXFMA4NoiseEnabled, // enabled, AVXFMA4Supported, // supported, nullptr, // recommended, @@ -102,6 +143,14 @@ OptimizedNoiseInfo gaOptimizedNoiseInfo[] = { "hand-optimized by Intel", // info, AVXNoise, // noise, AVXDNoise, // dNoise, + nullptr, // noise2D + nullptr, // dnoise2D, + nullptr, // noise8D, + DTurbulenceAVX, // DTurbulence + Initialize_WavesAVX, // Initalize Waves + TurbulenceAVX, // Turbulence + wrinklesAVX, // wrinkles + false, // value to set versions of WrinklesPattern and GranitePattern &kAVXNoiseEnabled, // enabled, AVXSupported, // supported, CPUInfo::IsIntel, // recommended, @@ -114,6 +163,14 @@ OptimizedNoiseInfo gaOptimizedNoiseInfo[] = { "compiler-optimized", // info, AVXPortableNoise, // noise, AVXPortableDNoise, // dNoise, + nullptr, // noise2D + nullptr, // dnoise2D, + nullptr, // noise8D, + DTurbulenceAVX, // DTurbulence + Initialize_WavesAVX, // Initalize Waves + TurbulenceAVX, // Turbulence + wrinklesAVX, // wrinkles + false, // value to set versions of WrinklesPattern and GranitePattern &kAVXPortableNoiseEnabled, // enabled, AVXSupported, // supported, nullptr, // recommended, diff --git a/source/core/material/noise.cpp b/source/core/material/noise.cpp index 86e920e0d..7196dd183 100644 --- a/source/core/material/noise.cpp +++ b/source/core/material/noise.cpp @@ -44,6 +44,8 @@ // Unit header file must be the first file included within POV-Ray *.cpp files (pulls in config) #include "core/material/noise.h" +#include "core/material/normal.h" +#include "core/material/pattern.h" // this must be the last file included #include "base/povdebug.h" @@ -171,8 +173,11 @@ void Initialize_Noise() sintab[i] = sin((DBL)i / SINTABSIZE * TWO_M_PI); } -void Initialize_Waves(vector& waveFrequencies, vector& waveSources, unsigned int numberOfWaves) +// Original Initialze Waves function + +void Initialize_WavesAVX(vector& waveFrequencies, vector& waveSources, unsigned int numberOfWaves) { + Vector3d point; waveFrequencies.clear(); @@ -189,6 +194,37 @@ void Initialize_Waves(vector& waveFrequencies, vector& waveSou } } +// Variant of Initialize Waves for AVX512 version - DNoise function processes two inputs at one time + +void Initialize_WavesAVX512(vector& waveFrequencies, vector& waveSources, unsigned int numberOfWaves) +{ + Vector3d point[2]; + + waveFrequencies.clear(); + waveSources.clear(); + + int i, next_rand; + for(i = 0, next_rand = -560851967; i < numberOfWaves - 1; i += 2) + { + point[0] = Vector3d((double)i,0.0,0.0); + point[1] = Vector3d((double)i + 1,0.0,0.0); + DNoise2D(*point, *point); + waveSources.push_back(point[0].normalized()); + waveSources.push_back(point[1].normalized()); + next_rand = next_rand * 1812433253L + 12345L; + waveFrequencies.push_back((double((int)(next_rand >> 16) & 0x7FFF) * 0.000030518509476) + 0.01); + next_rand = next_rand * 1812433253L + 12345L; + waveFrequencies.push_back((double((int)(next_rand >> 16) & 0x7FFF) * 0.000030518509476) + 0.01); + } + if(i == numberOfWaves - 1) { + point[0] = Vector3d((double)i,0.0,0.0); + DNoise(point[0], point[0]); + waveSources.push_back(point[0].normalized()); + next_rand = next_rand * 1812433253L + 12345L; + waveFrequencies.push_back((double((int)(next_rand >> 16) & 0x7FFF) * 0.000030518509476) + 0.01); + } +} + /***************************************************************************** @@ -504,7 +540,9 @@ SolidDNoise(const Vector3d& P, Vector3d& D) * ******************************************************************************/ -DBL Turbulence(const Vector3d& EPoint, const GenericTurbulenceWarp *Turb, int noise_generator) +// Original Turbulence function + +DBL TurbulenceAVX(const Vector3d& EPoint, const GenericTurbulenceWarp *Turb, int noise_generator) { int i; DBL Lambda, Omega, l, o, value; @@ -549,6 +587,74 @@ DBL Turbulence(const Vector3d& EPoint, const GenericTurbulenceWarp *Turb, int no o *= Omega; } } + + return (value); +} + +// Variant of Turbulence written for AVX512 version - Noise processes two inputs at one time + +DBL TurbulenceAVX512(const Vector3d& EPoint, const GenericTurbulenceWarp *Turb, int noise_generator) +{ + int i; + DBL Lambda, Omega, l, o, value, noise[2]; + Vector3d temp[2]; + + int Octaves=Turb->Octaves; + + // TODO - This distinction (with minor variations that seem to be more of an inconsistency rather than intentional) + // appears in other places as well; make it a function. + switch(noise_generator) + { + case kNoiseGen_Default: + case kNoiseGen_Original: + value = Noise(EPoint, noise_generator); + break; + default: + value = (2.0 * Noise(EPoint, noise_generator) - 0.5); + value = min(max(value,0.0),1.0); + break; + } + + l = Lambda = Turb->Lambda; + o = Omega = Turb->Omega; + + for (i = 2; i < Octaves; i+=2) + { + temp[0] = EPoint * l; + temp[1] = EPoint * l * Lambda; + Noise2D(*temp, noise_generator, *noise); + switch(noise_generator) + { + case kNoiseGen_Default: + case kNoiseGen_Original: + value += o * noise[0]; + value += o * Omega * noise[1]; + break; + default: + value += o * (2.0 * noise[0] - 0.5); // TODO similar code clips the (2.0 * Noise(temp, noise_generator) - 0.5) term + value += o * Omega * (2.0 * noise[1] - 0.5); + break; + } + l *= Lambda * Lambda; + o *= Omega * Omega; + } + + if(i == Octaves) { + temp[0] = EPoint * l; + // TODO - This distinction (with minor variations that seem to be more of an inconsistency rather than intentional) + // appears in other places as well; make it a function. + switch(noise_generator) + { + case kNoiseGen_Default: + case kNoiseGen_Original: + value += o * Noise(temp[0], noise_generator); + break; + default: + value += o * (2.0 * Noise(temp[0], noise_generator) - 0.5); // TODO similar code clips the (2.0 * Noise(temp, noise_generator) - 0.5) term + break; + } + } + return (value); } @@ -582,9 +688,9 @@ DBL Turbulence(const Vector3d& EPoint, const GenericTurbulenceWarp *Turb, int no * ??? ???? : Updated with varible Octaves, Lambda, & Omega by [DMF] * ******************************************************************************/ +// Original DTurbulence function - -void DTurbulence(Vector3d& result, const Vector3d& EPoint, const GenericTurbulenceWarp *Turb) +void DTurbulenceAVX(Vector3d& result, const Vector3d& EPoint, const GenericTurbulenceWarp *Turb) { DBL Omega, Lambda; int i; @@ -614,11 +720,54 @@ void DTurbulence(Vector3d& result, const Vector3d& EPoint, const GenericTurbulen } } +// Variant of DTurbulence written for AVX512 version + +void DTurbulenceAVX512(Vector3d& result, const Vector3d& EPoint, const GenericTurbulenceWarp *Turb) +{ + DBL Omega, Lambda; + int i; + DBL l, o; + int Octaves=Turb->Octaves; + Vector3d value[2], temp[2]; + result[X] = result[Y] = result[Z] = 0.0; + value[0][X] = value[0][Y] = value[0][Z] = 0.0; + value[1][X] = value[1][Y] = value[1][Z] = 0.0; + + DNoise(result, EPoint); + + l = Lambda = Turb->Lambda; + o = Omega = Turb->Omega; + + // Processes two input Vector3D EPoint at a time - Result vector reduced from the resultant DNoise vectors + for (i = 2; i < Octaves; i += 2) + { + temp[0] = EPoint * l; + temp[1] = EPoint * l * Lambda; + DNoise2D(*value, *temp); + result += o * value[0]; + result += o * Omega * value[1]; + l *= Lambda * Lambda; + o *= Omega * Omega; + } + + if(i == Octaves) { + temp[0] = EPoint * l; + DNoise(value[0], temp[0]); + result += o * value[0]; + } +} + #ifdef TRY_OPTIMIZED_NOISE NoiseFunction Noise; DNoiseFunction DNoise; +NoiseFunction2D Noise2D; +DNoiseFunction2D DNoise2D; +NoiseFunction8D Noise8D; +DTurbulenceFunction DTurbulence; +Initialize_WavesFunction Initialize_Waves; +TurbulenceFunction Turbulence; /***************************************************************************** * @@ -660,18 +809,35 @@ void Initialise_NoiseDispatch() if (pNoiseImpl->init) pNoiseImpl->init(); Noise = pNoiseImpl->noise; DNoise = pNoiseImpl->dNoise; + Noise2D = pNoiseImpl->noise2D; + DNoise2D = pNoiseImpl->dnoise2D; + Noise8D = pNoiseImpl->noise8D; + DTurbulence = pNoiseImpl->DTurbulence; + Initialize_Waves = pNoiseImpl->Initialize_Waves; + Turbulence = pNoiseImpl->Turbulence; + wrinkles = pNoiseImpl -> wrinkles; + GranitePattern::choose_implementation = pNoiseImpl->PatternConstructor; + WrinklesPattern::choose_implementation = pNoiseImpl->PatternConstructor; } } OptimizedNoiseInfo gPortableNoiseInfo = { - "generic", // name, - "portable", // info, - PortableNoise, // noise, - PortableDNoise, // dNoise, - nullptr, // enabled, - nullptr, // supported, - nullptr, // recommended, - nullptr // init + "generic", // name, + "portable", // info, + PortableNoise, // noise, + PortableDNoise, // dNoise, + nullptr, //noise2D + nullptr, //dnoise2D + nullptr, // noise8D + DTurbulenceAVX, // DTurbulence + Initialize_WavesAVX, // Initalize Waves + TurbulenceAVX, // Turbulence + wrinklesAVX, // wrinkles + false, // value to set versions of WrinklesPattern and GranitePattern + nullptr, // enabled, + nullptr, // supported, + nullptr, // recommended, + nullptr // init }; const OptimizedNoiseInfo* GetRecommendedOptimizedNoise() diff --git a/source/core/material/noise.h b/source/core/material/noise.h index 984559332..d005a3315 100644 --- a/source/core/material/noise.h +++ b/source/core/material/noise.h @@ -40,6 +40,8 @@ #include "core/configcore.h" #include "core/material/warp.h" +#include "core/material/normal.h" +#include "core/material/pattern.h" #include "core/math/vector.h" namespace pov @@ -97,7 +99,6 @@ extern ALIGN16 DBL RTable[]; ******************************************************************************/ void Initialize_Noise (void); -void Initialize_Waves(vector& waveFrequencies, vector& waveSources, unsigned int numberOfWaves); void Free_Noise_Tables (void); DBL SolidNoise(const Vector3d& P); @@ -107,9 +108,15 @@ void PortableDNoise(Vector3d& result, const Vector3d& EPoint); #ifdef TRY_OPTIMIZED_NOISE +// Function pointers that will be assigned and that will eventually decide the flow of the function typedef DBL(*NoiseFunction) (const Vector3d& EPoint, int noise_generator); typedef void(*DNoiseFunction) (Vector3d& result, const Vector3d& EPoint); - +typedef void(*NoiseFunction2D) (const Vector3d& EPoint, int noise_generator, double& value); +typedef void(*DNoiseFunction2D) (Vector3d& result, const Vector3d& EPoint); +typedef DBL(*NoiseFunction8D) (const Vector3d& EPoint, int noise_generator); +typedef void (*DTurbulenceFunction) (Vector3d& result, const Vector3d& EPoint, const GenericTurbulenceWarp *Turb); +typedef void (*Initialize_WavesFunction) (vector& waveFrequencies, vector& waveSources, unsigned int numberOfWaves); +typedef DBL (*TurbulenceFunction) (const Vector3d& EPoint, const GenericTurbulenceWarp *Turb, int noise_generator); /// Optimized noise dispatch information. struct OptimizedNoiseInfo { @@ -138,6 +145,30 @@ struct OptimizedNoiseInfo /// Pointer to the optimized implementation of @ref PortableDNoise(). DNoiseFunction dNoise; + // Pointer to the optimized implementation of @ref PortableNoise() for two inputs + NoiseFunction2D noise2D; + + // Pointer to the optimized implementation of @ref PortableDNoise() for two inputs + DNoiseFunction2D dnoise2D; + + // Pointer to the optimized implementation of @ref PortableNoise() for eight multiples of a single input + NoiseFunction8D noise8D; + + // Pointer to the implemetation of DTurbulence based on architecture + DTurbulenceFunction DTurbulence; + + // Pointer to the implemetation of Initialize Waves based on architecture + Initialize_WavesFunction Initialize_Waves; + + // Pointer to the implemetation of Turbulence based on architecture + TurbulenceFunction Turbulence; + + // Pointer to the implemetation of wrinkles based on architecture + wrinklesFunction wrinkles; + + // boolean value used to set the implementation of WrinklesPattern and GranitePattern classes + bool PatternConstructor; + /// Pointer to a constant indicating whether the implementation is enabled in the binary. const bool* enabled; @@ -175,8 +206,15 @@ const OptimizedNoiseInfo* GetRecommendedOptimizedNoise(); /// Get a specific noise generator implementation. const OptimizedNoiseInfo* GetOptimizedNoise(std::string name); +// Function pointers that will decide the flow of functions extern NoiseFunction Noise; extern DNoiseFunction DNoise; +extern NoiseFunction2D Noise2D; +extern DNoiseFunction2D DNoise2D; +extern NoiseFunction8D Noise8D; +extern DTurbulenceFunction DTurbulence; +extern Initialize_WavesFunction Initialize_Waves; +extern TurbulenceFunction Turbulence; void Initialise_NoiseDispatch(); @@ -184,11 +222,20 @@ void Initialise_NoiseDispatch(); inline DBL Noise(const Vector3d& EPoint, int noise_generator) { return PortableNoise(EPoint, noise_generator); } inline void DNoise(Vector3d& result, const Vector3d& EPoint) { PortableDNoise(result, EPoint); } - +inline void Noise2D(const Vector3d& EPoint, int noise_generator, double &value) { }//PortableNoise2D(EPoint, noise_generator, value); } +inline void DNoise2D(Vector3d& result, const Vector3d& EPoint) { }//PortableDNoise2D(result, EPoint); } +inline DBL Noise8D(Vector3d& result, const Vector3d& EPoint) { return 0.0;} +void DTurbulence (Vector3d& result, const Vector3d& EPoint, const GenericTurbulenceWarp* Turb) {} +void Initialize_Waves(vector& waveFrequencies, vector& waveSources, unsigned int numberOfWaves) {} +DBL Turbulence (const Vector3d& EPoint, const GenericTurbulenceWarp* Turb, int noise_generator) {return 0.0;} #endif // TRY_OPTIMIZED_NOISE -DBL Turbulence (const Vector3d& EPoint, const GenericTurbulenceWarp* Turb, int noise_generator); -void DTurbulence (Vector3d& result, const Vector3d& EPoint, const GenericTurbulenceWarp* Turb); +void Initialize_WavesAVX512(vector& waveFrequencies, vector& waveSources, unsigned int numberOfWaves); +void Initialize_WavesAVX(vector& waveFrequencies, vector& waveSources, unsigned int numberOfWaves); +void DTurbulenceAVX512(Vector3d& result, const Vector3d& EPoint, const GenericTurbulenceWarp *Turb); +void DTurbulenceAVX(Vector3d& result, const Vector3d& EPoint, const GenericTurbulenceWarp *Turb); +DBL TurbulenceAVX512 (const Vector3d& EPoint, const GenericTurbulenceWarp* Turb, int noise_generator); +DBL TurbulenceAVX (const Vector3d& EPoint, const GenericTurbulenceWarp* Turb, int noise_generator); /// @} /// diff --git a/source/core/material/normal.cpp b/source/core/material/normal.cpp index a43afe35c..0948d9840 100644 --- a/source/core/material/normal.cpp +++ b/source/core/material/normal.cpp @@ -90,7 +90,6 @@ static void ripples (const Vector3d& EPoint, const TNORMAL *Tnormal, Vector3d& V static void waves (const Vector3d& EPoint, const TNORMAL *Tnormal, Vector3d& Vector, const TraceThreadData *Thread); static void bumps (const Vector3d& EPoint, const TNORMAL *Tnormal, Vector3d& normal); static void dents (const Vector3d& EPoint, const TNORMAL *Tnormal, Vector3d& normal, const TraceThreadData *Thread); -static void wrinkles (const Vector3d& EPoint, const TNORMAL *Tnormal, Vector3d& normal); static void quilted (const Vector3d& EPoint, const TNORMAL *Tnormal, Vector3d& normal); static DBL Hermite_Cubic (DBL T1, const Vector2d& UV1, const Vector2d& UV2); static DBL Do_Slope_Map (DBL value, const SlopeBlendMap *Blend_Map); @@ -313,8 +312,13 @@ static void dents (const Vector3d& EPoint, const TNORMAL *Tnormal, Vector3d& nor * CHANGES * ******************************************************************************/ +// Defined function pointer to assign it accordingly to wither wrinklesAVX or wrinklesAVX512 +#ifdef TRY_OPTIMIZED_NOISE +wrinklesFunction wrinkles; +#endif -static void wrinkles (const Vector3d& EPoint, const TNORMAL *Tnormal, Vector3d& normal) +// Original implementation of wrinkles +void wrinklesAVX (const Vector3d& EPoint, const TNORMAL *Tnormal, Vector3d& normal) { int i; DBL scale = 1.0; @@ -337,6 +341,34 @@ static void wrinkles (const Vector3d& EPoint, const TNORMAL *Tnormal, Vector3d& normal += (DBL)Tnormal->Amount * result; } +// Updated implementation of wrinkles where we process two inputs simultaneously in DNoise +void wrinklesAVX512 (const Vector3d& EPoint, const TNORMAL *Tnormal, Vector3d& normal) +{ + int i; + DBL scale = 1.0; + + Vector3d result, value[2], value2[2]; + result = Vector3d(0.0, 0.0, 0.0); + + for (i = 0; i < 10; scale *= 4.0, i += 2) + { + value2[0] = EPoint * scale; + value2[1] = EPoint * scale * 2.0; + DNoise2D(*value, *value2); + + result[X] += fabs(value[0][X] / scale); + result[Y] += fabs(value[0][Y] / scale); + result[Z] += fabs(value[0][Z] / scale); + result[X] += fabs(value[1][X] / (scale * 2.0)); + result[Y] += fabs(value[1][Y] / (scale * 2.0)); + result[Z] += fabs(value[1][Z] / (scale * 2.0)); + } + + /* Displace "normal". */ + + normal += (DBL)Tnormal->Amount * result; +} + /***************************************************************************** * diff --git a/source/core/material/normal.h b/source/core/material/normal.h index 016a9aa8b..bbd0f6c4f 100644 --- a/source/core/material/normal.h +++ b/source/core/material/normal.h @@ -121,7 +121,15 @@ TNORMAL *Copy_Tnormal (TNORMAL *Old); void Destroy_Tnormal (TNORMAL *Tnormal); void Post_Tnormal (TNORMAL *Tnormal); void Perturb_Normal (Vector3d& Layer_Normal, const TNORMAL *Tnormal, const Vector3d& IPoint, Intersection *Intersection, const Ray *ray, TraceThreadData *Thread); - +#ifdef TRY_OPTIMIZED_NOISE +typedef void (*wrinklesFunction) (const Vector3d& EPoint, const TNORMAL *Tnormal, Vector3d& normal); +extern wrinklesFunction wrinkles; +#else +void wrinkles (const Vector3d& EPoint, const TNORMAL *Tnormal, Vector3d& normal); +#endif + +void wrinklesAVX512 (const Vector3d& EPoint, const TNORMAL *Tnormal, Vector3d& normal); +void wrinklesAVX (const Vector3d& EPoint, const TNORMAL *Tnormal, Vector3d& normal); /// @} /// //############################################################################## diff --git a/source/core/material/pattern.cpp b/source/core/material/pattern.cpp index b2b518b4c..ec3e40b53 100644 --- a/source/core/material/pattern.cpp +++ b/source/core/material/pattern.cpp @@ -70,6 +70,9 @@ namespace pov ******************************************************************************/ #define CLIP_DENSITY(r) { if((r) < 0.0) { (r) = 1.0; } else if((r) > 1.0) { (r) = 0.0; } else { (r) = 1.0 - (r); } } +// Tenth power of 2 and 0.5 used in the implementation of WrinklesPattern::EvaluateRaw +#define lambda_10 512 +#define omega_10 0.001953125 /***************************************************************************** * Local variables @@ -6424,12 +6427,14 @@ DBL GradientPattern::EvaluateRaw(const Vector3d& EPoint, const Intersection *pIs * ******************************************************************************/ -DBL GranitePattern::EvaluateRaw(const Vector3d& EPoint, const Intersection *pIsection, const Ray *pRay, TraceThreadData *pThread) const +// Original implementation of GranitePattern::EvaluateRaw +DBL GranitePatternAVX::EvaluateRaw(const Vector3d& EPoint, const Intersection *pIsection, const Ray *pRay, TraceThreadData *pThread) const { int noise_generator = GetNoiseGen(pThread); int i; DBL temp, noise = 0.0, freq = 1.0; + Vector3d tv1, tv2; tv1 = EPoint * 4.0; @@ -6438,8 +6443,6 @@ DBL GranitePattern::EvaluateRaw(const Vector3d& EPoint, const Intersection *pIse { tv2 = tv1 * freq; - // TODO - This distinction (with minor variations that seem to be more of an inconsistency rather than intentional) - // appears in other places as well; make it a function. switch (noise_generator) { case kNoiseGen_Default: @@ -6457,10 +6460,85 @@ DBL GranitePattern::EvaluateRaw(const Vector3d& EPoint, const Intersection *pIse noise += temp / freq; } + return(noise); +} + +//Implementation of GranitePattern::EvaluateRaw for AVX512 version +DBL GranitePatternAVX512::EvaluateRaw(const Vector3d& EPoint, const Intersection *pIsection, const Ray *pRay, TraceThreadData *pThread) const +{ + int noise_generator = GetNoiseGen(pThread); + + int i; + DBL noise = 0.0, freq = 1.0; + Vector3d tv1, tv2[2]; + DBL temp[2]; + tv1 = EPoint * 4.0; + for (i = 0; i < 6; freq *= 4.0, i+=2) + { + tv2[0] = tv1 * freq; + tv2[1] = tv2[0] * 2.0; + // TODO - This distinction (with minor variations that seem to be more of an inconsistency rather than intentional) + // appears in other places as well; make it a function. + switch (noise_generator) + { + case kNoiseGen_Default: + case kNoiseGen_Original: + Noise2D (*tv2, noise_generator, *temp); + temp[0] = 0.5 - temp[0]; + temp[1] = 0.5 - temp[1]; + temp[0] = fabs(temp[0]); + temp[1] = fabs(temp[1]); + break; + + default: + Noise2D (*tv2, noise_generator, *temp); + temp[0] = 1.0 - 2.0 * temp[0]; // TODO similar code clips the result + temp[1] = 1.0 - 2.0 * temp[1]; + temp[0] = fabs(temp[0]); + temp[1] = fabs(temp[1]); + if (temp[0]>0.5) temp[0]=0.5; + if (temp[1]>0.5) temp[1]=0.5; + break; + } + noise += temp[0] / freq; + noise += temp[1] / (freq * 2.0); + } return(noise); } +// Base struct where the variable is used to set the type of implementation based on architecture +bool GranitePattern::choose_implementation = false; + +// Constructor that sets the implementation +GranitePattern::GranitePattern() { + if(choose_implementation) { + type = new GranitePatternAVX512(); + } else { + type = new GranitePatternAVX(); + } +} + +// Returns the implementation struct +ContinuousPattern* GranitePattern::CreateObject() { + return type; +} + +// Returns clone of the derived struct implementation +PatternPtr GranitePattern::Clone() { + return type->Clone(); +} + +// The base struct function implements the required derived struct function +DBL GranitePattern::EvaluateRaw(const Vector3d& EPoint, const Intersection *pIsection, const Ray *pRay, TraceThreadData *pThread) { + return type->EvaluateRaw(EPoint, pIsection, pRay, pThread); +} + +// Destructor of the base struct +GranitePattern::~GranitePattern() { + delete type; +} + /***************************************************************************** * @@ -8715,7 +8793,8 @@ bool WoodPattern::HasSpecialTurbulenceHandling() const * ******************************************************************************/ -DBL WrinklesPattern::EvaluateRaw(const Vector3d& EPoint, const Intersection *pIsection, const Ray *pRay, TraceThreadData *pThread) const +//Original implementation of WrinklesPattern::EvaluateRaw +DBL WrinklesPatternAVX::EvaluateRaw(const Vector3d& EPoint, const Intersection *pIsection, const Ray *pRay, TraceThreadData *pThread) const { int noise_generator = GetNoiseGen(pThread); @@ -8764,10 +8843,87 @@ DBL WrinklesPattern::EvaluateRaw(const Vector3d& EPoint, const Intersection *pIs omega *= 0.5; } + return(value/2.0); +} +// Implementation of WrinklesPattern::EvaluateRaw for AVX512 architecture +DBL WrinklesPatternAVX512::EvaluateRaw(const Vector3d& EPoint, const Intersection *pIsection, const Ray *pRay, TraceThreadData *pThread) const +{ + int noise_generator = GetNoiseGen(pThread); + + int i; + DBL lambda = 2.0; + DBL omega = 0.5; + DBL value; + Vector3d temp; + DBL noise; + + // TODO - This distinction (with minor variations that seem to be more of an inconsistency rather than intentional) + // appears in other places as well; make it a function. + switch (noise_generator) + { + case kNoiseGen_Default: + case kNoiseGen_Original: + value = Noise(EPoint, noise_generator); + break; + + default: + noise = Noise(EPoint, noise_generator)*2.0-0.5; + value = min(max(noise,0.0),1.0); + break; + } + + //Processes 8 multiples of the input EPoint in a single function and reduces the value with omega and lambda + value += Noise8D(EPoint, noise_generator); + + temp = EPoint * lambda_10; + switch (noise_generator) + { + case kNoiseGen_Default: + case kNoiseGen_Original: + value += omega_10 * Noise(temp, noise_generator); + break; + + default: + noise = Noise(temp, noise_generator)*2.0-0.5; + value += omega_10 * min(max(noise,0.0),1.0); + break; + } return(value/2.0); } +// Base struct where the variable is used to set the type of implementation based on architecture +bool WrinklesPattern::choose_implementation = false; + +// Constructor that sets the implementation +WrinklesPattern::WrinklesPattern() { + if(choose_implementation) { + type = new WrinklesPatternAVX512(); + } else { + type = new WrinklesPatternAVX(); + } +} + +// Returns the implementation struct +ContinuousPattern* WrinklesPattern::CreateObject() { + return type; +} + +// Returns clone of the derived struct implementation +PatternPtr WrinklesPattern::Clone() { + return type->Clone(); +} + +// The base struct function implements the required derived struct function +DBL WrinklesPattern::EvaluateRaw(const Vector3d& EPoint, const Intersection *pIsection, const Ray *pRay, TraceThreadData *pThread) { + return type->EvaluateRaw(EPoint, pIsection, pRay, pThread); +} + +// Destructor of the base struct +WrinklesPattern::~WrinklesPattern() { + delete type; +} + /***************************************************************************** * diff --git a/source/core/material/pattern.h b/source/core/material/pattern.h index b4286f9b7..c39d8746f 100644 --- a/source/core/material/pattern.h +++ b/source/core/material/pattern.h @@ -545,13 +545,39 @@ struct GradientPattern : public ContinuousPattern virtual DBL EvaluateRaw(const Vector3d& EPoint, const Intersection *pIsection, const Ray *pRay, TraceThreadData *pThread) const; }; -/// Implements the `granite` pattern. -struct GranitePattern : public ContinuousPattern +/// Implements the `granite` pattern. - original implementation +struct GranitePatternAVX : public ContinuousPattern { virtual PatternPtr Clone() const { return BasicPattern::Clone(*this); } virtual DBL EvaluateRaw(const Vector3d& EPoint, const Intersection *pIsection, const Ray *pRay, TraceThreadData *pThread) const; }; +/// Implements the `granite` pattern. - AVX512 implementation +struct GranitePatternAVX512 : public ContinuousPattern +{ + virtual PatternPtr Clone() const { return BasicPattern::Clone(*this); } + virtual DBL EvaluateRaw(const Vector3d& EPoint, const Intersection *pIsection, const Ray *pRay, TraceThreadData *pThread) const; +}; + +/// GranitePattern struct that takes up either of GranitePatternAVX or GranitePatternAVX512 implementation +struct GranitePattern +{ + // Type stores the AVX512 or AVX2 implementation object + ContinuousPattern* type; + // Shared boolean value to set the implementation + static bool choose_implementation; + // Constructor to set the type + GranitePattern(); + // Returns the implementation + ContinuousPattern* CreateObject(); + // Returns the clone of the implementation + PatternPtr Clone(); + // Performs the EvaluateRaw function of thee implementation + DBL EvaluateRaw(const Vector3d& EPoint, const Intersection *pIsection, const Ray *pRay, TraceThreadData *pThread); + // Destructor + ~GranitePattern(); +}; + /// Implements the `hexagon` pattern. struct HexagonPattern : public DiscretePattern { @@ -789,13 +815,38 @@ struct WoodPattern : public ContinuousPattern bool hasTurbulence : 1; }; -/// Implements the `wrinkles` pattern. -struct WrinklesPattern : public ContinuousPattern +/// Implements the `wrinkles` pattern - implemenattion for AVX512 architecture +struct WrinklesPatternAVX512 : public ContinuousPattern { virtual PatternPtr Clone() const { return BasicPattern::Clone(*this); } virtual DBL EvaluateRaw(const Vector3d& EPoint, const Intersection *pIsection, const Ray *pRay, TraceThreadData *pThread) const; }; +/// Implements the `gradient` pattern - original implementation +struct WrinklesPatternAVX : public ContinuousPattern +{ + virtual PatternPtr Clone() const { return BasicPattern::Clone(*this); } + virtual DBL EvaluateRaw(const Vector3d& EPoint, const Intersection *pIsection, const Ray *pRay, TraceThreadData *pThread) const; +}; + +struct WrinklesPattern +{ + // The type fof implementation - AVX512 or original + ContinuousPattern* type; + // Shared boolean variable to choose the type of implementation + static bool choose_implementation; + // Constructor to set the type + WrinklesPattern(); + // Returns the object of the implementation type + ContinuousPattern* CreateObject(); + // Returns the clone of the implementation type + PatternPtr Clone(); + // Implements the Evaluate Raw function based on the architecture + DBL EvaluateRaw(const Vector3d& EPoint, const Intersection *pIsection, const Ray *pRay, TraceThreadData *pThread); + // Destructor + ~WrinklesPattern(); +}; + //****************************************************************************** // Fractal Patterns @@ -1187,7 +1238,7 @@ int GetNoiseGen (const TPATTERN *TPat, const TraceThreadData *Thread); DENSITY_FILE *Create_Density_File (); DENSITY_FILE *Copy_Density_File (DENSITY_FILE *); void Destroy_Density_File (DENSITY_FILE *); -void Read_Density_File (IStream *dfile, DENSITY_FILE *df); +void Read_Density_File (pov_base::IStream *dfile, DENSITY_FILE *df); int PickInCube (const Vector3d& tv, Vector3d& p1); void InitializePatternGenerators(void); diff --git a/source/parser/parser_materials.cpp b/source/parser/parser_materials.cpp index 0619b7819..5cdc14f7c 100644 --- a/source/parser/parser_materials.cpp +++ b/source/parser/parser_materials.cpp @@ -1397,7 +1397,7 @@ void Parser::Parse_Pattern (PATTERN_T *New, BlendMapTypeId TPat_Type) CASE (GRANITE_TOKEN) New->Type = GENERIC_PATTERN; - New->pattern = PatternPtr(new GranitePattern()); + New->pattern = PatternPtr((new GranitePattern())->CreateObject()); END_CASE CASE (LEOPARD_TOKEN) @@ -1591,7 +1591,7 @@ void Parser::Parse_Pattern (PATTERN_T *New, BlendMapTypeId TPat_Type) CASE (WRINKLES_TOKEN) New->Type = WRINKLES_PATTERN; - New->pattern = PatternPtr(new WrinklesPattern()); + New->pattern = PatternPtr((new WrinklesPattern())->CreateObject()); END_CASE CASE (BUMPS_TOKEN) @@ -3120,7 +3120,7 @@ NOTE: Do not add new keywords to this section. Use 1.0 syntax only. CASE (GRANITE_TOKEN) Warn_State(Token.Token_Id, PIGMENT_TOKEN); Pigment->Type = GENERIC_PATTERN; - Pigment->pattern = PatternPtr(new GranitePattern()); + Pigment->pattern = PatternPtr((new GranitePattern())->CreateObject()); END_CASE CASE (LEOPARD_TOKEN) @@ -3290,7 +3290,7 @@ NOTE: Do not add new keywords to this section. Use 1.0 syntax only. Warn_State(Token.Token_Id, NORMAL_TOKEN); ADD_TNORMAL Tnormal->Type = WRINKLES_PATTERN; - Tnormal->pattern = PatternPtr(new WrinklesPattern()); + Tnormal->pattern = PatternPtr((new WrinklesPattern())->CreateObject()); Tnormal->Amount = Parse_Float (); END_CASE @@ -4891,7 +4891,7 @@ void Parser::Parse_PatternFunction(TPATTERN *New) CASE (GRANITE_TOKEN) New->Type = GENERIC_PATTERN; - New->pattern = PatternPtr(new GranitePattern()); + New->pattern = PatternPtr((new GranitePattern())->CreateObject()); END_CASE CASE (LEOPARD_TOKEN) @@ -5039,7 +5039,7 @@ void Parser::Parse_PatternFunction(TPATTERN *New) CASE (WRINKLES_TOKEN) New->Type = WRINKLES_PATTERN; - New->pattern = PatternPtr(new WrinklesPattern()); + New->pattern = PatternPtr((new WrinklesPattern())->CreateObject()); END_CASE CASE (BUMPS_TOKEN) diff --git a/unix/configure.ac b/unix/configure.ac index 8687eefe2..8192cc8d1 100644 --- a/unix/configure.ac +++ b/unix/configure.ac @@ -969,6 +969,7 @@ case "$pov_built_for" in AX_CHECK_COMPILE_FLAG([-mavx2], [pov_avx2='-mavx2'], [pov_avx2='']) AX_CHECK_COMPILE_FLAG([-mfma], [pov_fma3='-mfma'], [pov_fma3='']) AX_CHECK_COMPILE_FLAG([-mfma4], [pov_fma4='-mfma4'], [pov_fma4='']) + AX_CHECK_COMPILE_FLAG([-mavx512f], [pov_avx512='-mavx512f'], [pov_avx512='']) ;; *) pov_cpu='' @@ -978,6 +979,7 @@ AM_CONDITIONAL([BUILD_x86], [test x"$pov_cpu" = x"x86"]) AM_CONDITIONAL([BUILD_x86avx], [test x"$pov_avx" != x""]) AM_CONDITIONAL([BUILD_x86avxfma4], [test x"$pov_avx" != x"" -a x"$pov_fma4" != x"" ]) AM_CONDITIONAL([BUILD_x86avx2fma3], [test x"$pov_avx2" != x"" -a x"$pov_fma3" != x"" ]) +AM_CONDITIONAL([BUILD_x86avx512], [test x"$pov_avx512" != x""]) # Add flags specified at the command line. diff --git a/unix/povconfig/syspovconfig.h b/unix/povconfig/syspovconfig.h index 079453b21..2b294298b 100644 --- a/unix/povconfig/syspovconfig.h +++ b/unix/povconfig/syspovconfig.h @@ -146,6 +146,9 @@ const int NULL=0; #define HAVE_ASM_AVX2 #define HAVE_ASM_FMA3 #endif + #if (__INTEL_COMPILER >= 1500) // 15.0 + #define HAVE_ASM_AVX512 + #endif #elif defined(__GNUC__) // GCC compiler (or yet another compiler imitating GCC) #if (__GNUC__ == 4) // 4.x @@ -159,6 +162,12 @@ const int NULL=0; #define HAVE_ASM_AVX2 #define HAVE_ASM_FMA3 #endif + #elif (__GNUC__ >= 6) // 6.x or later + #define HAVE_ASM_AVX + #define HAVE_ASM_AVX2 + #define HAVE_ASM_FMA3 + #define HAVE_ASM_FMA4 + #define HAVE_ASM_AVX512 #elif (__GNUC__ >= 5) // 5.x or later #define HAVE_ASM_AVX #define HAVE_ASM_AVX2 @@ -185,6 +194,9 @@ const int NULL=0; #if !defined (__FMA4__) #define DISABLE_FMA4 #endif + #if !defined (__AVX512F__) + #define DISABLE_AVX512 + #endif #endif // Decide which optimized code to enable. @@ -218,6 +230,15 @@ const int NULL=0; #define DISABLE_OPTIMIZED_NOISE_AVX2FMA3 #endif +#if defined(HAVE_ASM_AVX512) + #define TRY_OPTIMIZED_NOISE // optimized noise master switch. + #define TRY_OPTIMIZED_NOISE_AVX512 // AVX2/FMA3 hand-optimized noise (Intel). +#endif + +#if defined(DISABLE_AVX512) + #define DISABLE_OPTIMIZED_NOISE_AVX512 +#endif + #endif // BUILD_X86 diff --git a/unix/prebuild.sh b/unix/prebuild.sh index 34b5a30f7..3db037874 100755 --- a/unix/prebuild.sh +++ b/unix/prebuild.sh @@ -449,6 +449,9 @@ endif if BUILD_x86avx2fma3 ldadd_platformcpu += \$(top_builddir)/platform/libx86avx2fma3.a endif +if BUILD_x86avx512 +ldadd_platformcpu += \$(top_builddir)/platform/libx86avx512.a +endif # Include paths for headers. AM_CPPFLAGS = \\ @@ -1403,7 +1406,7 @@ case "$1" in *) files=`find $dir/unix -name "*.cpp" -or -name "*.h" | sed s,"$dir/",,g | sort` files_x86=`find $dir/x86 -maxdepth 1 -name "*.cpp" -or -name "*.h" | sed s,"$dir/",,g | sort` - for ext in avx avxfma4 avx2fma3; do + for ext in avx avxfma4 avx2fma3 avx512; do files_ext=`find $dir/x86/$ext -name "*.cpp" -or -name "*.h" | sed s,"$dir/",,g | sort` eval files_x86$ext='$files_ext' done @@ -1439,6 +1442,11 @@ libraries_platformcpu += libx86avx2fma3.a libx86avx2fma3_a_SOURCES = `echo $files_x86avx2fma3` libx86avx2fma3_a_CXXFLAGS = \$(CXXFLAGS) -mavx2 -mfma endif +if BUILD_x86avx512 +libraries_platformcpu += libx86avx512.a +libx86avx512_a_SOURCES = `echo $files_x86avx512` +libx86avx512_a_CXXFLAGS = \$(CXXFLAGS) -mavx512f +endif # Libraries to build. noinst_LIBRARIES = \\ diff --git a/windows/README.md b/windows/README.md index f74bfb310..1d34449bd 100644 --- a/windows/README.md +++ b/windows/README.md @@ -46,20 +46,20 @@ These groups provide the best means for support with relation to this subject. Compilers ========= -Visual Studio 2015 +Visual Studio 2022 ------------------ Currently the only officially supported means of building the Windows -version of POV-Ray is via the provided Visual Studio 2015 solution. +version of POV-Ray is via the provided Visual Studio 2022 solution. -You will need Visual Studio 2015 (Community Edition will suffice) or later. +You will need Visual Studio 2022 (Community Edition will suffice) or later. Earlier Versions of Visual Studio --------------------------------- -Due to the free availability of Visual Studio 2015 Community Edition -and better performance of the generated binaries, we have ceased support -for earlier versions of Visual Studio. +Due to the free availability of Visual Studio 2022 Community Edition +(which also gives AVX512 support) and better performance of the generated binaries +, we have ported the code to VS2022 @@ -95,7 +95,7 @@ Build Steps support files are present. If you don't do this, your compiled code will probably not work on your machine. -2. Open `windows\vs2015\povray.sln` in Visual Studio. Set +2. Open `windows\vs2022\povray.sln` in Visual Studio. Set 'Windows Targets > GUI' as the start-up project if it is not already selected. Then, select the 'Generic POV-Ray > povbase' project and expand 'Backend Headers', then open the file `build.h` listed @@ -131,8 +131,8 @@ Build Steps If all goes well, you should end up with the POV-Ray for Windows executable. All 32-bit binaries should end up in - `windows\vs2015\bin32`, and the 64-bit ones should be in - `windows\vs2015\bin64`. + `windows\vs2022\bin32`, and the 64-bit ones should be in + `windows\vs2022\bin64`. Note: if you are building a DEBUG version of POV-Ray, be aware that the executable will attempt to load the debug version of POV-Ray's @@ -150,9 +150,9 @@ Build Steps (if they are present), as they are not actively maintained, and may generate flawed binaries or fail to compile at all: -- `Release-AVX|Win32` (This target would be useless, as to the best of - our knowledge there are no 32-bit processors or operating systems with - AVX support.) +- `Release-AVX|Win32` and `Release-AVX512|Win32` (These targets would be useless, + as to the best of our knowledge there are no 32-bit processors or operating + systems with AVX/AVX2/AVX512 support.) - `Release-SSE2|x64` (This target would be redundant, as SSE2 is a standard feature of the x64 architecture and is therefore implicitly enabled in all `x64` builds, including vanilla `Release|x64`.) @@ -169,6 +169,10 @@ in mind' at the end. Building for Legacy Windows Versions ------------------------------------ +**Attention:** By default, binaries generated with Visual Studio 2022 will only +run on Windows 10 or later. (Present version with VS2022 not tested with earlier +windows versions. Retained the Old README in this part). + By default, binaries generated with Visual Studio 2015 will only run on Windows Vista or later. Visual Studio 2015 can be used to generate binaries compatible with Windows versions as early as Windows XP (SP3 required), diff --git a/windows/cmedit/StdString.h b/windows/cmedit/StdString.h index aa16cfedd..77311881e 100644 --- a/windows/cmedit/StdString.h +++ b/windows/cmedit/StdString.h @@ -714,7 +714,7 @@ inline const Type& SSMAX(const Type& arg1, const Type& arg2) #endif #define SS_USE_FACET(loc, fac) std::use_facet(loc) #elif defined(_MSC_VER ) - #define SS_USE_FACET(loc, fac) std::_USE(loc, fac) + #define SS_USE_FACET(loc, fac) std::use_facet(loc) // ...and #elif defined(_RWSTD_NO_TEMPLATE_ON_RETURN_TYPE) diff --git a/windows/povconfig/syspovconfig.h b/windows/povconfig/syspovconfig.h index 9c8e04971..d310ba98d 100644 --- a/windows/povconfig/syspovconfig.h +++ b/windows/povconfig/syspovconfig.h @@ -136,8 +136,9 @@ using boost::intrusive_ptr; #ifndef POV_COMPILER_VER #define POV_COMPILER_VER "u" #endif - -#if defined(BUILD_AVX2) +#if defined(BUILD_AVX512) + #define POV_BUILD_INFO POV_COMPILER_VER ".avx512." POVRAY_PLATFORM_NAME +#elif defined(BUILD_AVX2) #define POV_BUILD_INFO POV_COMPILER_VER ".avx2." POVRAY_PLATFORM_NAME #elif defined(BUILD_AVX) #define POV_BUILD_INFO POV_COMPILER_VER ".avx." POVRAY_PLATFORM_NAME diff --git a/windows/povconfig/syspovconfig_msvc.h b/windows/povconfig/syspovconfig_msvc.h index 27c60f7c7..8ce285f95 100644 --- a/windows/povconfig/syspovconfig_msvc.h +++ b/windows/povconfig/syspovconfig_msvc.h @@ -146,10 +146,10 @@ // The following settings are just guesswork, and have never been tested: #define POV_CPP11_SUPPORTED 0 // NB: The Microsoft Visual Studio developers seem to have skipped internal version number 13 entirely. - #elif _MSC_VER >= 1900 && _MSC_VER < 2000 - // MS Visual C++ 2015 (aka 14.0) - #define POV_COMPILER_VER "msvc14" - #define METADATA_COMPILER_STRING "msvc 14" + #elif _MSC_VER >= 1930 && _MSC_VER < 2000 + // MS Visual C++ 2022 (aka 14.3) + #define POV_COMPILER_VER "msvc14.3" + #define METADATA_COMPILER_STRING "msvc 14.3" #define POV_CPP11_SUPPORTED 1 #else #error "Please update syspovconfig_msvc.h to include this version of MSVC" @@ -229,9 +229,10 @@ #endif #if _MSC_VER >= 1900 - // compiler supports AVX2. + // compiler supports AVX2 and AVX512. #define TRY_OPTIMIZED_NOISE // optimized noise master switch. #define TRY_OPTIMIZED_NOISE_AVX2FMA3 // AVX2/FMA3 hand-optimized noise (Intel). + #define TRY_OPTIMIZED_NOISE_AVX512 // AVX512 hand-optimized noise #endif #define POV_CPUINFO CPUInfo::GetFeatures() diff --git a/windows/vs2015/StepOver.reg b/windows/vs2022/StepOver.reg similarity index 100% rename from windows/vs2015/StepOver.reg rename to windows/vs2022/StepOver.reg diff --git a/windows/vs2015/autoexp.dat b/windows/vs2022/autoexp.dat similarity index 100% rename from windows/vs2015/autoexp.dat rename to windows/vs2022/autoexp.dat diff --git a/windows/vs2015/boost_date_time.vcxproj b/windows/vs2022/boost_date_time.vcxproj similarity index 82% rename from windows/vs2015/boost_date_time.vcxproj rename to windows/vs2022/boost_date_time.vcxproj index 67383acd5..73fa35a6b 100644 --- a/windows/vs2015/boost_date_time.vcxproj +++ b/windows/vs2022/boost_date_time.vcxproj @@ -33,6 +33,14 @@ Release-AVX x64 + + Release-AVX512 + Win32 + + + Release-AVX512 + x64 + @@ -42,53 +50,64 @@ {35A2DC31-84BC-4F7A-9C93-1D072432AD79} boost_date_time + 10.0.20348.0 StaticLibrary true Unicode - v140 + v143 StaticLibrary true Unicode - v140 + v143 StaticLibrary false true Unicode - v140 + v143 StaticLibrary false true Unicode - v140 + v143 StaticLibrary false true Unicode - v140 + v143 StaticLibrary false true Unicode - v140 + v143 + + + StaticLibrary + false + true + Unicode + v143 - v140 + v143 + + + v143 - v140 + v143 @@ -112,6 +131,10 @@ + + + + bin32\lib\ @@ -143,6 +166,11 @@ build\$(ProjectName)\$(Platform)\$(Configuration)\ lib$(ProjectName)$(ConfigTag) + + bin64\lib\ + build\$(ProjectName)\$(Platform)\$(Configuration)\ + lib$(ProjectName)$(ConfigTag) + @@ -282,6 +310,30 @@ true + + + Level3 + + + Full + false + true + WIN32;WIN32_LEAN_AND_MEAN;NDEBUG;_WINDOWS;_CRT_SECURE_NO_DEPRECATE;BOOST_DATE_TIME_STATIC_LINK;BOOST_ALL_NO_LIB;%(PreprocessorDefinitions) + ..\..\libraries\boost;%(AdditionalIncludeDirectories) + AnySuitable + Speed + MultiThreaded + false + true + true + + + Windows + true + true + true + + diff --git a/windows/vs2015/boost_date_time.vcxproj.filters b/windows/vs2022/boost_date_time.vcxproj.filters similarity index 100% rename from windows/vs2015/boost_date_time.vcxproj.filters rename to windows/vs2022/boost_date_time.vcxproj.filters diff --git a/windows/vs2015/boost_system.vcxproj b/windows/vs2022/boost_system.vcxproj similarity index 82% rename from windows/vs2015/boost_system.vcxproj rename to windows/vs2022/boost_system.vcxproj index 038e20442..4b789014a 100644 --- a/windows/vs2015/boost_system.vcxproj +++ b/windows/vs2022/boost_system.vcxproj @@ -33,6 +33,14 @@ Release-AVX x64 + + Release-AVX512 + Win32 + + + Release-AVX512 + x64 + @@ -40,53 +48,64 @@ {D870A978-8130-4D1D-9FB2-3EE2028D2C50} boost_system + 10.0.20348.0 StaticLibrary true Unicode - v140 + v143 StaticLibrary true Unicode - v140 + v143 StaticLibrary false true Unicode - v140 + v143 StaticLibrary false true Unicode - v140 + v143 StaticLibrary false true Unicode - v140 + v143 StaticLibrary false true Unicode - v140 + v143 + + + StaticLibrary + false + true + Unicode + v143 - v140 + v143 + + + v143 - v140 + v143 @@ -110,6 +129,10 @@ + + + + bin32\lib\ @@ -141,6 +164,11 @@ build\$(ProjectName)\$(Platform)\$(Configuration)\ lib$(ProjectName)$(ConfigTag) + + bin64\lib\ + build\$(ProjectName)\$(Platform)\$(Configuration)\ + lib$(ProjectName)$(ConfigTag) + @@ -280,6 +308,30 @@ true + + + Level3 + + + Full + false + true + WIN32;WIN32_LEAN_AND_MEAN;NDEBUG;_WINDOWS;_CRT_SECURE_NO_DEPRECATE;BOOST_ALL_NO_LIB;%(PreprocessorDefinitions) + ..\..\libraries\boost;%(AdditionalIncludeDirectories) + AnySuitable + Speed + MultiThreaded + false + true + true + + + Windows + true + true + true + + diff --git a/windows/vs2015/boost_system.vcxproj.filters b/windows/vs2022/boost_system.vcxproj.filters similarity index 100% rename from windows/vs2015/boost_system.vcxproj.filters rename to windows/vs2022/boost_system.vcxproj.filters diff --git a/windows/vs2015/boost_thread.vcxproj b/windows/vs2022/boost_thread.vcxproj similarity index 82% rename from windows/vs2015/boost_thread.vcxproj rename to windows/vs2022/boost_thread.vcxproj index 385737821..d2fe7120a 100644 --- a/windows/vs2015/boost_thread.vcxproj +++ b/windows/vs2022/boost_thread.vcxproj @@ -33,6 +33,14 @@ Release-AVX x64 + + Release-AVX512 + Win32 + + + Release-AVX512 + x64 + @@ -43,53 +51,64 @@ {10B193D4-E27B-4438-A825-BFB3D2B4C74D} boost_thread + 10.0.20348.0 StaticLibrary true Unicode - v140 + v143 StaticLibrary true Unicode - v140 + v143 StaticLibrary false true Unicode - v140 + v143 StaticLibrary false true Unicode - v140 + v143 StaticLibrary false true Unicode - v140 + v143 StaticLibrary false true Unicode - v140 + v143 + + + StaticLibrary + false + true + Unicode + v143 - v140 + v143 + + + v143 - v140 + v143 @@ -113,6 +132,10 @@ + + + + bin32\lib\ @@ -143,6 +166,11 @@ bin64\lib\ build\$(ProjectName)\$(Platform)\$(Configuration)\ lib$(ProjectName)$(ConfigTag) + + + bin64\lib\ + build\$(ProjectName)\$(Platform)\$(Configuration)\ + lib$(ProjectName)$(ConfigTag) @@ -289,6 +317,31 @@ true + + + Level3 + + + Full + false + true + WIN32;WIN32_LEAN_AND_MEAN;NDEBUG;_WINDOWS;_CRT_SECURE_NO_DEPRECATE;BOOST_THREAD_BUILD_LIB=1;BOOST_ALL_NO_LIB;%(PreprocessorDefinitions) + ..\..\libraries\boost;%(AdditionalIncludeDirectories) + AnySuitable + Speed + MultiThreaded + false + true + true + 4005 + + + Windows + true + true + true + + diff --git a/windows/vs2015/boost_thread.vcxproj.filters b/windows/vs2022/boost_thread.vcxproj.filters similarity index 100% rename from windows/vs2015/boost_thread.vcxproj.filters rename to windows/vs2022/boost_thread.vcxproj.filters diff --git a/windows/vs2015/cmedit.vcxproj b/windows/vs2022/cmedit.vcxproj similarity index 98% rename from windows/vs2015/cmedit.vcxproj rename to windows/vs2022/cmedit.vcxproj index 8c2d3edde..f79be43fe 100644 --- a/windows/vs2015/cmedit.vcxproj +++ b/windows/vs2022/cmedit.vcxproj @@ -20,33 +20,34 @@ {37FDEA25-43CD-4AF0-A232-281E11851E75} + 10.0.20348.0 DynamicLibrary false MultiByte - v140 + v143 DynamicLibrary false MultiByte - v140 + v143 DynamicLibrary false MultiByte true - v140 + v143 DynamicLibrary false MultiByte true - v140 + v143 diff --git a/windows/vs2015/cmedit.vcxproj.filters b/windows/vs2022/cmedit.vcxproj.filters similarity index 100% rename from windows/vs2015/cmedit.vcxproj.filters rename to windows/vs2022/cmedit.vcxproj.filters diff --git a/windows/vs2015/console.vcxproj b/windows/vs2022/console.vcxproj similarity index 85% rename from windows/vs2015/console.vcxproj rename to windows/vs2022/console.vcxproj index 40687cf30..7e4c5f7ea 100644 --- a/windows/vs2015/console.vcxproj +++ b/windows/vs2022/console.vcxproj @@ -33,46 +33,63 @@ Release-AVX x64 + + Release-AVX512 + Win32 + + + Release-AVX512 + x64 + {3B6BB403-FC72-45FF-A431-9295A1AEB7A3} console Win32Proj + 10.0.20348.0 Application - v140 + v143 Application - v140 + v143 Application true - v140 + v143 Application true - v140 + v143 Application true - v140 + v143 Application true - v140 + v143 + + + Application + true + v143 - v140 + v143 + + + v143 - v140 + v143 @@ -96,6 +113,10 @@ + + + + bin32\ @@ -127,6 +148,11 @@ build\$(ProjectName)\$(Platform)\$(Configuration)\ povconsole$(ConfigTag) + + bin64\ + build\$(ProjectName)\$(Platform)\$(Configuration)\ + povconsole$(ConfigTag) + <_ProjectFileVersion>10.0.30319.1 @@ -349,6 +375,43 @@ + + + X64 + + + ..\..\internal\windows;..\..\platform\x86;..\..\platform\windows;..\..\windows\povconfig;..\..\libraries\boost;..\..\vfe\win;..\..\vfe;..\;..\..\source;..\..\libraries\jpeg;..\..\libraries\zlib;..\..\libraries\png;..\..\libraries\tiff\libtiff;%(AdditionalIncludeDirectories) + $(PovBuildDefs)BOOST_ALL_NO_LIB;NDEBUG;WIN32;WIN32_LEAN_AND_MEAN;_WINDOWS;CLASSLIB_DEFS_H;NOMINMAX;ISOLATION_AWARE_ENABLED;_CRT_SECURE_NO_DEPRECATE;_SECURE_SCL=0;BUILDING_AMD64=1;COMMONCTRL_VERSION=0x500;_WIN32_WINNT=0x0500;%(PreprocessorDefinitions) + true + Sync + Default + MultiThreaded + false + true + $(IntDir) + Level3 + ProgramDatabase + false + 4800;%(DisableSpecificWarnings) + winprecomp.h;%(ForcedIncludeFiles) + + + true + Console + 67108864 + true + true + true + false + + + MachineX64 + + + + + + diff --git a/windows/vs2015/console.vcxproj.filters b/windows/vs2022/console.vcxproj.filters similarity index 100% rename from windows/vs2015/console.vcxproj.filters rename to windows/vs2022/console.vcxproj.filters diff --git a/windows/vs2015/jpeg.vcxproj b/windows/vs2022/jpeg.vcxproj similarity index 85% rename from windows/vs2015/jpeg.vcxproj rename to windows/vs2022/jpeg.vcxproj index bf6ac46aa..c3e24527e 100644 --- a/windows/vs2015/jpeg.vcxproj +++ b/windows/vs2022/jpeg.vcxproj @@ -33,55 +33,73 @@ Release-AVX x64 + + Release-AVX512 + Win32 + + + Release-AVX512 + x64 + {3780CCDE-4967-4C31-B6A3-3C2570BDD3E4} jpeg + 10.0.20348.0 StaticLibrary false MultiByte - v140 + v143 StaticLibrary false MultiByte - v140 + v143 StaticLibrary false MultiByte true - v140 + v143 StaticLibrary false MultiByte - v140 + v143 StaticLibrary false MultiByte true - v140 + v143 StaticLibrary false MultiByte - v140 + v143 + + + StaticLibrary + false + MultiByte + v143 - v140 + v143 + + + v143 - v140 + v143 @@ -105,6 +123,10 @@ + + + + bin32\lib\ @@ -136,6 +158,11 @@ build\$(ProjectName)\$(Platform)\$(Configuration)\ $(ProjectName)$(ConfigTag) + + bin64\lib\ + build\$(ProjectName)\$(Platform)\$(Configuration)\ + $(ProjectName)$(ConfigTag) + <_ProjectFileVersion>10.0.30319.1 @@ -323,6 +350,37 @@ true + + + X64 + + + MaxSpeed + OnlyExplicitInline + WIN32;WIN32_LEAN_AND_MEAN;NDEBUG;_LIB;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions) + true + Sync + MultiThreaded + false + false + + + + + true + $(IntDir) + Level2 + true + ProgramDatabase + + + NDEBUG;%(PreprocessorDefinitions) + 0x0409 + + + true + + diff --git a/windows/vs2015/jpeg.vcxproj.filters b/windows/vs2022/jpeg.vcxproj.filters similarity index 100% rename from windows/vs2015/jpeg.vcxproj.filters rename to windows/vs2022/jpeg.vcxproj.filters diff --git a/windows/vs2015/libpng.vcxproj b/windows/vs2022/libpng.vcxproj similarity index 83% rename from windows/vs2015/libpng.vcxproj rename to windows/vs2022/libpng.vcxproj index 76eda52c4..76a7aa015 100644 --- a/windows/vs2015/libpng.vcxproj +++ b/windows/vs2022/libpng.vcxproj @@ -33,49 +33,66 @@ Release-AVX x64 + + Release-AVX512 + Win32 + + + Release-AVX512 + x64 + {E1EA88AF-6B44-4225-B97B-B485FC9DB23E} libpng + 10.0.20348.0 StaticLibrary false - v140 + v143 StaticLibrary false - v140 + v143 StaticLibrary false true - v140 + v143 StaticLibrary false - v140 + v143 StaticLibrary false true - v140 + v143 StaticLibrary false - v140 + v143 + + + StaticLibrary + false + v143 - v140 + v143 + + + v143 - v140 + v143 @@ -99,6 +116,10 @@ + + + + bin32\lib\ @@ -130,6 +151,11 @@ build\$(ProjectName)\$(Platform)\$(Configuration)\ $(ProjectName)$(ConfigTag) + + bin64\lib\ + build\$(ProjectName)\$(Platform)\$(Configuration)\ + $(ProjectName)$(ConfigTag) + <_ProjectFileVersion>10.0.30319.1 @@ -309,6 +335,37 @@ copy ..\..\libraries\png\scripts\pnglibconf.h.prebuilt ..\..\libraries\png\pnglibconf.h + + + X64 + + + MaxSpeed + OnlyExplicitInline + .\;..\..\libraries\zlib;..\..\..\source;%(AdditionalIncludeDirectories) + WIN32;WIN32_LEAN_AND_MEAN;NDEBUG;_WINDOWS;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions) + true + Sync + MultiThreaded + false + false + true + $(IntDir) + Level3 + true + ProgramDatabase + Default + + + 0x0409 + + + true + + + copy ..\..\libraries\png\scripts\pnglibconf.h.prebuilt ..\..\libraries\png\pnglibconf.h + + diff --git a/windows/vs2015/openexr_Half.vcxproj b/windows/vs2022/openexr_Half.vcxproj similarity index 83% rename from windows/vs2015/openexr_Half.vcxproj rename to windows/vs2022/openexr_Half.vcxproj index c757c1dd9..c8f68fef0 100644 --- a/windows/vs2015/openexr_Half.vcxproj +++ b/windows/vs2022/openexr_Half.vcxproj @@ -33,53 +33,71 @@ Release-AVX x64 + + Release-AVX512 + Win32 + + + Release-AVX512 + x64 + {9EDB5C0F-BFD0-4A59-BB93-F06A52BB0128} OpenEXR IlmBase Half + 10.0.20348.0 StaticLibrary true MultiByte - v140 + v143 StaticLibrary true MultiByte - v140 + v143 StaticLibrary MultiByte true - v140 + v143 StaticLibrary MultiByte true - v140 + v143 StaticLibrary MultiByte true - v140 + v143 StaticLibrary MultiByte true - v140 + v143 + + + StaticLibrary + MultiByte + true + v143 - v140 + v143 + + + v143 - v140 + v143 @@ -103,6 +121,10 @@ + + + + bin32\lib\ @@ -140,6 +162,12 @@ false Half$(ConfigTag) + + bin64\lib\ + build\$(ProjectName)\$(Platform)\$(Configuration)\ + false + Half$(ConfigTag) + <_ProjectFileVersion>10.0.40219.1 @@ -271,6 +299,28 @@ false + + + ..\..\libraries\ilmbase\Half;..\..\libraries\ilmbase\config.windows;%(AdditionalIncludeDirectories) + WIN32;WIN32_LEAN_AND_MEAN;NDEBUG;_WINDOWS;HALF_EXPORTS;%(PreprocessorDefinitions) + MultiThreaded + true + true + Level3 + ProgramDatabase + Full + AnySuitable + true + Speed + true + + + Windows + true + true + false + + diff --git a/windows/vs2015/openexr_Half.vcxproj.filters b/windows/vs2022/openexr_Half.vcxproj.filters similarity index 100% rename from windows/vs2015/openexr_Half.vcxproj.filters rename to windows/vs2022/openexr_Half.vcxproj.filters diff --git a/windows/vs2015/openexr_Iex.vcxproj b/windows/vs2022/openexr_Iex.vcxproj similarity index 83% rename from windows/vs2015/openexr_Iex.vcxproj rename to windows/vs2022/openexr_Iex.vcxproj index 610c42a19..cdc9ac955 100644 --- a/windows/vs2015/openexr_Iex.vcxproj +++ b/windows/vs2022/openexr_Iex.vcxproj @@ -33,53 +33,71 @@ Release-AVX x64 + + Release-AVX512 + Win32 + + + Release-AVX512 + x64 + {C46B9A53-86D8-4B7F-AB15-B2C04518A195} OpenEXR IlmBase Iex + 10.0.20348.0 StaticLibrary true MultiByte - v140 + v143 StaticLibrary true MultiByte - v140 + v143 StaticLibrary MultiByte true - v140 + v143 StaticLibrary MultiByte true - v140 + v143 StaticLibrary MultiByte true - v140 + v143 StaticLibrary MultiByte true - v140 + v143 + + + StaticLibrary + MultiByte + true + v143 - v140 + v143 + + + v143 - v140 + v143 @@ -103,6 +121,10 @@ + + + + bin32\lib\ @@ -140,6 +162,12 @@ false Iex$(ConfigTag) + + bin64\lib\ + build\$(ProjectName)\$(Platform)\$(Configuration)\ + false + Iex$(ConfigTag) + <_ProjectFileVersion>10.0.40219.1 @@ -271,6 +299,28 @@ false + + + ..\..\libraries\ilmbase\Iex;..\..\libraries\ilmbase\config.windows;%(AdditionalIncludeDirectories) + WIN32;WIN32_LEAN_AND_MEAN;NDEBUG;_WINDOWS;IEX_EXPORTS;%(PreprocessorDefinitions) + MultiThreaded + true + true + Level2 + ProgramDatabase + Full + AnySuitable + true + Speed + true + + + Windows + true + true + false + + diff --git a/windows/vs2015/openexr_Iex.vcxproj.filters b/windows/vs2022/openexr_Iex.vcxproj.filters similarity index 100% rename from windows/vs2015/openexr_Iex.vcxproj.filters rename to windows/vs2022/openexr_Iex.vcxproj.filters diff --git a/windows/vs2015/openexr_IlmImf.vcxproj b/windows/vs2022/openexr_IlmImf.vcxproj similarity index 90% rename from windows/vs2015/openexr_IlmImf.vcxproj rename to windows/vs2022/openexr_IlmImf.vcxproj index 209658b8b..84935fd22 100644 --- a/windows/vs2015/openexr_IlmImf.vcxproj +++ b/windows/vs2022/openexr_IlmImf.vcxproj @@ -33,53 +33,71 @@ Release-AVX x64 + + Release-AVX512 + Win32 + + + Release-AVX512 + x64 + {7DF42126-D237-41D3-9ABE-A3ACC8BAC56E} OpenEXR IlmImf + 10.0.20348.0 StaticLibrary true MultiByte - v140 + v143 StaticLibrary true MultiByte - v140 + v143 StaticLibrary MultiByte true - v140 + v143 StaticLibrary MultiByte true - v140 + v143 StaticLibrary MultiByte true - v140 + v143 StaticLibrary MultiByte true - v140 + v143 + + + StaticLibrary + MultiByte + true + v143 - v140 + v143 + + + v143 - v140 + v143 @@ -103,6 +121,10 @@ + + + + bin32\lib\ @@ -140,6 +162,12 @@ false IlmImf$(ConfigTag) + + bin64\lib\ + build\$(ProjectName)\$(Platform)\$(Configuration)\ + false + IlmImf$(ConfigTag) + <_ProjectFileVersion>10.0.40219.1 @@ -277,6 +305,29 @@ false + + + ..\..\libraries\openexr\IlmImf;..\..\libraries\openexr\config.windows;..\..\libraries\ilmbase\Half;..\..\libraries\ilmbase\Iex;..\..\libraries\ilmbase\IlmThread;..\..\libraries\ilmbase\Imath;..\..\libraries\ilmbase\config.windows;..\..\libraries\zlib;%(AdditionalIncludeDirectories) + WIN32;WIN32_LEAN_AND_MEAN;NDEBUG;_WINDOWS;ILMIMF_EXPORTS;%(PreprocessorDefinitions) + MultiThreaded + true + true + Level2 + ProgramDatabase + Full + AnySuitable + true + Speed + true + 4244;4305 + + + Windows + true + true + false + + diff --git a/windows/vs2015/openexr_IlmImf.vcxproj.filters b/windows/vs2022/openexr_IlmImf.vcxproj.filters similarity index 100% rename from windows/vs2015/openexr_IlmImf.vcxproj.filters rename to windows/vs2022/openexr_IlmImf.vcxproj.filters diff --git a/windows/vs2015/openexr_IlmThread.vcxproj b/windows/vs2022/openexr_IlmThread.vcxproj similarity index 83% rename from windows/vs2015/openexr_IlmThread.vcxproj rename to windows/vs2022/openexr_IlmThread.vcxproj index 125925ffe..dede5e577 100644 --- a/windows/vs2015/openexr_IlmThread.vcxproj +++ b/windows/vs2022/openexr_IlmThread.vcxproj @@ -33,53 +33,71 @@ Release-AVX x64 + + Release-AVX512 + Win32 + + + Release-AVX512 + x64 + {76ADDB29-9C6A-442C-9BA9-764C050F75DD} OpenEXR IlmBase IlmThread + 10.0.20348.0 StaticLibrary true MultiByte - v140 + v143 StaticLibrary true MultiByte - v140 + v143 StaticLibrary MultiByte true - v140 + v143 StaticLibrary MultiByte true - v140 + v143 StaticLibrary MultiByte true - v140 + v143 StaticLibrary MultiByte true - v140 + v143 + + + StaticLibrary + MultiByte + true + v143 - v140 + v143 + + + v143 - v140 + v143 @@ -103,6 +121,10 @@ + + + + bin32\lib\ @@ -140,6 +162,12 @@ false IlmThread$(ConfigTag) + + bin64\lib\ + build\$(ProjectName)\$(Platform)\$(Configuration)\ + false + IlmThread$(ConfigTag) + <_ProjectFileVersion>10.0.40219.1 @@ -271,6 +299,28 @@ false + + + ..\..\libraries\ilmbase\IlmThread;..\..\libraries\ilmbase\Iex;..\..\libraries\ilmbase\config.windows;%(AdditionalIncludeDirectories) + WIN32;WIN32_LEAN_AND_MEAN;NDEBUG;_WINDOWS;ILMTHREAD_EXPORTS;%(PreprocessorDefinitions) + MultiThreaded + true + true + Level2 + ProgramDatabase + Full + AnySuitable + true + Speed + true + + + Windows + true + true + false + + diff --git a/windows/vs2015/openexr_IlmThread.vcxproj.filters b/windows/vs2022/openexr_IlmThread.vcxproj.filters similarity index 100% rename from windows/vs2015/openexr_IlmThread.vcxproj.filters rename to windows/vs2022/openexr_IlmThread.vcxproj.filters diff --git a/windows/vs2015/openexr_eLut.vcxproj b/windows/vs2022/openexr_eLut.vcxproj similarity index 96% rename from windows/vs2015/openexr_eLut.vcxproj rename to windows/vs2022/openexr_eLut.vcxproj index 0ab257d3f..ddec583c4 100644 --- a/windows/vs2015/openexr_eLut.vcxproj +++ b/windows/vs2022/openexr_eLut.vcxproj @@ -15,17 +15,18 @@ Win32Proj eLut OpenEXR IlmBase Half eLut + 10.0.20348.0 Application false - v140 + v143 Application false - v140 + v143 diff --git a/windows/vs2015/openexr_eLut.vcxproj.filters b/windows/vs2022/openexr_eLut.vcxproj.filters similarity index 100% rename from windows/vs2015/openexr_eLut.vcxproj.filters rename to windows/vs2022/openexr_eLut.vcxproj.filters diff --git a/windows/vs2015/openexr_toFloat.vcxproj b/windows/vs2022/openexr_toFloat.vcxproj similarity index 96% rename from windows/vs2015/openexr_toFloat.vcxproj rename to windows/vs2022/openexr_toFloat.vcxproj index 87db648a9..7e3df95c2 100644 --- a/windows/vs2015/openexr_toFloat.vcxproj +++ b/windows/vs2022/openexr_toFloat.vcxproj @@ -15,17 +15,18 @@ Win32Proj toFloat OpenEXR IlmBase Half toFloat + 10.0.20348.0 Application false - v140 + v143 Application false - v140 + v143 diff --git a/windows/vs2015/openexr_toFloat.vcxproj.filters b/windows/vs2022/openexr_toFloat.vcxproj.filters similarity index 100% rename from windows/vs2015/openexr_toFloat.vcxproj.filters rename to windows/vs2022/openexr_toFloat.vcxproj.filters diff --git a/windows/vs2015/povbackend.vcxproj b/windows/vs2022/povbackend.vcxproj similarity index 85% rename from windows/vs2015/povbackend.vcxproj rename to windows/vs2022/povbackend.vcxproj index 75651b809..6299366ed 100644 --- a/windows/vs2015/povbackend.vcxproj +++ b/windows/vs2022/povbackend.vcxproj @@ -33,50 +33,68 @@ Release-AVX x64 + + Release-AVX512 + Win32 + + + Release-AVX512 + x64 + {C6D9B754-11EB-4FC3-8683-593B53E9AD1F} + 10.0.20348.0 StaticLibrary false - v140 + v143 StaticLibrary false - v140 + v143 StaticLibrary false true - v140 + v143 StaticLibrary false true - v140 + v143 StaticLibrary false true - v140 + v143 StaticLibrary false true - v140 + v143 + + + StaticLibrary + false + true + v143 - v140 + v143 + + + v143 - v140 + v143 @@ -100,6 +118,10 @@ + + + + bin32\lib\ @@ -131,6 +153,11 @@ build\$(ProjectName)\$(Platform)\$(Configuration)\ $(ProjectName)$(ConfigTag) + + bin64\lib\ + build\$(ProjectName)\$(Platform)\$(Configuration)\ + $(ProjectName)$(ConfigTag) + <_ProjectFileVersion>10.0.30319.1 @@ -397,6 +424,51 @@ $(OutDir)$(TargetName)$(TargetExt) + + + NDEBUG;%(PreprocessorDefinitions) + true + true + X64 + + + Full + AnySuitable + true + Speed + false + false + ..\..\internal\windows;..\..\platform\x86;..\..\platform\windows;..\..\windows\povconfig;..\..\libraries\boost;..\..\vfe\win\;..\..\vfe\;..\..\source;..\..\libraries\jpeg;..\..\libraries\zlib;..\..\libraries\png;..\..\libraries\tiff\libtiff;..\..\libraries\ilmbase\config.windows;..\..\libraries\openexr\config.windows;%(AdditionalIncludeDirectories) + $(PovBuildDefs)BOOST_ALL_NO_LIB;NDEBUG;WIN32;WIN32_LEAN_AND_MEAN;_WINDOWS;CLASSLIB_DEFS_H;NOMINMAX;ISOLATION_AWARE_ENABLED;_CRT_SECURE_NO_DEPRECATE;_SECURE_SCL=0;BUILDING_AMD64=1;%(PreprocessorDefinitions) + true + Sync + MultiThreaded + false + NotSet + Precise + false + true + true + Use + precomp.h + $(IntDir)precomp.pch + true + $(IntDir) + Level3 + true + ProgramDatabase + Default + 4800;4355;%(DisableSpecificWarnings) + precomp.h;%(ForcedIncludeFiles) + + + NDEBUG;%(PreprocessorDefinitions) + 0x0409 + + + $(OutDir)$(TargetName)$(TargetExt) + + @@ -426,6 +498,7 @@ Create Create Create + Create diff --git a/windows/vs2015/povbackend.vcxproj.filters b/windows/vs2022/povbackend.vcxproj.filters similarity index 100% rename from windows/vs2015/povbackend.vcxproj.filters rename to windows/vs2022/povbackend.vcxproj.filters diff --git a/windows/vs2015/povbase.vcxproj b/windows/vs2022/povbase.vcxproj similarity index 86% rename from windows/vs2015/povbase.vcxproj rename to windows/vs2022/povbase.vcxproj index a33b03591..9b60fe20d 100644 --- a/windows/vs2015/povbase.vcxproj +++ b/windows/vs2022/povbase.vcxproj @@ -33,50 +33,68 @@ Release-AVX x64 + + Release-AVX512 + Win32 + + + Release-AVX512 + x64 + {C6D9B754-11EB-4FC3-8683-593B2377D043} + 10.0.20348.0 StaticLibrary false - v140 + v143 StaticLibrary false - v140 + v143 StaticLibrary false true - v140 + v143 StaticLibrary false true - v140 + v143 StaticLibrary false true - v140 + v143 StaticLibrary false true - v140 + v143 + + + StaticLibrary + false + true + v143 - v140 + v143 + + + v143 - v140 + v143 @@ -100,6 +118,10 @@ + + + + bin32\lib\ @@ -131,6 +153,11 @@ build\$(ProjectName)\$(Platform)\$(Configuration)\ $(ProjectName)$(ConfigTag) + + bin64\lib\ + build\$(ProjectName)\$(Platform)\$(Configuration)\ + $(ProjectName)$(ConfigTag) + <_ProjectFileVersion>10.0.30319.1 @@ -384,6 +411,48 @@ 0x0409 + + + NDEBUG;%(PreprocessorDefinitions) + true + true + X64 + + + Full + AnySuitable + true + Speed + false + false + ..\..\internal\windows;..\..\platform\x86;..\..\platform\windows;..\..\windows\povconfig;..\..\libraries\ilmbase\config.windows;..\..\libraries\openexr\config.windows;..\..\libraries\openexr\IlmImf;..\..\libraries\ilmbase\Half;..\..\libraries\ilmbase\Imath;..\..\libraries\ilmbase\Iex;..\..\libraries\boost;..\..\vfe\win;..\..\vfe;..\..\source;..\..\libraries\jpeg;..\..\libraries\zlib;..\..\libraries\png;..\..\libraries\tiff\libtiff;%(AdditionalIncludeDirectories) + $(PovBuildDefs)BOOST_ALL_NO_LIB;NON_UNIX_OPENEXR_HEADERS;NDEBUG;WIN32;WIN32_LEAN_AND_MEAN;_WINDOWS;CLASSLIB_DEFS_H;NOMINMAX;ISOLATION_AWARE_ENABLED;_CRT_SECURE_NO_DEPRECATE;_SECURE_SCL=0;BUILDING_AMD64=1;%(PreprocessorDefinitions) + true + Sync + MultiThreaded + false + NotSet + Precise + false + true + true + Use + precomp.h + $(IntDir)precomp.pch + true + $(IntDir) + Level3 + true + ProgramDatabase + Default + 4800;4355;%(DisableSpecificWarnings) + precomp.h;%(ForcedIncludeFiles) + + + NDEBUG;%(PreprocessorDefinitions) + 0x0409 + + @@ -420,6 +489,7 @@ SyncCThrow SyncCThrow SyncCThrow + SyncCThrow @@ -429,6 +499,7 @@ SyncCThrow SyncCThrow SyncCThrow + SyncCThrow @@ -442,6 +513,7 @@ Create Create Create + Create diff --git a/windows/vs2015/povbase.vcxproj.filters b/windows/vs2022/povbase.vcxproj.filters similarity index 100% rename from windows/vs2015/povbase.vcxproj.filters rename to windows/vs2022/povbase.vcxproj.filters diff --git a/windows/vs2015/povcore.vcxproj b/windows/vs2022/povcore.vcxproj similarity index 87% rename from windows/vs2015/povcore.vcxproj rename to windows/vs2022/povcore.vcxproj index 4949cd7e4..56dcc950c 100644 --- a/windows/vs2015/povcore.vcxproj +++ b/windows/vs2022/povcore.vcxproj @@ -33,51 +33,69 @@ Release-AVX x64 + + Release-AVX512 + Win32 + + + Release-AVX512 + x64 + {7F9DA615-40A3-43A0-B8BB-528698DDE6E5} pov_core + 10.0.20348.0 StaticLibrary false - v140 + v143 StaticLibrary false - v140 + v143 StaticLibrary false true - v140 + v143 StaticLibrary false true - v140 + v143 StaticLibrary false true - v140 + v143 StaticLibrary false true - v140 + v143 + + + StaticLibrary + false + true + v143 - v140 + v143 + + + v143 - v140 + v143 @@ -101,6 +119,10 @@ + + + + bin32\lib\ @@ -132,6 +154,11 @@ build\$(ProjectName)\$(Platform)\$(Configuration)\ $(ProjectName)$(ConfigTag) + + bin64\lib\ + build\$(ProjectName)\$(Platform)\$(Configuration)\ + $(ProjectName)$(ConfigTag) + <_ProjectFileVersion>10.0.30319.1 @@ -398,6 +425,51 @@ $(OutDir)$(TargetName)$(TargetExt) + + + NDEBUG;%(PreprocessorDefinitions) + true + true + X64 + + + Full + AnySuitable + true + Speed + false + false + ..\..\internal\windows;..\..\platform\x86;..\..\platform\windows;..\..\windows\povconfig;..\..\libraries\boost;..\..\vfe\win\;..\..\vfe\;..\..\source;..\..\libraries\jpeg;..\..\libraries\zlib;..\..\libraries\png;..\..\libraries\tiff\libtiff;%(AdditionalIncludeDirectories) + $(PovBuildDefs)BOOST_ALL_NO_LIB;NDEBUG;WIN32;WIN32_LEAN_AND_MEAN;_WINDOWS;CLASSLIB_DEFS_H;NOMINMAX;ISOLATION_AWARE_ENABLED;_CRT_SECURE_NO_DEPRECATE;_SECURE_SCL=0;BUILDING_AMD64=1;%(PreprocessorDefinitions) + true + Sync + MultiThreaded + false + NotSet + Precise + false + true + true + Use + precomp.h + $(IntDir)precomp.pch + true + $(IntDir) + Level3 + true + ProgramDatabase + Default + 4800;4355;%(DisableSpecificWarnings) + precomp.h;%(ForcedIncludeFiles) + + + NDEBUG;%(PreprocessorDefinitions) + 0x0409 + + + $(OutDir)$(TargetName)$(TargetExt) + + @@ -474,6 +546,7 @@ Create Create Create + Create diff --git a/windows/vs2015/povcore.vcxproj.filters b/windows/vs2022/povcore.vcxproj.filters similarity index 100% rename from windows/vs2015/povcore.vcxproj.filters rename to windows/vs2022/povcore.vcxproj.filters diff --git a/windows/vs2015/povfrontend.vcxproj b/windows/vs2022/povfrontend.vcxproj similarity index 84% rename from windows/vs2015/povfrontend.vcxproj rename to windows/vs2022/povfrontend.vcxproj index 59357a4b8..af6aa2294 100644 --- a/windows/vs2015/povfrontend.vcxproj +++ b/windows/vs2022/povfrontend.vcxproj @@ -33,50 +33,68 @@ Release-AVX x64 + + Release-AVX512 + Win32 + + + Release-AVX512 + x64 + {C6D9B754-11EB-4FC3-8683-593BFD58C904} + 10.0.20348.0 StaticLibrary false - v140 + v143 StaticLibrary false - v140 + v143 StaticLibrary false true - v140 + v143 StaticLibrary false true - v140 + v143 StaticLibrary false true - v140 + v143 StaticLibrary false true - v140 + v143 + + + StaticLibrary + false + true + v143 - v140 + v143 + + + v143 - v140 + v143 @@ -100,6 +118,10 @@ + + + + bin32\lib\ @@ -131,6 +153,11 @@ build\$(ProjectName)\$(Platform)\$(Configuration)\ $(ProjectName)$(ConfigTag) + + bin64\lib\ + build\$(ProjectName)\$(Platform)\$(Configuration)\ + $(ProjectName)$(ConfigTag) + <_ProjectFileVersion>10.0.30319.1 @@ -384,6 +411,48 @@ 0x0409 + + + NDEBUG;%(PreprocessorDefinitions) + true + true + X64 + + + Full + AnySuitable + true + Speed + false + false + ..\..\internal\windows;..\..\platform\x86;..\..\platform\windows;..\..\windows\povconfig;..\..\libraries\boost;..\..\vfe\win\;..\..\vfe\;..\..\source;..\..\libraries\jpeg;..\..\libraries\zlib;..\..\libraries\png;..\..\libraries\tiff\libtiff;%(AdditionalIncludeDirectories) + $(PovBuildDefs)BOOST_ALL_NO_LIB;NDEBUG;WIN32;WIN32_LEAN_AND_MEAN;_WINDOWS;CLASSLIB_DEFS_H;NOMINMAX;ISOLATION_AWARE_ENABLED;_CRT_SECURE_NO_DEPRECATE;_SECURE_SCL=0;BUILDING_AMD64=1;%(PreprocessorDefinitions) + true + Sync + MultiThreaded + false + NotSet + Precise + false + true + true + Use + precomp.h + $(IntDir)precomp.pch + true + $(IntDir) + Level3 + true + ProgramDatabase + Default + 4800;4355;%(DisableSpecificWarnings) + precomp.h;%(ForcedIncludeFiles) + + + NDEBUG;%(PreprocessorDefinitions) + 0x0409 + + @@ -405,6 +474,7 @@ Create Create Create + Create diff --git a/windows/vs2015/povfrontend.vcxproj.filters b/windows/vs2022/povfrontend.vcxproj.filters similarity index 100% rename from windows/vs2015/povfrontend.vcxproj.filters rename to windows/vs2022/povfrontend.vcxproj.filters diff --git a/windows/vs2015/povms.vcxproj b/windows/vs2022/povms.vcxproj similarity index 84% rename from windows/vs2015/povms.vcxproj rename to windows/vs2022/povms.vcxproj index 1bece2649..3cf8988e9 100644 --- a/windows/vs2015/povms.vcxproj +++ b/windows/vs2022/povms.vcxproj @@ -33,50 +33,68 @@ Release-AVX x64 + + Release-AVX512 + Win32 + + + Release-AVX512 + x64 + {B1E68128-84D7-4525-A3C1-E6C1077F2239} + 10.0.20348.0 StaticLibrary false - v140 + v143 StaticLibrary false - v140 + v143 StaticLibrary false true - v140 + v143 StaticLibrary false true - v140 + v143 StaticLibrary false true - v140 + v143 StaticLibrary false true - v140 + v143 + + + StaticLibrary + false + true + v143 - v140 + v143 + + + v143 - v140 + v143 @@ -100,6 +118,10 @@ + + + + bin32\lib\ @@ -131,6 +153,11 @@ build\$(ProjectName)\$(Platform)\$(Configuration)\ $(ProjectName)$(ConfigTag) + + bin64\lib\ + build\$(ProjectName)\$(Platform)\$(Configuration)\ + $(ProjectName)$(ConfigTag) + <_ProjectFileVersion>10.0.30319.1 @@ -384,6 +411,48 @@ 0x0409 + + + NDEBUG;%(PreprocessorDefinitions) + true + true + X64 + + + Full + AnySuitable + true + Speed + false + false + ..\..\internal\windows;..\..\platform\x86;..\..\platform\windows;..\..\windows\povconfig;..\..\libraries\openexr\IlmImf;..\..\libraries\ilmbase\Half;..\..\libraries\ilmbase\Imath;..\..\libraries\ilmbase\Iex;..\..\libraries\boost;..\..\vfe\win;..\..\vfe;..\..\source;..\..\libraries\jpeg;..\..\libraries\zlib;..\..\libraries\png;..\..\libraries\tiff\libtiff;%(AdditionalIncludeDirectories) + $(PovBuildDefs)BOOST_ALL_NO_LIB;NON_UNIX_OPENEXR_HEADERS;NDEBUG;WIN32;WIN32_LEAN_AND_MEAN;_WINDOWS;CLASSLIB_DEFS_H;NOMINMAX;ISOLATION_AWARE_ENABLED;_CRT_SECURE_NO_DEPRECATE;_SECURE_SCL=0;BUILDING_AMD64=1;%(PreprocessorDefinitions) + true + Sync + MultiThreaded + false + NotSet + Precise + false + true + true + Use + precomp.h + $(IntDir)precomp.pch + true + $(IntDir) + Level3 + true + ProgramDatabase + Default + 4800;4355;%(DisableSpecificWarnings) + precomp.h;%(ForcedIncludeFiles) + + + NDEBUG;%(PreprocessorDefinitions) + 0x0409 + + true @@ -392,6 +461,7 @@ true true true + true @@ -403,6 +473,7 @@ Create Create Create + Create diff --git a/windows/vs2015/povms.vcxproj.filters b/windows/vs2022/povms.vcxproj.filters similarity index 100% rename from windows/vs2015/povms.vcxproj.filters rename to windows/vs2022/povms.vcxproj.filters diff --git a/windows/vs2015/povparser.vcxproj b/windows/vs2022/povparser.vcxproj similarity index 84% rename from windows/vs2015/povparser.vcxproj rename to windows/vs2022/povparser.vcxproj index b6776cd10..04a1099b1 100644 --- a/windows/vs2015/povparser.vcxproj +++ b/windows/vs2022/povparser.vcxproj @@ -33,51 +33,69 @@ Release-AVX x64 + + Release-AVX512 + Win32 + + + Release-AVX512 + x64 + {F0304A28-E1C7-4F4F-BE1F-DF57936C9664} pov_parser + 10.0.20348.0 StaticLibrary false - v140 + v143 StaticLibrary false - v140 + v143 StaticLibrary false true - v140 + v143 StaticLibrary false true - v140 + v143 StaticLibrary false true - v140 + v143 StaticLibrary false true - v140 + v143 + + + StaticLibrary + false + true + v143 - v140 + v143 + + + v143 - v140 + v143 @@ -101,6 +119,10 @@ + + + + bin32\lib\ @@ -132,6 +154,11 @@ build\$(ProjectName)\$(Platform)\$(Configuration)\ $(ProjectName)$(ConfigTag) + + bin64\lib\ + build\$(ProjectName)\$(Platform)\$(Configuration)\ + $(ProjectName)$(ConfigTag) + <_ProjectFileVersion>10.0.30319.1 @@ -398,6 +425,51 @@ $(OutDir)$(TargetName)$(TargetExt) + + + NDEBUG;%(PreprocessorDefinitions) + true + true + X64 + + + Full + AnySuitable + true + Speed + false + false + ..\..\internal\windows;..\..\platform\x86;..\..\platform\windows;..\..\windows\povconfig;..\..\libraries\boost;..\..\vfe\win\;..\..\vfe\;..\..\source;..\..\libraries\jpeg;..\..\libraries\zlib;..\..\libraries\png;..\..\libraries\tiff\libtiff;%(AdditionalIncludeDirectories) + $(PovBuildDefs)BOOST_ALL_NO_LIB;NDEBUG;WIN32;WIN32_LEAN_AND_MEAN;_WINDOWS;CLASSLIB_DEFS_H;NOMINMAX;ISOLATION_AWARE_ENABLED;_CRT_SECURE_NO_DEPRECATE;_SECURE_SCL=0;BUILDING_AMD64=1;%(PreprocessorDefinitions) + true + Sync + MultiThreaded + false + NotSet + Precise + false + true + true + Use + precomp.h + $(IntDir)precomp.pch + true + $(IntDir) + Level3 + true + ProgramDatabase + Default + 4800;4355;%(DisableSpecificWarnings) + precomp.h;%(ForcedIncludeFiles) + + + NDEBUG;%(PreprocessorDefinitions) + 0x0409 + + + $(OutDir)$(TargetName)$(TargetExt) + + @@ -416,6 +488,7 @@ Create Create Create + Create diff --git a/windows/vs2015/povparser.vcxproj.filters b/windows/vs2022/povparser.vcxproj.filters similarity index 100% rename from windows/vs2015/povparser.vcxproj.filters rename to windows/vs2022/povparser.vcxproj.filters diff --git a/windows/vs2015/povplatform.vcxproj b/windows/vs2022/povplatform.vcxproj similarity index 79% rename from windows/vs2015/povplatform.vcxproj rename to windows/vs2022/povplatform.vcxproj index 3deeba43f..d3cd8c275 100644 --- a/windows/vs2015/povplatform.vcxproj +++ b/windows/vs2022/povplatform.vcxproj @@ -33,51 +33,69 @@ Release-AVX x64 + + Release-AVX512 + Win32 + + + Release-AVX512 + x64 + {0C227B07-1830-4C5B-8D4E-2DEFFFD2792D} povplatform + 10.0.20348.0 StaticLibrary false - v140 + v143 StaticLibrary false - v140 + v143 StaticLibrary false true - v140 + v143 StaticLibrary false true - v140 + v143 StaticLibrary false true - v140 + v143 StaticLibrary false true - v140 + v143 + + + StaticLibrary + false + true + v143 - v140 + v143 + + + v143 - v140 + v143 @@ -101,6 +119,10 @@ + + + + bin32\lib\ @@ -132,6 +154,11 @@ build\$(ProjectName)\$(Platform)\$(Configuration)\ $(ProjectName)$(ConfigTag) + + bin64\lib\ + build\$(ProjectName)\$(Platform)\$(Configuration)\ + $(ProjectName)$(ConfigTag) + <_ProjectFileVersion>10.0.30319.1 @@ -374,50 +401,111 @@ $(OutDir)$(TargetName)$(TargetExt) + + + NDEBUG;%(PreprocessorDefinitions) + true + true + X64 + + + Full + AnySuitable + true + Speed + false + false + ..\..\internal\windows;..\..\platform\x86;..\..\platform\windows;..\..\windows\povconfig;..\..\libraries\boost;..\..\vfe\win\;..\..\vfe\;..\..\source;..\..\libraries\jpeg;..\..\libraries\zlib;..\..\libraries\png;..\..\libraries\tiff\libtiff;%(AdditionalIncludeDirectories) + $(PovBuildDefs)BOOST_ALL_NO_LIB;NDEBUG;WIN32;WIN32_LEAN_AND_MEAN;_WINDOWS;CLASSLIB_DEFS_H;NOMINMAX;ISOLATION_AWARE_ENABLED;_CRT_SECURE_NO_DEPRECATE;_SECURE_SCL=0;BUILDING_AMD64=1;%(PreprocessorDefinitions) + true + Sync + MultiThreaded + false + NotSet + Precise + false + true + true + true + $(IntDir) + Level3 + true + ProgramDatabase + Default + 4800;4355;%(DisableSpecificWarnings) + + + NDEBUG;%(PreprocessorDefinitions) + 0x0409 + + + $(OutDir)$(TargetName)$(TargetExt) + + + + AdvancedVectorExtensions512 + AdvancedVectorExtensions512 + AdvancedVectorExtensions512 + AdvancedVectorExtensions512 + AdvancedVectorExtensions512 + false + false + false + false + false + AdvancedVectorExtensions2 AdvancedVectorExtensions2 AdvancedVectorExtensions2 + AdvancedVectorExtensions2 AdvancedVectorExtensions2 false false false false + false AdvancedVectorExtensions AdvancedVectorExtensions AdvancedVectorExtensions + AdvancedVectorExtensions AdvancedVectorExtensions false false false false + false AdvancedVectorExtensions AdvancedVectorExtensions AdvancedVectorExtensions + AdvancedVectorExtensions AdvancedVectorExtensions false false false false + false AdvancedVectorExtensions AdvancedVectorExtensions AdvancedVectorExtensions AdvancedVectorExtensions + AdvancedVectorExtensions false false false false + false @@ -434,6 +522,7 @@ + diff --git a/windows/vs2015/povplatform.vcxproj.filters b/windows/vs2022/povplatform.vcxproj.filters similarity index 93% rename from windows/vs2015/povplatform.vcxproj.filters rename to windows/vs2022/povplatform.vcxproj.filters index 8776b02ff..333ab4ee2 100644 --- a/windows/vs2015/povplatform.vcxproj.filters +++ b/windows/vs2022/povplatform.vcxproj.filters @@ -55,6 +55,9 @@ Platform Source\x86 + + Platform Source\x86 + @@ -90,5 +93,8 @@ Platform Headers\x86 + + Platform Source\x86 + \ No newline at end of file diff --git a/windows/vs2015/povray.sln b/windows/vs2022/povray.sln similarity index 77% rename from windows/vs2015/povray.sln rename to windows/vs2022/povray.sln index be7603cf2..867514c7f 100644 --- a/windows/vs2015/povray.sln +++ b/windows/vs2022/povray.sln @@ -1,476 +1,589 @@ -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 14 -VisualStudioVersion = 14.0.25420.1 -MinimumVisualStudioVersion = 14.0.23107.0 -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Image Libraries", "Image Libraries", "{4178148C-8A0C-4EB0-ACD9-0E09676F2700}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Generic POV-Ray", "Generic POV-Ray", "{5319B36D-2906-4EAF-B623-B7C04F3CC2AD}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "VFE", "VFE", "{4A043885-D401-40B2-9375-1C57136F03F6}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Windows Targets", "Windows Targets", "{CB0679D3-62C5-4328-B49F-504E0AA9C65A}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "GUI", "povray.vcxproj", "{9BA806FC-C022-4ACF-A3F1-3EC8CAB45570}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "jpeg", "jpeg.vcxproj", "{3780CCDE-4967-4C31-B6A3-3C2570BDD3E4}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libpng", "libpng.vcxproj", "{E1EA88AF-6B44-4225-B97B-B485FC9DB23E}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tiff", "tiff.vcxproj", "{186BAEF6-CF24-42C1-8CE3-25590CB9F6E7}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "zlib", "zlib.vcxproj", "{8BB067C4-7135-4643-863C-49C520BEEA01}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "vfewin", "vfewin.vcxproj", "{72793DF1-D4AF-4AA0-A606-7B51ED2A3F5C}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "rtrsupport", "rtrsupport.vcxproj", "{851C772C-D7C2-4EE3-A90C-23386F0E9897}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "console", "console.vcxproj", "{3B6BB403-FC72-45FF-A431-9295A1AEB7A3}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "povbackend", "povbackend.vcxproj", "{C6D9B754-11EB-4FC3-8683-593B53E9AD1F}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "povbase", "povbase.vcxproj", "{C6D9B754-11EB-4FC3-8683-593B2377D043}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "povfrontend", "povfrontend.vcxproj", "{C6D9B754-11EB-4FC3-8683-593BFD58C904}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Boost Libraries", "Boost Libraries", "{31AFDB3C-8769-49DF-9C9E-2013E194D983}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "boost_thread", "boost_thread.vcxproj", "{10B193D4-E27B-4438-A825-BFB3D2B4C74D}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "boost_date_time", "boost_date_time.vcxproj", "{35A2DC31-84BC-4F7A-9C93-1D072432AD79}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "OpenEXR Libraries", "OpenEXR Libraries", "{30F7FB89-B9D5-473E-A14D-6A00700C1EA9}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "OpenEXR IlmImf", "openexr_IlmImf.vcxproj", "{7DF42126-D237-41D3-9ABE-A3ACC8BAC56E}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "OpenEXR IlmBase Iex", "openexr_Iex.vcxproj", "{C46B9A53-86D8-4B7F-AB15-B2C04518A195}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "OpenEXR IlmBase IlmThread", "openexr_IlmThread.vcxproj", "{76ADDB29-9C6A-442C-9BA9-764C050F75DD}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "OpenEXR IlmBase Half", "openexr_Half.vcxproj", "{9EDB5C0F-BFD0-4A59-BB93-F06A52BB0128}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "OpenEXR IlmBase Half eLut", "openexr_eLut.vcxproj", "{39C65232-04FB-4622-8283-34829739887C}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "OpenEXR IlmBase Half toFloat", "openexr_toFloat.vcxproj", "{9801D5FF-C1E0-46C5-A73E-47DEECE99DDB}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tests", "tests.vcxproj", "{86D92BC4-4C57-42D1-9F63-26ABF811715B}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "povcore", "povcore.vcxproj", "{7F9DA615-40A3-43A0-B8BB-528698DDE6E5}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "povparser", "povparser.vcxproj", "{F0304A28-E1C7-4F4F-BE1F-DF57936C9664}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "povms", "povms.vcxproj", "{B1E68128-84D7-4525-A3C1-E6C1077F2239}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "povplatform", "povplatform.vcxproj", "{0C227B07-1830-4C5B-8D4E-2DEFFFD2792D}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "boost_system", "boost_system.vcxproj", "{D870A978-8130-4D1D-9FB2-3EE2028D2C50}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "povvm", "povvm.vcxproj", "{E7A73E97-7106-4D4A-98BA-AA43FBD19DB4}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "cmedit", "cmedit.vcxproj", "{37FDEA25-43CD-4AF0-A232-281E11851E75}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Win32 = Debug|Win32 - Debug|x64 = Debug|x64 - Release|Win32 = Release|Win32 - Release|x64 = Release|x64 - Release-AVX|Win32 = Release-AVX|Win32 - Release-AVX|x64 = Release-AVX|x64 - Release-SSE2|Win32 = Release-SSE2|Win32 - Release-SSE2|x64 = Release-SSE2|x64 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {9BA806FC-C022-4ACF-A3F1-3EC8CAB45570}.Debug|Win32.ActiveCfg = Debug|Win32 - {9BA806FC-C022-4ACF-A3F1-3EC8CAB45570}.Debug|Win32.Build.0 = Debug|Win32 - {9BA806FC-C022-4ACF-A3F1-3EC8CAB45570}.Debug|x64.ActiveCfg = Debug|x64 - {9BA806FC-C022-4ACF-A3F1-3EC8CAB45570}.Debug|x64.Build.0 = Debug|x64 - {9BA806FC-C022-4ACF-A3F1-3EC8CAB45570}.Release|Win32.ActiveCfg = Release|Win32 - {9BA806FC-C022-4ACF-A3F1-3EC8CAB45570}.Release|Win32.Build.0 = Release|Win32 - {9BA806FC-C022-4ACF-A3F1-3EC8CAB45570}.Release|x64.ActiveCfg = Release|x64 - {9BA806FC-C022-4ACF-A3F1-3EC8CAB45570}.Release|x64.Build.0 = Release|x64 - {9BA806FC-C022-4ACF-A3F1-3EC8CAB45570}.Release-AVX|Win32.ActiveCfg = Release|Win32 - {9BA806FC-C022-4ACF-A3F1-3EC8CAB45570}.Release-AVX|x64.ActiveCfg = Release-AVX|x64 - {9BA806FC-C022-4ACF-A3F1-3EC8CAB45570}.Release-AVX|x64.Build.0 = Release-AVX|x64 - {9BA806FC-C022-4ACF-A3F1-3EC8CAB45570}.Release-SSE2|Win32.ActiveCfg = Release-SSE2|Win32 - {9BA806FC-C022-4ACF-A3F1-3EC8CAB45570}.Release-SSE2|Win32.Build.0 = Release-SSE2|Win32 - {9BA806FC-C022-4ACF-A3F1-3EC8CAB45570}.Release-SSE2|x64.ActiveCfg = Release|x64 - {3780CCDE-4967-4C31-B6A3-3C2570BDD3E4}.Debug|Win32.ActiveCfg = Debug|Win32 - {3780CCDE-4967-4C31-B6A3-3C2570BDD3E4}.Debug|Win32.Build.0 = Debug|Win32 - {3780CCDE-4967-4C31-B6A3-3C2570BDD3E4}.Debug|x64.ActiveCfg = Debug|x64 - {3780CCDE-4967-4C31-B6A3-3C2570BDD3E4}.Debug|x64.Build.0 = Debug|x64 - {3780CCDE-4967-4C31-B6A3-3C2570BDD3E4}.Release|Win32.ActiveCfg = Release|Win32 - {3780CCDE-4967-4C31-B6A3-3C2570BDD3E4}.Release|Win32.Build.0 = Release|Win32 - {3780CCDE-4967-4C31-B6A3-3C2570BDD3E4}.Release|x64.ActiveCfg = Release|x64 - {3780CCDE-4967-4C31-B6A3-3C2570BDD3E4}.Release|x64.Build.0 = Release|x64 - {3780CCDE-4967-4C31-B6A3-3C2570BDD3E4}.Release-AVX|Win32.ActiveCfg = Release|Win32 - {3780CCDE-4967-4C31-B6A3-3C2570BDD3E4}.Release-AVX|x64.ActiveCfg = Release-AVX|x64 - {3780CCDE-4967-4C31-B6A3-3C2570BDD3E4}.Release-AVX|x64.Build.0 = Release-AVX|x64 - {3780CCDE-4967-4C31-B6A3-3C2570BDD3E4}.Release-SSE2|Win32.ActiveCfg = Release-SSE2|Win32 - {3780CCDE-4967-4C31-B6A3-3C2570BDD3E4}.Release-SSE2|Win32.Build.0 = Release-SSE2|Win32 - {3780CCDE-4967-4C31-B6A3-3C2570BDD3E4}.Release-SSE2|x64.ActiveCfg = Release|x64 - {E1EA88AF-6B44-4225-B97B-B485FC9DB23E}.Debug|Win32.ActiveCfg = Debug|Win32 - {E1EA88AF-6B44-4225-B97B-B485FC9DB23E}.Debug|Win32.Build.0 = Debug|Win32 - {E1EA88AF-6B44-4225-B97B-B485FC9DB23E}.Debug|x64.ActiveCfg = Debug|x64 - {E1EA88AF-6B44-4225-B97B-B485FC9DB23E}.Debug|x64.Build.0 = Debug|x64 - {E1EA88AF-6B44-4225-B97B-B485FC9DB23E}.Release|Win32.ActiveCfg = Release|Win32 - {E1EA88AF-6B44-4225-B97B-B485FC9DB23E}.Release|Win32.Build.0 = Release|Win32 - {E1EA88AF-6B44-4225-B97B-B485FC9DB23E}.Release|x64.ActiveCfg = Release|x64 - {E1EA88AF-6B44-4225-B97B-B485FC9DB23E}.Release|x64.Build.0 = Release|x64 - {E1EA88AF-6B44-4225-B97B-B485FC9DB23E}.Release-AVX|Win32.ActiveCfg = Release|Win32 - {E1EA88AF-6B44-4225-B97B-B485FC9DB23E}.Release-AVX|x64.ActiveCfg = Release-AVX|x64 - {E1EA88AF-6B44-4225-B97B-B485FC9DB23E}.Release-AVX|x64.Build.0 = Release-AVX|x64 - {E1EA88AF-6B44-4225-B97B-B485FC9DB23E}.Release-SSE2|Win32.ActiveCfg = Release-SSE2|Win32 - {E1EA88AF-6B44-4225-B97B-B485FC9DB23E}.Release-SSE2|Win32.Build.0 = Release-SSE2|Win32 - {E1EA88AF-6B44-4225-B97B-B485FC9DB23E}.Release-SSE2|x64.ActiveCfg = Release|x64 - {186BAEF6-CF24-42C1-8CE3-25590CB9F6E7}.Debug|Win32.ActiveCfg = Debug|Win32 - {186BAEF6-CF24-42C1-8CE3-25590CB9F6E7}.Debug|Win32.Build.0 = Debug|Win32 - {186BAEF6-CF24-42C1-8CE3-25590CB9F6E7}.Debug|x64.ActiveCfg = Debug|x64 - {186BAEF6-CF24-42C1-8CE3-25590CB9F6E7}.Debug|x64.Build.0 = Debug|x64 - {186BAEF6-CF24-42C1-8CE3-25590CB9F6E7}.Release|Win32.ActiveCfg = Release|Win32 - {186BAEF6-CF24-42C1-8CE3-25590CB9F6E7}.Release|Win32.Build.0 = Release|Win32 - {186BAEF6-CF24-42C1-8CE3-25590CB9F6E7}.Release|x64.ActiveCfg = Release|x64 - {186BAEF6-CF24-42C1-8CE3-25590CB9F6E7}.Release|x64.Build.0 = Release|x64 - {186BAEF6-CF24-42C1-8CE3-25590CB9F6E7}.Release-AVX|Win32.ActiveCfg = Release|Win32 - {186BAEF6-CF24-42C1-8CE3-25590CB9F6E7}.Release-AVX|x64.ActiveCfg = Release-AVX|x64 - {186BAEF6-CF24-42C1-8CE3-25590CB9F6E7}.Release-AVX|x64.Build.0 = Release-AVX|x64 - {186BAEF6-CF24-42C1-8CE3-25590CB9F6E7}.Release-SSE2|Win32.ActiveCfg = Release-SSE2|Win32 - {186BAEF6-CF24-42C1-8CE3-25590CB9F6E7}.Release-SSE2|Win32.Build.0 = Release-SSE2|Win32 - {186BAEF6-CF24-42C1-8CE3-25590CB9F6E7}.Release-SSE2|x64.ActiveCfg = Release|x64 - {8BB067C4-7135-4643-863C-49C520BEEA01}.Debug|Win32.ActiveCfg = Debug|Win32 - {8BB067C4-7135-4643-863C-49C520BEEA01}.Debug|Win32.Build.0 = Debug|Win32 - {8BB067C4-7135-4643-863C-49C520BEEA01}.Debug|x64.ActiveCfg = Debug|x64 - {8BB067C4-7135-4643-863C-49C520BEEA01}.Debug|x64.Build.0 = Debug|x64 - {8BB067C4-7135-4643-863C-49C520BEEA01}.Release|Win32.ActiveCfg = Release|Win32 - {8BB067C4-7135-4643-863C-49C520BEEA01}.Release|Win32.Build.0 = Release|Win32 - {8BB067C4-7135-4643-863C-49C520BEEA01}.Release|x64.ActiveCfg = Release|x64 - {8BB067C4-7135-4643-863C-49C520BEEA01}.Release|x64.Build.0 = Release|x64 - {8BB067C4-7135-4643-863C-49C520BEEA01}.Release-AVX|Win32.ActiveCfg = Release|Win32 - {8BB067C4-7135-4643-863C-49C520BEEA01}.Release-AVX|x64.ActiveCfg = Release-AVX|x64 - {8BB067C4-7135-4643-863C-49C520BEEA01}.Release-AVX|x64.Build.0 = Release-AVX|x64 - {8BB067C4-7135-4643-863C-49C520BEEA01}.Release-SSE2|Win32.ActiveCfg = Release-SSE2|Win32 - {8BB067C4-7135-4643-863C-49C520BEEA01}.Release-SSE2|Win32.Build.0 = Release-SSE2|Win32 - {8BB067C4-7135-4643-863C-49C520BEEA01}.Release-SSE2|x64.ActiveCfg = Release|x64 - {72793DF1-D4AF-4AA0-A606-7B51ED2A3F5C}.Debug|Win32.ActiveCfg = Debug|Win32 - {72793DF1-D4AF-4AA0-A606-7B51ED2A3F5C}.Debug|Win32.Build.0 = Debug|Win32 - {72793DF1-D4AF-4AA0-A606-7B51ED2A3F5C}.Debug|x64.ActiveCfg = Debug|x64 - {72793DF1-D4AF-4AA0-A606-7B51ED2A3F5C}.Debug|x64.Build.0 = Debug|x64 - {72793DF1-D4AF-4AA0-A606-7B51ED2A3F5C}.Release|Win32.ActiveCfg = Release|Win32 - {72793DF1-D4AF-4AA0-A606-7B51ED2A3F5C}.Release|Win32.Build.0 = Release|Win32 - {72793DF1-D4AF-4AA0-A606-7B51ED2A3F5C}.Release|x64.ActiveCfg = Release|x64 - {72793DF1-D4AF-4AA0-A606-7B51ED2A3F5C}.Release|x64.Build.0 = Release|x64 - {72793DF1-D4AF-4AA0-A606-7B51ED2A3F5C}.Release-AVX|Win32.ActiveCfg = Release|Win32 - {72793DF1-D4AF-4AA0-A606-7B51ED2A3F5C}.Release-AVX|x64.ActiveCfg = Release-AVX|x64 - {72793DF1-D4AF-4AA0-A606-7B51ED2A3F5C}.Release-AVX|x64.Build.0 = Release-AVX|x64 - {72793DF1-D4AF-4AA0-A606-7B51ED2A3F5C}.Release-SSE2|Win32.ActiveCfg = Release-SSE2|Win32 - {72793DF1-D4AF-4AA0-A606-7B51ED2A3F5C}.Release-SSE2|Win32.Build.0 = Release-SSE2|Win32 - {72793DF1-D4AF-4AA0-A606-7B51ED2A3F5C}.Release-SSE2|x64.ActiveCfg = Release|x64 - {851C772C-D7C2-4EE3-A90C-23386F0E9897}.Debug|Win32.ActiveCfg = Debug|Win32 - {851C772C-D7C2-4EE3-A90C-23386F0E9897}.Debug|Win32.Build.0 = Debug|Win32 - {851C772C-D7C2-4EE3-A90C-23386F0E9897}.Debug|x64.ActiveCfg = Debug|x64 - {851C772C-D7C2-4EE3-A90C-23386F0E9897}.Debug|x64.Build.0 = Debug|x64 - {851C772C-D7C2-4EE3-A90C-23386F0E9897}.Release|Win32.ActiveCfg = Release|Win32 - {851C772C-D7C2-4EE3-A90C-23386F0E9897}.Release|Win32.Build.0 = Release|Win32 - {851C772C-D7C2-4EE3-A90C-23386F0E9897}.Release|x64.ActiveCfg = Release|x64 - {851C772C-D7C2-4EE3-A90C-23386F0E9897}.Release|x64.Build.0 = Release|x64 - {851C772C-D7C2-4EE3-A90C-23386F0E9897}.Release-AVX|Win32.ActiveCfg = Release|Win32 - {851C772C-D7C2-4EE3-A90C-23386F0E9897}.Release-AVX|x64.ActiveCfg = Release-AVX|x64 - {851C772C-D7C2-4EE3-A90C-23386F0E9897}.Release-AVX|x64.Build.0 = Release-AVX|x64 - {851C772C-D7C2-4EE3-A90C-23386F0E9897}.Release-SSE2|Win32.ActiveCfg = Release-SSE2|Win32 - {851C772C-D7C2-4EE3-A90C-23386F0E9897}.Release-SSE2|Win32.Build.0 = Release-SSE2|Win32 - {851C772C-D7C2-4EE3-A90C-23386F0E9897}.Release-SSE2|x64.ActiveCfg = Release|x64 - {3B6BB403-FC72-45FF-A431-9295A1AEB7A3}.Debug|Win32.ActiveCfg = Debug|Win32 - {3B6BB403-FC72-45FF-A431-9295A1AEB7A3}.Debug|x64.ActiveCfg = Debug|x64 - {3B6BB403-FC72-45FF-A431-9295A1AEB7A3}.Release|Win32.ActiveCfg = Release|Win32 - {3B6BB403-FC72-45FF-A431-9295A1AEB7A3}.Release|x64.ActiveCfg = Release|x64 - {3B6BB403-FC72-45FF-A431-9295A1AEB7A3}.Release-AVX|Win32.ActiveCfg = Release|Win32 - {3B6BB403-FC72-45FF-A431-9295A1AEB7A3}.Release-AVX|x64.ActiveCfg = Release-AVX|x64 - {3B6BB403-FC72-45FF-A431-9295A1AEB7A3}.Release-SSE2|Win32.ActiveCfg = Release-SSE2|Win32 - {3B6BB403-FC72-45FF-A431-9295A1AEB7A3}.Release-SSE2|x64.ActiveCfg = Release|x64 - {C6D9B754-11EB-4FC3-8683-593B53E9AD1F}.Debug|Win32.ActiveCfg = Debug|Win32 - {C6D9B754-11EB-4FC3-8683-593B53E9AD1F}.Debug|Win32.Build.0 = Debug|Win32 - {C6D9B754-11EB-4FC3-8683-593B53E9AD1F}.Debug|x64.ActiveCfg = Debug|x64 - {C6D9B754-11EB-4FC3-8683-593B53E9AD1F}.Debug|x64.Build.0 = Debug|x64 - {C6D9B754-11EB-4FC3-8683-593B53E9AD1F}.Release|Win32.ActiveCfg = Release|Win32 - {C6D9B754-11EB-4FC3-8683-593B53E9AD1F}.Release|Win32.Build.0 = Release|Win32 - {C6D9B754-11EB-4FC3-8683-593B53E9AD1F}.Release|x64.ActiveCfg = Release|x64 - {C6D9B754-11EB-4FC3-8683-593B53E9AD1F}.Release|x64.Build.0 = Release|x64 - {C6D9B754-11EB-4FC3-8683-593B53E9AD1F}.Release-AVX|Win32.ActiveCfg = Release|Win32 - {C6D9B754-11EB-4FC3-8683-593B53E9AD1F}.Release-AVX|x64.ActiveCfg = Release-AVX|x64 - {C6D9B754-11EB-4FC3-8683-593B53E9AD1F}.Release-AVX|x64.Build.0 = Release-AVX|x64 - {C6D9B754-11EB-4FC3-8683-593B53E9AD1F}.Release-SSE2|Win32.ActiveCfg = Release-SSE2|Win32 - {C6D9B754-11EB-4FC3-8683-593B53E9AD1F}.Release-SSE2|Win32.Build.0 = Release-SSE2|Win32 - {C6D9B754-11EB-4FC3-8683-593B53E9AD1F}.Release-SSE2|x64.ActiveCfg = Release|x64 - {C6D9B754-11EB-4FC3-8683-593B2377D043}.Debug|Win32.ActiveCfg = Debug|Win32 - {C6D9B754-11EB-4FC3-8683-593B2377D043}.Debug|Win32.Build.0 = Debug|Win32 - {C6D9B754-11EB-4FC3-8683-593B2377D043}.Debug|x64.ActiveCfg = Debug|x64 - {C6D9B754-11EB-4FC3-8683-593B2377D043}.Debug|x64.Build.0 = Debug|x64 - {C6D9B754-11EB-4FC3-8683-593B2377D043}.Release|Win32.ActiveCfg = Release|Win32 - {C6D9B754-11EB-4FC3-8683-593B2377D043}.Release|Win32.Build.0 = Release|Win32 - {C6D9B754-11EB-4FC3-8683-593B2377D043}.Release|x64.ActiveCfg = Release|x64 - {C6D9B754-11EB-4FC3-8683-593B2377D043}.Release|x64.Build.0 = Release|x64 - {C6D9B754-11EB-4FC3-8683-593B2377D043}.Release-AVX|Win32.ActiveCfg = Release|Win32 - {C6D9B754-11EB-4FC3-8683-593B2377D043}.Release-AVX|x64.ActiveCfg = Release-AVX|x64 - {C6D9B754-11EB-4FC3-8683-593B2377D043}.Release-AVX|x64.Build.0 = Release-AVX|x64 - {C6D9B754-11EB-4FC3-8683-593B2377D043}.Release-SSE2|Win32.ActiveCfg = Release-SSE2|Win32 - {C6D9B754-11EB-4FC3-8683-593B2377D043}.Release-SSE2|Win32.Build.0 = Release-SSE2|Win32 - {C6D9B754-11EB-4FC3-8683-593B2377D043}.Release-SSE2|x64.ActiveCfg = Release|x64 - {C6D9B754-11EB-4FC3-8683-593BFD58C904}.Debug|Win32.ActiveCfg = Debug|Win32 - {C6D9B754-11EB-4FC3-8683-593BFD58C904}.Debug|Win32.Build.0 = Debug|Win32 - {C6D9B754-11EB-4FC3-8683-593BFD58C904}.Debug|x64.ActiveCfg = Debug|x64 - {C6D9B754-11EB-4FC3-8683-593BFD58C904}.Debug|x64.Build.0 = Debug|x64 - {C6D9B754-11EB-4FC3-8683-593BFD58C904}.Release|Win32.ActiveCfg = Release|Win32 - {C6D9B754-11EB-4FC3-8683-593BFD58C904}.Release|Win32.Build.0 = Release|Win32 - {C6D9B754-11EB-4FC3-8683-593BFD58C904}.Release|x64.ActiveCfg = Release|x64 - {C6D9B754-11EB-4FC3-8683-593BFD58C904}.Release|x64.Build.0 = Release|x64 - {C6D9B754-11EB-4FC3-8683-593BFD58C904}.Release-AVX|Win32.ActiveCfg = Release|Win32 - {C6D9B754-11EB-4FC3-8683-593BFD58C904}.Release-AVX|x64.ActiveCfg = Release-AVX|x64 - {C6D9B754-11EB-4FC3-8683-593BFD58C904}.Release-AVX|x64.Build.0 = Release-AVX|x64 - {C6D9B754-11EB-4FC3-8683-593BFD58C904}.Release-SSE2|Win32.ActiveCfg = Release-SSE2|Win32 - {C6D9B754-11EB-4FC3-8683-593BFD58C904}.Release-SSE2|Win32.Build.0 = Release-SSE2|Win32 - {C6D9B754-11EB-4FC3-8683-593BFD58C904}.Release-SSE2|x64.ActiveCfg = Release|x64 - {10B193D4-E27B-4438-A825-BFB3D2B4C74D}.Debug|Win32.ActiveCfg = Debug|Win32 - {10B193D4-E27B-4438-A825-BFB3D2B4C74D}.Debug|Win32.Build.0 = Debug|Win32 - {10B193D4-E27B-4438-A825-BFB3D2B4C74D}.Debug|x64.ActiveCfg = Debug|x64 - {10B193D4-E27B-4438-A825-BFB3D2B4C74D}.Debug|x64.Build.0 = Debug|x64 - {10B193D4-E27B-4438-A825-BFB3D2B4C74D}.Release|Win32.ActiveCfg = Release|Win32 - {10B193D4-E27B-4438-A825-BFB3D2B4C74D}.Release|Win32.Build.0 = Release|Win32 - {10B193D4-E27B-4438-A825-BFB3D2B4C74D}.Release|x64.ActiveCfg = Release|x64 - {10B193D4-E27B-4438-A825-BFB3D2B4C74D}.Release|x64.Build.0 = Release|x64 - {10B193D4-E27B-4438-A825-BFB3D2B4C74D}.Release-AVX|Win32.ActiveCfg = Release|Win32 - {10B193D4-E27B-4438-A825-BFB3D2B4C74D}.Release-AVX|x64.ActiveCfg = Release-AVX|x64 - {10B193D4-E27B-4438-A825-BFB3D2B4C74D}.Release-AVX|x64.Build.0 = Release-AVX|x64 - {10B193D4-E27B-4438-A825-BFB3D2B4C74D}.Release-SSE2|Win32.ActiveCfg = Release-SSE2|Win32 - {10B193D4-E27B-4438-A825-BFB3D2B4C74D}.Release-SSE2|Win32.Build.0 = Release-SSE2|Win32 - {10B193D4-E27B-4438-A825-BFB3D2B4C74D}.Release-SSE2|x64.ActiveCfg = Release|x64 - {35A2DC31-84BC-4F7A-9C93-1D072432AD79}.Debug|Win32.ActiveCfg = Debug|Win32 - {35A2DC31-84BC-4F7A-9C93-1D072432AD79}.Debug|x64.ActiveCfg = Debug|x64 - {35A2DC31-84BC-4F7A-9C93-1D072432AD79}.Release|Win32.ActiveCfg = Release|Win32 - {35A2DC31-84BC-4F7A-9C93-1D072432AD79}.Release|x64.ActiveCfg = Release|x64 - {35A2DC31-84BC-4F7A-9C93-1D072432AD79}.Release-AVX|Win32.ActiveCfg = Release|Win32 - {35A2DC31-84BC-4F7A-9C93-1D072432AD79}.Release-AVX|x64.ActiveCfg = Release-AVX|x64 - {35A2DC31-84BC-4F7A-9C93-1D072432AD79}.Release-SSE2|Win32.ActiveCfg = Release-SSE2|Win32 - {35A2DC31-84BC-4F7A-9C93-1D072432AD79}.Release-SSE2|x64.ActiveCfg = Release|x64 - {7DF42126-D237-41D3-9ABE-A3ACC8BAC56E}.Debug|Win32.ActiveCfg = Debug|Win32 - {7DF42126-D237-41D3-9ABE-A3ACC8BAC56E}.Debug|Win32.Build.0 = Debug|Win32 - {7DF42126-D237-41D3-9ABE-A3ACC8BAC56E}.Debug|x64.ActiveCfg = Debug|x64 - {7DF42126-D237-41D3-9ABE-A3ACC8BAC56E}.Debug|x64.Build.0 = Debug|x64 - {7DF42126-D237-41D3-9ABE-A3ACC8BAC56E}.Release|Win32.ActiveCfg = Release|Win32 - {7DF42126-D237-41D3-9ABE-A3ACC8BAC56E}.Release|Win32.Build.0 = Release|Win32 - {7DF42126-D237-41D3-9ABE-A3ACC8BAC56E}.Release|x64.ActiveCfg = Release|x64 - {7DF42126-D237-41D3-9ABE-A3ACC8BAC56E}.Release|x64.Build.0 = Release|x64 - {7DF42126-D237-41D3-9ABE-A3ACC8BAC56E}.Release-AVX|Win32.ActiveCfg = Release|Win32 - {7DF42126-D237-41D3-9ABE-A3ACC8BAC56E}.Release-AVX|x64.ActiveCfg = Release-AVX|x64 - {7DF42126-D237-41D3-9ABE-A3ACC8BAC56E}.Release-AVX|x64.Build.0 = Release-AVX|x64 - {7DF42126-D237-41D3-9ABE-A3ACC8BAC56E}.Release-SSE2|Win32.ActiveCfg = Release-SSE2|Win32 - {7DF42126-D237-41D3-9ABE-A3ACC8BAC56E}.Release-SSE2|Win32.Build.0 = Release-SSE2|Win32 - {7DF42126-D237-41D3-9ABE-A3ACC8BAC56E}.Release-SSE2|x64.ActiveCfg = Release|x64 - {C46B9A53-86D8-4B7F-AB15-B2C04518A195}.Debug|Win32.ActiveCfg = Debug|Win32 - {C46B9A53-86D8-4B7F-AB15-B2C04518A195}.Debug|Win32.Build.0 = Debug|Win32 - {C46B9A53-86D8-4B7F-AB15-B2C04518A195}.Debug|x64.ActiveCfg = Debug|x64 - {C46B9A53-86D8-4B7F-AB15-B2C04518A195}.Debug|x64.Build.0 = Debug|x64 - {C46B9A53-86D8-4B7F-AB15-B2C04518A195}.Release|Win32.ActiveCfg = Release|Win32 - {C46B9A53-86D8-4B7F-AB15-B2C04518A195}.Release|Win32.Build.0 = Release|Win32 - {C46B9A53-86D8-4B7F-AB15-B2C04518A195}.Release|x64.ActiveCfg = Release|x64 - {C46B9A53-86D8-4B7F-AB15-B2C04518A195}.Release|x64.Build.0 = Release|x64 - {C46B9A53-86D8-4B7F-AB15-B2C04518A195}.Release-AVX|Win32.ActiveCfg = Release|Win32 - {C46B9A53-86D8-4B7F-AB15-B2C04518A195}.Release-AVX|x64.ActiveCfg = Release-AVX|x64 - {C46B9A53-86D8-4B7F-AB15-B2C04518A195}.Release-AVX|x64.Build.0 = Release-AVX|x64 - {C46B9A53-86D8-4B7F-AB15-B2C04518A195}.Release-SSE2|Win32.ActiveCfg = Release-SSE2|Win32 - {C46B9A53-86D8-4B7F-AB15-B2C04518A195}.Release-SSE2|Win32.Build.0 = Release-SSE2|Win32 - {C46B9A53-86D8-4B7F-AB15-B2C04518A195}.Release-SSE2|x64.ActiveCfg = Release|x64 - {76ADDB29-9C6A-442C-9BA9-764C050F75DD}.Debug|Win32.ActiveCfg = Debug|Win32 - {76ADDB29-9C6A-442C-9BA9-764C050F75DD}.Debug|Win32.Build.0 = Debug|Win32 - {76ADDB29-9C6A-442C-9BA9-764C050F75DD}.Debug|x64.ActiveCfg = Debug|x64 - {76ADDB29-9C6A-442C-9BA9-764C050F75DD}.Debug|x64.Build.0 = Debug|x64 - {76ADDB29-9C6A-442C-9BA9-764C050F75DD}.Release|Win32.ActiveCfg = Release|Win32 - {76ADDB29-9C6A-442C-9BA9-764C050F75DD}.Release|Win32.Build.0 = Release|Win32 - {76ADDB29-9C6A-442C-9BA9-764C050F75DD}.Release|x64.ActiveCfg = Release|x64 - {76ADDB29-9C6A-442C-9BA9-764C050F75DD}.Release|x64.Build.0 = Release|x64 - {76ADDB29-9C6A-442C-9BA9-764C050F75DD}.Release-AVX|Win32.ActiveCfg = Release|Win32 - {76ADDB29-9C6A-442C-9BA9-764C050F75DD}.Release-AVX|x64.ActiveCfg = Release-AVX|x64 - {76ADDB29-9C6A-442C-9BA9-764C050F75DD}.Release-AVX|x64.Build.0 = Release-AVX|x64 - {76ADDB29-9C6A-442C-9BA9-764C050F75DD}.Release-SSE2|Win32.ActiveCfg = Release-SSE2|Win32 - {76ADDB29-9C6A-442C-9BA9-764C050F75DD}.Release-SSE2|Win32.Build.0 = Release-SSE2|Win32 - {76ADDB29-9C6A-442C-9BA9-764C050F75DD}.Release-SSE2|x64.ActiveCfg = Release|x64 - {9EDB5C0F-BFD0-4A59-BB93-F06A52BB0128}.Debug|Win32.ActiveCfg = Debug|Win32 - {9EDB5C0F-BFD0-4A59-BB93-F06A52BB0128}.Debug|Win32.Build.0 = Debug|Win32 - {9EDB5C0F-BFD0-4A59-BB93-F06A52BB0128}.Debug|x64.ActiveCfg = Debug|x64 - {9EDB5C0F-BFD0-4A59-BB93-F06A52BB0128}.Debug|x64.Build.0 = Debug|x64 - {9EDB5C0F-BFD0-4A59-BB93-F06A52BB0128}.Release|Win32.ActiveCfg = Release|Win32 - {9EDB5C0F-BFD0-4A59-BB93-F06A52BB0128}.Release|Win32.Build.0 = Release|Win32 - {9EDB5C0F-BFD0-4A59-BB93-F06A52BB0128}.Release|x64.ActiveCfg = Release|x64 - {9EDB5C0F-BFD0-4A59-BB93-F06A52BB0128}.Release|x64.Build.0 = Release|x64 - {9EDB5C0F-BFD0-4A59-BB93-F06A52BB0128}.Release-AVX|Win32.ActiveCfg = Release|Win32 - {9EDB5C0F-BFD0-4A59-BB93-F06A52BB0128}.Release-AVX|x64.ActiveCfg = Release-AVX|x64 - {9EDB5C0F-BFD0-4A59-BB93-F06A52BB0128}.Release-AVX|x64.Build.0 = Release-AVX|x64 - {9EDB5C0F-BFD0-4A59-BB93-F06A52BB0128}.Release-SSE2|Win32.ActiveCfg = Release-SSE2|Win32 - {9EDB5C0F-BFD0-4A59-BB93-F06A52BB0128}.Release-SSE2|Win32.Build.0 = Release-SSE2|Win32 - {9EDB5C0F-BFD0-4A59-BB93-F06A52BB0128}.Release-SSE2|x64.ActiveCfg = Release|x64 - {39C65232-04FB-4622-8283-34829739887C}.Debug|Win32.ActiveCfg = Release|Win32 - {39C65232-04FB-4622-8283-34829739887C}.Debug|Win32.Build.0 = Release|Win32 - {39C65232-04FB-4622-8283-34829739887C}.Debug|x64.ActiveCfg = Release|x64 - {39C65232-04FB-4622-8283-34829739887C}.Debug|x64.Build.0 = Release|x64 - {39C65232-04FB-4622-8283-34829739887C}.Release|Win32.ActiveCfg = Release|Win32 - {39C65232-04FB-4622-8283-34829739887C}.Release|Win32.Build.0 = Release|Win32 - {39C65232-04FB-4622-8283-34829739887C}.Release|x64.ActiveCfg = Release|x64 - {39C65232-04FB-4622-8283-34829739887C}.Release|x64.Build.0 = Release|x64 - {39C65232-04FB-4622-8283-34829739887C}.Release-AVX|Win32.ActiveCfg = Release|Win32 - {39C65232-04FB-4622-8283-34829739887C}.Release-AVX|x64.ActiveCfg = Release|x64 - {39C65232-04FB-4622-8283-34829739887C}.Release-AVX|x64.Build.0 = Release|x64 - {39C65232-04FB-4622-8283-34829739887C}.Release-SSE2|Win32.ActiveCfg = Release|Win32 - {39C65232-04FB-4622-8283-34829739887C}.Release-SSE2|Win32.Build.0 = Release|Win32 - {39C65232-04FB-4622-8283-34829739887C}.Release-SSE2|x64.ActiveCfg = Release|x64 - {9801D5FF-C1E0-46C5-A73E-47DEECE99DDB}.Debug|Win32.ActiveCfg = Release|Win32 - {9801D5FF-C1E0-46C5-A73E-47DEECE99DDB}.Debug|Win32.Build.0 = Release|Win32 - {9801D5FF-C1E0-46C5-A73E-47DEECE99DDB}.Debug|x64.ActiveCfg = Release|x64 - {9801D5FF-C1E0-46C5-A73E-47DEECE99DDB}.Debug|x64.Build.0 = Release|x64 - {9801D5FF-C1E0-46C5-A73E-47DEECE99DDB}.Release|Win32.ActiveCfg = Release|Win32 - {9801D5FF-C1E0-46C5-A73E-47DEECE99DDB}.Release|Win32.Build.0 = Release|Win32 - {9801D5FF-C1E0-46C5-A73E-47DEECE99DDB}.Release|x64.ActiveCfg = Release|x64 - {9801D5FF-C1E0-46C5-A73E-47DEECE99DDB}.Release|x64.Build.0 = Release|x64 - {9801D5FF-C1E0-46C5-A73E-47DEECE99DDB}.Release-AVX|Win32.ActiveCfg = Release|Win32 - {9801D5FF-C1E0-46C5-A73E-47DEECE99DDB}.Release-AVX|x64.ActiveCfg = Release|x64 - {9801D5FF-C1E0-46C5-A73E-47DEECE99DDB}.Release-AVX|x64.Build.0 = Release|x64 - {9801D5FF-C1E0-46C5-A73E-47DEECE99DDB}.Release-SSE2|Win32.ActiveCfg = Release|Win32 - {9801D5FF-C1E0-46C5-A73E-47DEECE99DDB}.Release-SSE2|Win32.Build.0 = Release|Win32 - {9801D5FF-C1E0-46C5-A73E-47DEECE99DDB}.Release-SSE2|x64.ActiveCfg = Release|x64 - {86D92BC4-4C57-42D1-9F63-26ABF811715B}.Debug|Win32.ActiveCfg = Debug|Win32 - {86D92BC4-4C57-42D1-9F63-26ABF811715B}.Debug|x64.ActiveCfg = Debug|x64 - {86D92BC4-4C57-42D1-9F63-26ABF811715B}.Release|Win32.ActiveCfg = Release|Win32 - {86D92BC4-4C57-42D1-9F63-26ABF811715B}.Release|x64.ActiveCfg = Release|x64 - {86D92BC4-4C57-42D1-9F63-26ABF811715B}.Release-AVX|Win32.ActiveCfg = Release|Win32 - {86D92BC4-4C57-42D1-9F63-26ABF811715B}.Release-AVX|x64.ActiveCfg = Release-AVX|x64 - {86D92BC4-4C57-42D1-9F63-26ABF811715B}.Release-SSE2|Win32.ActiveCfg = Release-SSE2|Win32 - {86D92BC4-4C57-42D1-9F63-26ABF811715B}.Release-SSE2|x64.ActiveCfg = Release|x64 - {7F9DA615-40A3-43A0-B8BB-528698DDE6E5}.Debug|Win32.ActiveCfg = Debug|Win32 - {7F9DA615-40A3-43A0-B8BB-528698DDE6E5}.Debug|Win32.Build.0 = Debug|Win32 - {7F9DA615-40A3-43A0-B8BB-528698DDE6E5}.Debug|x64.ActiveCfg = Debug|x64 - {7F9DA615-40A3-43A0-B8BB-528698DDE6E5}.Debug|x64.Build.0 = Debug|x64 - {7F9DA615-40A3-43A0-B8BB-528698DDE6E5}.Release|Win32.ActiveCfg = Release|Win32 - {7F9DA615-40A3-43A0-B8BB-528698DDE6E5}.Release|Win32.Build.0 = Release|Win32 - {7F9DA615-40A3-43A0-B8BB-528698DDE6E5}.Release|x64.ActiveCfg = Release|x64 - {7F9DA615-40A3-43A0-B8BB-528698DDE6E5}.Release|x64.Build.0 = Release|x64 - {7F9DA615-40A3-43A0-B8BB-528698DDE6E5}.Release-AVX|Win32.ActiveCfg = Release|Win32 - {7F9DA615-40A3-43A0-B8BB-528698DDE6E5}.Release-AVX|x64.ActiveCfg = Release-AVX|x64 - {7F9DA615-40A3-43A0-B8BB-528698DDE6E5}.Release-AVX|x64.Build.0 = Release-AVX|x64 - {7F9DA615-40A3-43A0-B8BB-528698DDE6E5}.Release-SSE2|Win32.ActiveCfg = Release-SSE2|Win32 - {7F9DA615-40A3-43A0-B8BB-528698DDE6E5}.Release-SSE2|Win32.Build.0 = Release-SSE2|Win32 - {7F9DA615-40A3-43A0-B8BB-528698DDE6E5}.Release-SSE2|x64.ActiveCfg = Release|x64 - {F0304A28-E1C7-4F4F-BE1F-DF57936C9664}.Debug|Win32.ActiveCfg = Debug|Win32 - {F0304A28-E1C7-4F4F-BE1F-DF57936C9664}.Debug|Win32.Build.0 = Debug|Win32 - {F0304A28-E1C7-4F4F-BE1F-DF57936C9664}.Debug|x64.ActiveCfg = Debug|x64 - {F0304A28-E1C7-4F4F-BE1F-DF57936C9664}.Debug|x64.Build.0 = Debug|x64 - {F0304A28-E1C7-4F4F-BE1F-DF57936C9664}.Release|Win32.ActiveCfg = Release|Win32 - {F0304A28-E1C7-4F4F-BE1F-DF57936C9664}.Release|Win32.Build.0 = Release|Win32 - {F0304A28-E1C7-4F4F-BE1F-DF57936C9664}.Release|x64.ActiveCfg = Release|x64 - {F0304A28-E1C7-4F4F-BE1F-DF57936C9664}.Release|x64.Build.0 = Release|x64 - {F0304A28-E1C7-4F4F-BE1F-DF57936C9664}.Release-AVX|Win32.ActiveCfg = Release|Win32 - {F0304A28-E1C7-4F4F-BE1F-DF57936C9664}.Release-AVX|x64.ActiveCfg = Release-AVX|x64 - {F0304A28-E1C7-4F4F-BE1F-DF57936C9664}.Release-AVX|x64.Build.0 = Release-AVX|x64 - {F0304A28-E1C7-4F4F-BE1F-DF57936C9664}.Release-SSE2|Win32.ActiveCfg = Release-SSE2|Win32 - {F0304A28-E1C7-4F4F-BE1F-DF57936C9664}.Release-SSE2|Win32.Build.0 = Release-SSE2|Win32 - {F0304A28-E1C7-4F4F-BE1F-DF57936C9664}.Release-SSE2|x64.ActiveCfg = Release|x64 - {B1E68128-84D7-4525-A3C1-E6C1077F2239}.Debug|Win32.ActiveCfg = Debug|Win32 - {B1E68128-84D7-4525-A3C1-E6C1077F2239}.Debug|Win32.Build.0 = Debug|Win32 - {B1E68128-84D7-4525-A3C1-E6C1077F2239}.Debug|x64.ActiveCfg = Debug|x64 - {B1E68128-84D7-4525-A3C1-E6C1077F2239}.Debug|x64.Build.0 = Debug|x64 - {B1E68128-84D7-4525-A3C1-E6C1077F2239}.Release|Win32.ActiveCfg = Release|Win32 - {B1E68128-84D7-4525-A3C1-E6C1077F2239}.Release|Win32.Build.0 = Release|Win32 - {B1E68128-84D7-4525-A3C1-E6C1077F2239}.Release|x64.ActiveCfg = Release|x64 - {B1E68128-84D7-4525-A3C1-E6C1077F2239}.Release|x64.Build.0 = Release|x64 - {B1E68128-84D7-4525-A3C1-E6C1077F2239}.Release-AVX|Win32.ActiveCfg = Release|Win32 - {B1E68128-84D7-4525-A3C1-E6C1077F2239}.Release-AVX|x64.ActiveCfg = Release-AVX|x64 - {B1E68128-84D7-4525-A3C1-E6C1077F2239}.Release-AVX|x64.Build.0 = Release-AVX|x64 - {B1E68128-84D7-4525-A3C1-E6C1077F2239}.Release-SSE2|Win32.ActiveCfg = Release-SSE2|Win32 - {B1E68128-84D7-4525-A3C1-E6C1077F2239}.Release-SSE2|Win32.Build.0 = Release-SSE2|Win32 - {B1E68128-84D7-4525-A3C1-E6C1077F2239}.Release-SSE2|x64.ActiveCfg = Release|x64 - {0C227B07-1830-4C5B-8D4E-2DEFFFD2792D}.Debug|Win32.ActiveCfg = Debug|Win32 - {0C227B07-1830-4C5B-8D4E-2DEFFFD2792D}.Debug|Win32.Build.0 = Debug|Win32 - {0C227B07-1830-4C5B-8D4E-2DEFFFD2792D}.Debug|x64.ActiveCfg = Debug|x64 - {0C227B07-1830-4C5B-8D4E-2DEFFFD2792D}.Debug|x64.Build.0 = Debug|x64 - {0C227B07-1830-4C5B-8D4E-2DEFFFD2792D}.Release|Win32.ActiveCfg = Release|Win32 - {0C227B07-1830-4C5B-8D4E-2DEFFFD2792D}.Release|Win32.Build.0 = Release|Win32 - {0C227B07-1830-4C5B-8D4E-2DEFFFD2792D}.Release|x64.ActiveCfg = Release|x64 - {0C227B07-1830-4C5B-8D4E-2DEFFFD2792D}.Release|x64.Build.0 = Release|x64 - {0C227B07-1830-4C5B-8D4E-2DEFFFD2792D}.Release-AVX|Win32.ActiveCfg = Release|Win32 - {0C227B07-1830-4C5B-8D4E-2DEFFFD2792D}.Release-AVX|x64.ActiveCfg = Release-AVX|x64 - {0C227B07-1830-4C5B-8D4E-2DEFFFD2792D}.Release-AVX|x64.Build.0 = Release-AVX|x64 - {0C227B07-1830-4C5B-8D4E-2DEFFFD2792D}.Release-SSE2|Win32.ActiveCfg = Release-SSE2|Win32 - {0C227B07-1830-4C5B-8D4E-2DEFFFD2792D}.Release-SSE2|Win32.Build.0 = Release-SSE2|Win32 - {0C227B07-1830-4C5B-8D4E-2DEFFFD2792D}.Release-SSE2|x64.ActiveCfg = Release|x64 - {D870A978-8130-4D1D-9FB2-3EE2028D2C50}.Debug|Win32.ActiveCfg = Debug|Win32 - {D870A978-8130-4D1D-9FB2-3EE2028D2C50}.Debug|Win32.Build.0 = Debug|Win32 - {D870A978-8130-4D1D-9FB2-3EE2028D2C50}.Debug|x64.ActiveCfg = Debug|x64 - {D870A978-8130-4D1D-9FB2-3EE2028D2C50}.Debug|x64.Build.0 = Debug|x64 - {D870A978-8130-4D1D-9FB2-3EE2028D2C50}.Release|Win32.ActiveCfg = Release|Win32 - {D870A978-8130-4D1D-9FB2-3EE2028D2C50}.Release|Win32.Build.0 = Release|Win32 - {D870A978-8130-4D1D-9FB2-3EE2028D2C50}.Release|x64.ActiveCfg = Release|x64 - {D870A978-8130-4D1D-9FB2-3EE2028D2C50}.Release|x64.Build.0 = Release|x64 - {D870A978-8130-4D1D-9FB2-3EE2028D2C50}.Release-AVX|Win32.ActiveCfg = Release|Win32 - {D870A978-8130-4D1D-9FB2-3EE2028D2C50}.Release-AVX|x64.ActiveCfg = Release-AVX|x64 - {D870A978-8130-4D1D-9FB2-3EE2028D2C50}.Release-AVX|x64.Build.0 = Release-AVX|x64 - {D870A978-8130-4D1D-9FB2-3EE2028D2C50}.Release-SSE2|Win32.ActiveCfg = Release-SSE2|Win32 - {D870A978-8130-4D1D-9FB2-3EE2028D2C50}.Release-SSE2|Win32.Build.0 = Release-SSE2|Win32 - {D870A978-8130-4D1D-9FB2-3EE2028D2C50}.Release-SSE2|x64.ActiveCfg = Release|x64 - {E7A73E97-7106-4D4A-98BA-AA43FBD19DB4}.Debug|Win32.ActiveCfg = Debug|Win32 - {E7A73E97-7106-4D4A-98BA-AA43FBD19DB4}.Debug|Win32.Build.0 = Debug|Win32 - {E7A73E97-7106-4D4A-98BA-AA43FBD19DB4}.Debug|x64.ActiveCfg = Debug|x64 - {E7A73E97-7106-4D4A-98BA-AA43FBD19DB4}.Debug|x64.Build.0 = Debug|x64 - {E7A73E97-7106-4D4A-98BA-AA43FBD19DB4}.Release|Win32.ActiveCfg = Release|Win32 - {E7A73E97-7106-4D4A-98BA-AA43FBD19DB4}.Release|Win32.Build.0 = Release|Win32 - {E7A73E97-7106-4D4A-98BA-AA43FBD19DB4}.Release|x64.ActiveCfg = Release|x64 - {E7A73E97-7106-4D4A-98BA-AA43FBD19DB4}.Release|x64.Build.0 = Release|x64 - {E7A73E97-7106-4D4A-98BA-AA43FBD19DB4}.Release-AVX|Win32.ActiveCfg = Release|Win32 - {E7A73E97-7106-4D4A-98BA-AA43FBD19DB4}.Release-AVX|x64.ActiveCfg = Release-AVX|x64 - {E7A73E97-7106-4D4A-98BA-AA43FBD19DB4}.Release-AVX|x64.Build.0 = Release-AVX|x64 - {E7A73E97-7106-4D4A-98BA-AA43FBD19DB4}.Release-SSE2|Win32.ActiveCfg = Release-SSE2|Win32 - {E7A73E97-7106-4D4A-98BA-AA43FBD19DB4}.Release-SSE2|Win32.Build.0 = Release-SSE2|Win32 - {E7A73E97-7106-4D4A-98BA-AA43FBD19DB4}.Release-SSE2|x64.ActiveCfg = Release|x64 - {37FDEA25-43CD-4AF0-A232-281E11851E75}.Debug|Win32.ActiveCfg = Debug|Win32 - {37FDEA25-43CD-4AF0-A232-281E11851E75}.Debug|Win32.Build.0 = Debug|Win32 - {37FDEA25-43CD-4AF0-A232-281E11851E75}.Debug|x64.ActiveCfg = Debug|x64 - {37FDEA25-43CD-4AF0-A232-281E11851E75}.Debug|x64.Build.0 = Debug|x64 - {37FDEA25-43CD-4AF0-A232-281E11851E75}.Release|Win32.ActiveCfg = Release|Win32 - {37FDEA25-43CD-4AF0-A232-281E11851E75}.Release|Win32.Build.0 = Release|Win32 - {37FDEA25-43CD-4AF0-A232-281E11851E75}.Release|x64.ActiveCfg = Release|x64 - {37FDEA25-43CD-4AF0-A232-281E11851E75}.Release|x64.Build.0 = Release|x64 - {37FDEA25-43CD-4AF0-A232-281E11851E75}.Release-AVX|Win32.ActiveCfg = Release|Win32 - {37FDEA25-43CD-4AF0-A232-281E11851E75}.Release-AVX|x64.ActiveCfg = Release|x64 - {37FDEA25-43CD-4AF0-A232-281E11851E75}.Release-AVX|x64.Build.0 = Release|x64 - {37FDEA25-43CD-4AF0-A232-281E11851E75}.Release-SSE2|Win32.ActiveCfg = Release|Win32 - {37FDEA25-43CD-4AF0-A232-281E11851E75}.Release-SSE2|Win32.Build.0 = Release|Win32 - {37FDEA25-43CD-4AF0-A232-281E11851E75}.Release-SSE2|x64.ActiveCfg = Release|x64 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection - GlobalSection(NestedProjects) = preSolution - {9BA806FC-C022-4ACF-A3F1-3EC8CAB45570} = {CB0679D3-62C5-4328-B49F-504E0AA9C65A} - {3780CCDE-4967-4C31-B6A3-3C2570BDD3E4} = {4178148C-8A0C-4EB0-ACD9-0E09676F2700} - {E1EA88AF-6B44-4225-B97B-B485FC9DB23E} = {4178148C-8A0C-4EB0-ACD9-0E09676F2700} - {186BAEF6-CF24-42C1-8CE3-25590CB9F6E7} = {4178148C-8A0C-4EB0-ACD9-0E09676F2700} - {8BB067C4-7135-4643-863C-49C520BEEA01} = {4178148C-8A0C-4EB0-ACD9-0E09676F2700} - {72793DF1-D4AF-4AA0-A606-7B51ED2A3F5C} = {4A043885-D401-40B2-9375-1C57136F03F6} - {851C772C-D7C2-4EE3-A90C-23386F0E9897} = {5319B36D-2906-4EAF-B623-B7C04F3CC2AD} - {3B6BB403-FC72-45FF-A431-9295A1AEB7A3} = {CB0679D3-62C5-4328-B49F-504E0AA9C65A} - {C6D9B754-11EB-4FC3-8683-593B53E9AD1F} = {5319B36D-2906-4EAF-B623-B7C04F3CC2AD} - {C6D9B754-11EB-4FC3-8683-593B2377D043} = {5319B36D-2906-4EAF-B623-B7C04F3CC2AD} - {C6D9B754-11EB-4FC3-8683-593BFD58C904} = {5319B36D-2906-4EAF-B623-B7C04F3CC2AD} - {10B193D4-E27B-4438-A825-BFB3D2B4C74D} = {31AFDB3C-8769-49DF-9C9E-2013E194D983} - {35A2DC31-84BC-4F7A-9C93-1D072432AD79} = {31AFDB3C-8769-49DF-9C9E-2013E194D983} - {7DF42126-D237-41D3-9ABE-A3ACC8BAC56E} = {30F7FB89-B9D5-473E-A14D-6A00700C1EA9} - {C46B9A53-86D8-4B7F-AB15-B2C04518A195} = {30F7FB89-B9D5-473E-A14D-6A00700C1EA9} - {76ADDB29-9C6A-442C-9BA9-764C050F75DD} = {30F7FB89-B9D5-473E-A14D-6A00700C1EA9} - {9EDB5C0F-BFD0-4A59-BB93-F06A52BB0128} = {30F7FB89-B9D5-473E-A14D-6A00700C1EA9} - {39C65232-04FB-4622-8283-34829739887C} = {30F7FB89-B9D5-473E-A14D-6A00700C1EA9} - {9801D5FF-C1E0-46C5-A73E-47DEECE99DDB} = {30F7FB89-B9D5-473E-A14D-6A00700C1EA9} - {86D92BC4-4C57-42D1-9F63-26ABF811715B} = {5319B36D-2906-4EAF-B623-B7C04F3CC2AD} - {7F9DA615-40A3-43A0-B8BB-528698DDE6E5} = {5319B36D-2906-4EAF-B623-B7C04F3CC2AD} - {F0304A28-E1C7-4F4F-BE1F-DF57936C9664} = {5319B36D-2906-4EAF-B623-B7C04F3CC2AD} - {B1E68128-84D7-4525-A3C1-E6C1077F2239} = {5319B36D-2906-4EAF-B623-B7C04F3CC2AD} - {0C227B07-1830-4C5B-8D4E-2DEFFFD2792D} = {5319B36D-2906-4EAF-B623-B7C04F3CC2AD} - {D870A978-8130-4D1D-9FB2-3EE2028D2C50} = {31AFDB3C-8769-49DF-9C9E-2013E194D983} - {E7A73E97-7106-4D4A-98BA-AA43FBD19DB4} = {5319B36D-2906-4EAF-B623-B7C04F3CC2AD} - {37FDEA25-43CD-4AF0-A232-281E11851E75} = {CB0679D3-62C5-4328-B49F-504E0AA9C65A} - EndGlobalSection -EndGlobal +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.4.33122.133 +MinimumVisualStudioVersion = 17.4.33122.133 +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Image Libraries", "Image Libraries", "{4178148C-8A0C-4EB0-ACD9-0E09676F2700}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Generic POV-Ray", "Generic POV-Ray", "{5319B36D-2906-4EAF-B623-B7C04F3CC2AD}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "VFE", "VFE", "{4A043885-D401-40B2-9375-1C57136F03F6}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Windows Targets", "Windows Targets", "{CB0679D3-62C5-4328-B49F-504E0AA9C65A}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "GUI", "povray.vcxproj", "{9BA806FC-C022-4ACF-A3F1-3EC8CAB45570}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "jpeg", "jpeg.vcxproj", "{3780CCDE-4967-4C31-B6A3-3C2570BDD3E4}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libpng", "libpng.vcxproj", "{E1EA88AF-6B44-4225-B97B-B485FC9DB23E}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tiff", "tiff.vcxproj", "{186BAEF6-CF24-42C1-8CE3-25590CB9F6E7}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "zlib", "zlib.vcxproj", "{8BB067C4-7135-4643-863C-49C520BEEA01}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "vfewin", "vfewin.vcxproj", "{72793DF1-D4AF-4AA0-A606-7B51ED2A3F5C}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "rtrsupport", "rtrsupport.vcxproj", "{851C772C-D7C2-4EE3-A90C-23386F0E9897}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "console", "console.vcxproj", "{3B6BB403-FC72-45FF-A431-9295A1AEB7A3}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "povbackend", "povbackend.vcxproj", "{C6D9B754-11EB-4FC3-8683-593B53E9AD1F}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "povbase", "povbase.vcxproj", "{C6D9B754-11EB-4FC3-8683-593B2377D043}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "povfrontend", "povfrontend.vcxproj", "{C6D9B754-11EB-4FC3-8683-593BFD58C904}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Boost Libraries", "Boost Libraries", "{31AFDB3C-8769-49DF-9C9E-2013E194D983}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "boost_thread", "boost_thread.vcxproj", "{10B193D4-E27B-4438-A825-BFB3D2B4C74D}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "boost_date_time", "boost_date_time.vcxproj", "{35A2DC31-84BC-4F7A-9C93-1D072432AD79}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "OpenEXR Libraries", "OpenEXR Libraries", "{30F7FB89-B9D5-473E-A14D-6A00700C1EA9}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "OpenEXR IlmImf", "openexr_IlmImf.vcxproj", "{7DF42126-D237-41D3-9ABE-A3ACC8BAC56E}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "OpenEXR IlmBase Iex", "openexr_Iex.vcxproj", "{C46B9A53-86D8-4B7F-AB15-B2C04518A195}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "OpenEXR IlmBase IlmThread", "openexr_IlmThread.vcxproj", "{76ADDB29-9C6A-442C-9BA9-764C050F75DD}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "OpenEXR IlmBase Half", "openexr_Half.vcxproj", "{9EDB5C0F-BFD0-4A59-BB93-F06A52BB0128}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "OpenEXR IlmBase Half eLut", "openexr_eLut.vcxproj", "{39C65232-04FB-4622-8283-34829739887C}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "OpenEXR IlmBase Half toFloat", "openexr_toFloat.vcxproj", "{9801D5FF-C1E0-46C5-A73E-47DEECE99DDB}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tests", "tests.vcxproj", "{86D92BC4-4C57-42D1-9F63-26ABF811715B}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "povcore", "povcore.vcxproj", "{7F9DA615-40A3-43A0-B8BB-528698DDE6E5}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "povparser", "povparser.vcxproj", "{F0304A28-E1C7-4F4F-BE1F-DF57936C9664}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "povms", "povms.vcxproj", "{B1E68128-84D7-4525-A3C1-E6C1077F2239}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "povplatform", "povplatform.vcxproj", "{0C227B07-1830-4C5B-8D4E-2DEFFFD2792D}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "boost_system", "boost_system.vcxproj", "{D870A978-8130-4D1D-9FB2-3EE2028D2C50}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "povvm", "povvm.vcxproj", "{E7A73E97-7106-4D4A-98BA-AA43FBD19DB4}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "cmedit", "cmedit.vcxproj", "{37FDEA25-43CD-4AF0-A232-281E11851E75}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 + Debug|x64 = Debug|x64 + Release|Win32 = Release|Win32 + Release|x64 = Release|x64 + Release-AVX|Win32 = Release-AVX|Win32 + Release-AVX|x64 = Release-AVX|x64 + Release-AVX512|Win32 = Release-AVX512|Win32 + Release-AVX512|x64 = Release-AVX512|x64 + Release-SSE2|Win32 = Release-SSE2|Win32 + Release-SSE2|x64 = Release-SSE2|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {9BA806FC-C022-4ACF-A3F1-3EC8CAB45570}.Debug|Win32.ActiveCfg = Debug|Win32 + {9BA806FC-C022-4ACF-A3F1-3EC8CAB45570}.Debug|Win32.Build.0 = Debug|Win32 + {9BA806FC-C022-4ACF-A3F1-3EC8CAB45570}.Debug|x64.ActiveCfg = Debug|x64 + {9BA806FC-C022-4ACF-A3F1-3EC8CAB45570}.Release|Win32.ActiveCfg = Release|Win32 + {9BA806FC-C022-4ACF-A3F1-3EC8CAB45570}.Release|Win32.Build.0 = Release|Win32 + {9BA806FC-C022-4ACF-A3F1-3EC8CAB45570}.Release|x64.ActiveCfg = Release|x64 + {9BA806FC-C022-4ACF-A3F1-3EC8CAB45570}.Release|x64.Build.0 = Release|x64 + {9BA806FC-C022-4ACF-A3F1-3EC8CAB45570}.Release-AVX|Win32.ActiveCfg = Release|Win32 + {9BA806FC-C022-4ACF-A3F1-3EC8CAB45570}.Release-AVX|x64.ActiveCfg = Release-AVX|x64 + {9BA806FC-C022-4ACF-A3F1-3EC8CAB45570}.Release-AVX|x64.Build.0 = Release-AVX|x64 + {9BA806FC-C022-4ACF-A3F1-3EC8CAB45570}.Release-AVX512|Win32.ActiveCfg = Release-AVX512|Win32 + {9BA806FC-C022-4ACF-A3F1-3EC8CAB45570}.Release-AVX512|Win32.Build.0 = Release-AVX512|Win32 + {9BA806FC-C022-4ACF-A3F1-3EC8CAB45570}.Release-AVX512|x64.ActiveCfg = Release-AVX512|x64 + {9BA806FC-C022-4ACF-A3F1-3EC8CAB45570}.Release-AVX512|x64.Build.0 = Release-AVX512|x64 + {9BA806FC-C022-4ACF-A3F1-3EC8CAB45570}.Release-SSE2|Win32.ActiveCfg = Release-SSE2|Win32 + {9BA806FC-C022-4ACF-A3F1-3EC8CAB45570}.Release-SSE2|Win32.Build.0 = Release-SSE2|Win32 + {9BA806FC-C022-4ACF-A3F1-3EC8CAB45570}.Release-SSE2|x64.ActiveCfg = Release|x64 + {3780CCDE-4967-4C31-B6A3-3C2570BDD3E4}.Debug|Win32.ActiveCfg = Debug|Win32 + {3780CCDE-4967-4C31-B6A3-3C2570BDD3E4}.Debug|Win32.Build.0 = Debug|Win32 + {3780CCDE-4967-4C31-B6A3-3C2570BDD3E4}.Debug|x64.ActiveCfg = Debug|x64 + {3780CCDE-4967-4C31-B6A3-3C2570BDD3E4}.Debug|x64.Build.0 = Debug|x64 + {3780CCDE-4967-4C31-B6A3-3C2570BDD3E4}.Release|Win32.ActiveCfg = Release|Win32 + {3780CCDE-4967-4C31-B6A3-3C2570BDD3E4}.Release|Win32.Build.0 = Release|Win32 + {3780CCDE-4967-4C31-B6A3-3C2570BDD3E4}.Release|x64.ActiveCfg = Release|x64 + {3780CCDE-4967-4C31-B6A3-3C2570BDD3E4}.Release|x64.Build.0 = Release|x64 + {3780CCDE-4967-4C31-B6A3-3C2570BDD3E4}.Release-AVX|Win32.ActiveCfg = Release|Win32 + {3780CCDE-4967-4C31-B6A3-3C2570BDD3E4}.Release-AVX|x64.ActiveCfg = Release-AVX|x64 + {3780CCDE-4967-4C31-B6A3-3C2570BDD3E4}.Release-AVX|x64.Build.0 = Release-AVX|x64 + {3780CCDE-4967-4C31-B6A3-3C2570BDD3E4}.Release-AVX512|Win32.ActiveCfg = Release-SSE2|Win32 + {3780CCDE-4967-4C31-B6A3-3C2570BDD3E4}.Release-AVX512|Win32.Build.0 = Release-SSE2|Win32 + {3780CCDE-4967-4C31-B6A3-3C2570BDD3E4}.Release-AVX512|x64.ActiveCfg = Release-AVX512|x64 + {3780CCDE-4967-4C31-B6A3-3C2570BDD3E4}.Release-AVX512|x64.Build.0 = Release-AVX512|x64 + {3780CCDE-4967-4C31-B6A3-3C2570BDD3E4}.Release-SSE2|Win32.ActiveCfg = Release-SSE2|Win32 + {3780CCDE-4967-4C31-B6A3-3C2570BDD3E4}.Release-SSE2|Win32.Build.0 = Release-SSE2|Win32 + {3780CCDE-4967-4C31-B6A3-3C2570BDD3E4}.Release-SSE2|x64.ActiveCfg = Release|x64 + {E1EA88AF-6B44-4225-B97B-B485FC9DB23E}.Debug|Win32.ActiveCfg = Debug|Win32 + {E1EA88AF-6B44-4225-B97B-B485FC9DB23E}.Debug|Win32.Build.0 = Debug|Win32 + {E1EA88AF-6B44-4225-B97B-B485FC9DB23E}.Debug|x64.ActiveCfg = Debug|x64 + {E1EA88AF-6B44-4225-B97B-B485FC9DB23E}.Debug|x64.Build.0 = Debug|x64 + {E1EA88AF-6B44-4225-B97B-B485FC9DB23E}.Release|Win32.ActiveCfg = Release|Win32 + {E1EA88AF-6B44-4225-B97B-B485FC9DB23E}.Release|Win32.Build.0 = Release|Win32 + {E1EA88AF-6B44-4225-B97B-B485FC9DB23E}.Release|x64.ActiveCfg = Release|x64 + {E1EA88AF-6B44-4225-B97B-B485FC9DB23E}.Release|x64.Build.0 = Release|x64 + {E1EA88AF-6B44-4225-B97B-B485FC9DB23E}.Release-AVX|Win32.ActiveCfg = Release|Win32 + {E1EA88AF-6B44-4225-B97B-B485FC9DB23E}.Release-AVX|x64.ActiveCfg = Release-AVX|x64 + {E1EA88AF-6B44-4225-B97B-B485FC9DB23E}.Release-AVX|x64.Build.0 = Release-AVX|x64 + {E1EA88AF-6B44-4225-B97B-B485FC9DB23E}.Release-AVX512|Win32.ActiveCfg = Release-SSE2|Win32 + {E1EA88AF-6B44-4225-B97B-B485FC9DB23E}.Release-AVX512|Win32.Build.0 = Release-SSE2|Win32 + {E1EA88AF-6B44-4225-B97B-B485FC9DB23E}.Release-AVX512|x64.ActiveCfg = Release-AVX512|x64 + {E1EA88AF-6B44-4225-B97B-B485FC9DB23E}.Release-AVX512|x64.Build.0 = Release-AVX512|x64 + {E1EA88AF-6B44-4225-B97B-B485FC9DB23E}.Release-SSE2|Win32.ActiveCfg = Release-SSE2|Win32 + {E1EA88AF-6B44-4225-B97B-B485FC9DB23E}.Release-SSE2|Win32.Build.0 = Release-SSE2|Win32 + {E1EA88AF-6B44-4225-B97B-B485FC9DB23E}.Release-SSE2|x64.ActiveCfg = Release|x64 + {186BAEF6-CF24-42C1-8CE3-25590CB9F6E7}.Debug|Win32.ActiveCfg = Debug|Win32 + {186BAEF6-CF24-42C1-8CE3-25590CB9F6E7}.Debug|Win32.Build.0 = Debug|Win32 + {186BAEF6-CF24-42C1-8CE3-25590CB9F6E7}.Debug|x64.ActiveCfg = Debug|x64 + {186BAEF6-CF24-42C1-8CE3-25590CB9F6E7}.Debug|x64.Build.0 = Debug|x64 + {186BAEF6-CF24-42C1-8CE3-25590CB9F6E7}.Release|Win32.ActiveCfg = Release|Win32 + {186BAEF6-CF24-42C1-8CE3-25590CB9F6E7}.Release|Win32.Build.0 = Release|Win32 + {186BAEF6-CF24-42C1-8CE3-25590CB9F6E7}.Release|x64.ActiveCfg = Release|x64 + {186BAEF6-CF24-42C1-8CE3-25590CB9F6E7}.Release|x64.Build.0 = Release|x64 + {186BAEF6-CF24-42C1-8CE3-25590CB9F6E7}.Release-AVX|Win32.ActiveCfg = Release|Win32 + {186BAEF6-CF24-42C1-8CE3-25590CB9F6E7}.Release-AVX|x64.ActiveCfg = Release-AVX|x64 + {186BAEF6-CF24-42C1-8CE3-25590CB9F6E7}.Release-AVX|x64.Build.0 = Release-AVX|x64 + {186BAEF6-CF24-42C1-8CE3-25590CB9F6E7}.Release-AVX512|Win32.ActiveCfg = Release-SSE2|Win32 + {186BAEF6-CF24-42C1-8CE3-25590CB9F6E7}.Release-AVX512|Win32.Build.0 = Release-SSE2|Win32 + {186BAEF6-CF24-42C1-8CE3-25590CB9F6E7}.Release-AVX512|x64.ActiveCfg = Release-AVX512|x64 + {186BAEF6-CF24-42C1-8CE3-25590CB9F6E7}.Release-AVX512|x64.Build.0 = Release-AVX512|x64 + {186BAEF6-CF24-42C1-8CE3-25590CB9F6E7}.Release-SSE2|Win32.ActiveCfg = Release-SSE2|Win32 + {186BAEF6-CF24-42C1-8CE3-25590CB9F6E7}.Release-SSE2|Win32.Build.0 = Release-SSE2|Win32 + {186BAEF6-CF24-42C1-8CE3-25590CB9F6E7}.Release-SSE2|x64.ActiveCfg = Release|x64 + {8BB067C4-7135-4643-863C-49C520BEEA01}.Debug|Win32.ActiveCfg = Debug|Win32 + {8BB067C4-7135-4643-863C-49C520BEEA01}.Debug|Win32.Build.0 = Debug|Win32 + {8BB067C4-7135-4643-863C-49C520BEEA01}.Debug|x64.ActiveCfg = Debug|x64 + {8BB067C4-7135-4643-863C-49C520BEEA01}.Debug|x64.Build.0 = Debug|x64 + {8BB067C4-7135-4643-863C-49C520BEEA01}.Release|Win32.ActiveCfg = Release|Win32 + {8BB067C4-7135-4643-863C-49C520BEEA01}.Release|Win32.Build.0 = Release|Win32 + {8BB067C4-7135-4643-863C-49C520BEEA01}.Release|x64.ActiveCfg = Release|x64 + {8BB067C4-7135-4643-863C-49C520BEEA01}.Release|x64.Build.0 = Release|x64 + {8BB067C4-7135-4643-863C-49C520BEEA01}.Release-AVX|Win32.ActiveCfg = Release|Win32 + {8BB067C4-7135-4643-863C-49C520BEEA01}.Release-AVX|x64.ActiveCfg = Release-AVX|x64 + {8BB067C4-7135-4643-863C-49C520BEEA01}.Release-AVX|x64.Build.0 = Release-AVX|x64 + {8BB067C4-7135-4643-863C-49C520BEEA01}.Release-AVX512|Win32.ActiveCfg = Release-SSE2|Win32 + {8BB067C4-7135-4643-863C-49C520BEEA01}.Release-AVX512|Win32.Build.0 = Release-SSE2|Win32 + {8BB067C4-7135-4643-863C-49C520BEEA01}.Release-AVX512|x64.ActiveCfg = Release-AVX512|x64 + {8BB067C4-7135-4643-863C-49C520BEEA01}.Release-AVX512|x64.Build.0 = Release-AVX512|x64 + {8BB067C4-7135-4643-863C-49C520BEEA01}.Release-SSE2|Win32.ActiveCfg = Release-SSE2|Win32 + {8BB067C4-7135-4643-863C-49C520BEEA01}.Release-SSE2|Win32.Build.0 = Release-SSE2|Win32 + {8BB067C4-7135-4643-863C-49C520BEEA01}.Release-SSE2|x64.ActiveCfg = Release|x64 + {72793DF1-D4AF-4AA0-A606-7B51ED2A3F5C}.Debug|Win32.ActiveCfg = Debug|Win32 + {72793DF1-D4AF-4AA0-A606-7B51ED2A3F5C}.Debug|Win32.Build.0 = Debug|Win32 + {72793DF1-D4AF-4AA0-A606-7B51ED2A3F5C}.Debug|x64.ActiveCfg = Debug|x64 + {72793DF1-D4AF-4AA0-A606-7B51ED2A3F5C}.Debug|x64.Build.0 = Debug|x64 + {72793DF1-D4AF-4AA0-A606-7B51ED2A3F5C}.Release|Win32.ActiveCfg = Release|Win32 + {72793DF1-D4AF-4AA0-A606-7B51ED2A3F5C}.Release|Win32.Build.0 = Release|Win32 + {72793DF1-D4AF-4AA0-A606-7B51ED2A3F5C}.Release|x64.ActiveCfg = Release|x64 + {72793DF1-D4AF-4AA0-A606-7B51ED2A3F5C}.Release|x64.Build.0 = Release|x64 + {72793DF1-D4AF-4AA0-A606-7B51ED2A3F5C}.Release-AVX|Win32.ActiveCfg = Release|Win32 + {72793DF1-D4AF-4AA0-A606-7B51ED2A3F5C}.Release-AVX|x64.ActiveCfg = Release-AVX|x64 + {72793DF1-D4AF-4AA0-A606-7B51ED2A3F5C}.Release-AVX|x64.Build.0 = Release-AVX|x64 + {72793DF1-D4AF-4AA0-A606-7B51ED2A3F5C}.Release-AVX512|Win32.ActiveCfg = Release-SSE2|Win32 + {72793DF1-D4AF-4AA0-A606-7B51ED2A3F5C}.Release-AVX512|Win32.Build.0 = Release-SSE2|Win32 + {72793DF1-D4AF-4AA0-A606-7B51ED2A3F5C}.Release-AVX512|x64.ActiveCfg = Release-AVX512|x64 + {72793DF1-D4AF-4AA0-A606-7B51ED2A3F5C}.Release-AVX512|x64.Build.0 = Release-AVX512|x64 + {72793DF1-D4AF-4AA0-A606-7B51ED2A3F5C}.Release-SSE2|Win32.ActiveCfg = Release-SSE2|Win32 + {72793DF1-D4AF-4AA0-A606-7B51ED2A3F5C}.Release-SSE2|Win32.Build.0 = Release-SSE2|Win32 + {72793DF1-D4AF-4AA0-A606-7B51ED2A3F5C}.Release-SSE2|x64.ActiveCfg = Release|x64 + {851C772C-D7C2-4EE3-A90C-23386F0E9897}.Debug|Win32.ActiveCfg = Debug|Win32 + {851C772C-D7C2-4EE3-A90C-23386F0E9897}.Debug|Win32.Build.0 = Debug|Win32 + {851C772C-D7C2-4EE3-A90C-23386F0E9897}.Debug|x64.ActiveCfg = Debug|x64 + {851C772C-D7C2-4EE3-A90C-23386F0E9897}.Debug|x64.Build.0 = Debug|x64 + {851C772C-D7C2-4EE3-A90C-23386F0E9897}.Release|Win32.ActiveCfg = Release|Win32 + {851C772C-D7C2-4EE3-A90C-23386F0E9897}.Release|Win32.Build.0 = Release|Win32 + {851C772C-D7C2-4EE3-A90C-23386F0E9897}.Release|x64.ActiveCfg = Release|x64 + {851C772C-D7C2-4EE3-A90C-23386F0E9897}.Release|x64.Build.0 = Release|x64 + {851C772C-D7C2-4EE3-A90C-23386F0E9897}.Release-AVX|Win32.ActiveCfg = Release|Win32 + {851C772C-D7C2-4EE3-A90C-23386F0E9897}.Release-AVX|x64.ActiveCfg = Release-AVX|x64 + {851C772C-D7C2-4EE3-A90C-23386F0E9897}.Release-AVX|x64.Build.0 = Release-AVX|x64 + {851C772C-D7C2-4EE3-A90C-23386F0E9897}.Release-AVX512|Win32.ActiveCfg = Release-SSE2|Win32 + {851C772C-D7C2-4EE3-A90C-23386F0E9897}.Release-AVX512|Win32.Build.0 = Release-SSE2|Win32 + {851C772C-D7C2-4EE3-A90C-23386F0E9897}.Release-AVX512|x64.ActiveCfg = Release-AVX512|x64 + {851C772C-D7C2-4EE3-A90C-23386F0E9897}.Release-AVX512|x64.Build.0 = Release-AVX512|x64 + {851C772C-D7C2-4EE3-A90C-23386F0E9897}.Release-SSE2|Win32.ActiveCfg = Release-SSE2|Win32 + {851C772C-D7C2-4EE3-A90C-23386F0E9897}.Release-SSE2|Win32.Build.0 = Release-SSE2|Win32 + {851C772C-D7C2-4EE3-A90C-23386F0E9897}.Release-SSE2|x64.ActiveCfg = Release|x64 + {3B6BB403-FC72-45FF-A431-9295A1AEB7A3}.Debug|Win32.ActiveCfg = Debug|Win32 + {3B6BB403-FC72-45FF-A431-9295A1AEB7A3}.Debug|x64.ActiveCfg = Debug|x64 + {3B6BB403-FC72-45FF-A431-9295A1AEB7A3}.Debug|x64.Build.0 = Debug|x64 + {3B6BB403-FC72-45FF-A431-9295A1AEB7A3}.Release|Win32.ActiveCfg = Release|Win32 + {3B6BB403-FC72-45FF-A431-9295A1AEB7A3}.Release|x64.ActiveCfg = Release|x64 + {3B6BB403-FC72-45FF-A431-9295A1AEB7A3}.Release-AVX|Win32.ActiveCfg = Release|Win32 + {3B6BB403-FC72-45FF-A431-9295A1AEB7A3}.Release-AVX|x64.ActiveCfg = Release-AVX|x64 + {3B6BB403-FC72-45FF-A431-9295A1AEB7A3}.Release-AVX512|Win32.ActiveCfg = Release-SSE2|Win32 + {3B6BB403-FC72-45FF-A431-9295A1AEB7A3}.Release-AVX512|Win32.Build.0 = Release-SSE2|Win32 + {3B6BB403-FC72-45FF-A431-9295A1AEB7A3}.Release-AVX512|x64.ActiveCfg = Release-AVX512|x64 + {3B6BB403-FC72-45FF-A431-9295A1AEB7A3}.Release-SSE2|Win32.ActiveCfg = Release-SSE2|Win32 + {3B6BB403-FC72-45FF-A431-9295A1AEB7A3}.Release-SSE2|x64.ActiveCfg = Release|x64 + {C6D9B754-11EB-4FC3-8683-593B53E9AD1F}.Debug|Win32.ActiveCfg = Debug|Win32 + {C6D9B754-11EB-4FC3-8683-593B53E9AD1F}.Debug|Win32.Build.0 = Debug|Win32 + {C6D9B754-11EB-4FC3-8683-593B53E9AD1F}.Debug|x64.ActiveCfg = Debug|x64 + {C6D9B754-11EB-4FC3-8683-593B53E9AD1F}.Debug|x64.Build.0 = Debug|x64 + {C6D9B754-11EB-4FC3-8683-593B53E9AD1F}.Release|Win32.ActiveCfg = Release|Win32 + {C6D9B754-11EB-4FC3-8683-593B53E9AD1F}.Release|Win32.Build.0 = Release|Win32 + {C6D9B754-11EB-4FC3-8683-593B53E9AD1F}.Release|x64.ActiveCfg = Release|x64 + {C6D9B754-11EB-4FC3-8683-593B53E9AD1F}.Release|x64.Build.0 = Release|x64 + {C6D9B754-11EB-4FC3-8683-593B53E9AD1F}.Release-AVX|Win32.ActiveCfg = Release|Win32 + {C6D9B754-11EB-4FC3-8683-593B53E9AD1F}.Release-AVX|x64.ActiveCfg = Release-AVX|x64 + {C6D9B754-11EB-4FC3-8683-593B53E9AD1F}.Release-AVX|x64.Build.0 = Release-AVX|x64 + {C6D9B754-11EB-4FC3-8683-593B53E9AD1F}.Release-AVX512|Win32.ActiveCfg = Release-SSE2|Win32 + {C6D9B754-11EB-4FC3-8683-593B53E9AD1F}.Release-AVX512|Win32.Build.0 = Release-SSE2|Win32 + {C6D9B754-11EB-4FC3-8683-593B53E9AD1F}.Release-AVX512|x64.ActiveCfg = Release-AVX512|x64 + {C6D9B754-11EB-4FC3-8683-593B53E9AD1F}.Release-AVX512|x64.Build.0 = Release-AVX512|x64 + {C6D9B754-11EB-4FC3-8683-593B53E9AD1F}.Release-SSE2|Win32.ActiveCfg = Release-SSE2|Win32 + {C6D9B754-11EB-4FC3-8683-593B53E9AD1F}.Release-SSE2|Win32.Build.0 = Release-SSE2|Win32 + {C6D9B754-11EB-4FC3-8683-593B53E9AD1F}.Release-SSE2|x64.ActiveCfg = Release|x64 + {C6D9B754-11EB-4FC3-8683-593B2377D043}.Debug|Win32.ActiveCfg = Debug|Win32 + {C6D9B754-11EB-4FC3-8683-593B2377D043}.Debug|Win32.Build.0 = Debug|Win32 + {C6D9B754-11EB-4FC3-8683-593B2377D043}.Debug|x64.ActiveCfg = Debug|x64 + {C6D9B754-11EB-4FC3-8683-593B2377D043}.Debug|x64.Build.0 = Debug|x64 + {C6D9B754-11EB-4FC3-8683-593B2377D043}.Release|Win32.ActiveCfg = Release|Win32 + {C6D9B754-11EB-4FC3-8683-593B2377D043}.Release|Win32.Build.0 = Release|Win32 + {C6D9B754-11EB-4FC3-8683-593B2377D043}.Release|x64.ActiveCfg = Release|x64 + {C6D9B754-11EB-4FC3-8683-593B2377D043}.Release|x64.Build.0 = Release|x64 + {C6D9B754-11EB-4FC3-8683-593B2377D043}.Release-AVX|Win32.ActiveCfg = Release|Win32 + {C6D9B754-11EB-4FC3-8683-593B2377D043}.Release-AVX|x64.ActiveCfg = Release-AVX|x64 + {C6D9B754-11EB-4FC3-8683-593B2377D043}.Release-AVX|x64.Build.0 = Release-AVX|x64 + {C6D9B754-11EB-4FC3-8683-593B2377D043}.Release-AVX512|Win32.ActiveCfg = Release-SSE2|Win32 + {C6D9B754-11EB-4FC3-8683-593B2377D043}.Release-AVX512|Win32.Build.0 = Release-SSE2|Win32 + {C6D9B754-11EB-4FC3-8683-593B2377D043}.Release-AVX512|x64.ActiveCfg = Release-AVX512|x64 + {C6D9B754-11EB-4FC3-8683-593B2377D043}.Release-AVX512|x64.Build.0 = Release-AVX512|x64 + {C6D9B754-11EB-4FC3-8683-593B2377D043}.Release-SSE2|Win32.ActiveCfg = Release-SSE2|Win32 + {C6D9B754-11EB-4FC3-8683-593B2377D043}.Release-SSE2|Win32.Build.0 = Release-SSE2|Win32 + {C6D9B754-11EB-4FC3-8683-593B2377D043}.Release-SSE2|x64.ActiveCfg = Release|x64 + {C6D9B754-11EB-4FC3-8683-593BFD58C904}.Debug|Win32.ActiveCfg = Debug|Win32 + {C6D9B754-11EB-4FC3-8683-593BFD58C904}.Debug|Win32.Build.0 = Debug|Win32 + {C6D9B754-11EB-4FC3-8683-593BFD58C904}.Debug|x64.ActiveCfg = Debug|x64 + {C6D9B754-11EB-4FC3-8683-593BFD58C904}.Debug|x64.Build.0 = Debug|x64 + {C6D9B754-11EB-4FC3-8683-593BFD58C904}.Release|Win32.ActiveCfg = Release|Win32 + {C6D9B754-11EB-4FC3-8683-593BFD58C904}.Release|Win32.Build.0 = Release|Win32 + {C6D9B754-11EB-4FC3-8683-593BFD58C904}.Release|x64.ActiveCfg = Release|x64 + {C6D9B754-11EB-4FC3-8683-593BFD58C904}.Release|x64.Build.0 = Release|x64 + {C6D9B754-11EB-4FC3-8683-593BFD58C904}.Release-AVX|Win32.ActiveCfg = Release|Win32 + {C6D9B754-11EB-4FC3-8683-593BFD58C904}.Release-AVX|x64.ActiveCfg = Release-AVX|x64 + {C6D9B754-11EB-4FC3-8683-593BFD58C904}.Release-AVX|x64.Build.0 = Release-AVX|x64 + {C6D9B754-11EB-4FC3-8683-593BFD58C904}.Release-AVX512|Win32.ActiveCfg = Release-SSE2|Win32 + {C6D9B754-11EB-4FC3-8683-593BFD58C904}.Release-AVX512|Win32.Build.0 = Release-SSE2|Win32 + {C6D9B754-11EB-4FC3-8683-593BFD58C904}.Release-AVX512|x64.ActiveCfg = Release-AVX512|x64 + {C6D9B754-11EB-4FC3-8683-593BFD58C904}.Release-AVX512|x64.Build.0 = Release-AVX512|x64 + {C6D9B754-11EB-4FC3-8683-593BFD58C904}.Release-SSE2|Win32.ActiveCfg = Release-SSE2|Win32 + {C6D9B754-11EB-4FC3-8683-593BFD58C904}.Release-SSE2|Win32.Build.0 = Release-SSE2|Win32 + {C6D9B754-11EB-4FC3-8683-593BFD58C904}.Release-SSE2|x64.ActiveCfg = Release|x64 + {10B193D4-E27B-4438-A825-BFB3D2B4C74D}.Debug|Win32.ActiveCfg = Debug|Win32 + {10B193D4-E27B-4438-A825-BFB3D2B4C74D}.Debug|Win32.Build.0 = Debug|Win32 + {10B193D4-E27B-4438-A825-BFB3D2B4C74D}.Debug|x64.ActiveCfg = Debug|x64 + {10B193D4-E27B-4438-A825-BFB3D2B4C74D}.Debug|x64.Build.0 = Debug|x64 + {10B193D4-E27B-4438-A825-BFB3D2B4C74D}.Release|Win32.ActiveCfg = Release|Win32 + {10B193D4-E27B-4438-A825-BFB3D2B4C74D}.Release|Win32.Build.0 = Release|Win32 + {10B193D4-E27B-4438-A825-BFB3D2B4C74D}.Release|x64.ActiveCfg = Release|x64 + {10B193D4-E27B-4438-A825-BFB3D2B4C74D}.Release|x64.Build.0 = Release|x64 + {10B193D4-E27B-4438-A825-BFB3D2B4C74D}.Release-AVX|Win32.ActiveCfg = Release|Win32 + {10B193D4-E27B-4438-A825-BFB3D2B4C74D}.Release-AVX|x64.ActiveCfg = Release-AVX|x64 + {10B193D4-E27B-4438-A825-BFB3D2B4C74D}.Release-AVX|x64.Build.0 = Release-AVX|x64 + {10B193D4-E27B-4438-A825-BFB3D2B4C74D}.Release-AVX512|Win32.ActiveCfg = Release-SSE2|Win32 + {10B193D4-E27B-4438-A825-BFB3D2B4C74D}.Release-AVX512|Win32.Build.0 = Release-SSE2|Win32 + {10B193D4-E27B-4438-A825-BFB3D2B4C74D}.Release-AVX512|x64.ActiveCfg = Release-AVX512|x64 + {10B193D4-E27B-4438-A825-BFB3D2B4C74D}.Release-AVX512|x64.Build.0 = Release-AVX512|x64 + {10B193D4-E27B-4438-A825-BFB3D2B4C74D}.Release-SSE2|Win32.ActiveCfg = Release-SSE2|Win32 + {10B193D4-E27B-4438-A825-BFB3D2B4C74D}.Release-SSE2|Win32.Build.0 = Release-SSE2|Win32 + {10B193D4-E27B-4438-A825-BFB3D2B4C74D}.Release-SSE2|x64.ActiveCfg = Release|x64 + {35A2DC31-84BC-4F7A-9C93-1D072432AD79}.Debug|Win32.ActiveCfg = Debug|Win32 + {35A2DC31-84BC-4F7A-9C93-1D072432AD79}.Debug|x64.ActiveCfg = Debug|x64 + {35A2DC31-84BC-4F7A-9C93-1D072432AD79}.Debug|x64.Build.0 = Debug|x64 + {35A2DC31-84BC-4F7A-9C93-1D072432AD79}.Release|Win32.ActiveCfg = Release|Win32 + {35A2DC31-84BC-4F7A-9C93-1D072432AD79}.Release|x64.ActiveCfg = Release|x64 + {35A2DC31-84BC-4F7A-9C93-1D072432AD79}.Release-AVX|Win32.ActiveCfg = Release|Win32 + {35A2DC31-84BC-4F7A-9C93-1D072432AD79}.Release-AVX|x64.ActiveCfg = Release-AVX|x64 + {35A2DC31-84BC-4F7A-9C93-1D072432AD79}.Release-AVX|x64.Build.0 = Release-AVX|x64 + {35A2DC31-84BC-4F7A-9C93-1D072432AD79}.Release-AVX512|Win32.ActiveCfg = Release-SSE2|Win32 + {35A2DC31-84BC-4F7A-9C93-1D072432AD79}.Release-AVX512|Win32.Build.0 = Release-SSE2|Win32 + {35A2DC31-84BC-4F7A-9C93-1D072432AD79}.Release-AVX512|x64.ActiveCfg = Release-AVX512|x64 + {35A2DC31-84BC-4F7A-9C93-1D072432AD79}.Release-AVX512|x64.Build.0 = Release-AVX512|x64 + {35A2DC31-84BC-4F7A-9C93-1D072432AD79}.Release-SSE2|Win32.ActiveCfg = Release-SSE2|Win32 + {35A2DC31-84BC-4F7A-9C93-1D072432AD79}.Release-SSE2|x64.ActiveCfg = Release|x64 + {7DF42126-D237-41D3-9ABE-A3ACC8BAC56E}.Debug|Win32.ActiveCfg = Debug|Win32 + {7DF42126-D237-41D3-9ABE-A3ACC8BAC56E}.Debug|Win32.Build.0 = Debug|Win32 + {7DF42126-D237-41D3-9ABE-A3ACC8BAC56E}.Debug|x64.ActiveCfg = Debug|x64 + {7DF42126-D237-41D3-9ABE-A3ACC8BAC56E}.Debug|x64.Build.0 = Debug|x64 + {7DF42126-D237-41D3-9ABE-A3ACC8BAC56E}.Release|Win32.ActiveCfg = Release|Win32 + {7DF42126-D237-41D3-9ABE-A3ACC8BAC56E}.Release|Win32.Build.0 = Release|Win32 + {7DF42126-D237-41D3-9ABE-A3ACC8BAC56E}.Release|x64.ActiveCfg = Release|x64 + {7DF42126-D237-41D3-9ABE-A3ACC8BAC56E}.Release|x64.Build.0 = Release|x64 + {7DF42126-D237-41D3-9ABE-A3ACC8BAC56E}.Release-AVX|Win32.ActiveCfg = Release|Win32 + {7DF42126-D237-41D3-9ABE-A3ACC8BAC56E}.Release-AVX|x64.ActiveCfg = Release-AVX|x64 + {7DF42126-D237-41D3-9ABE-A3ACC8BAC56E}.Release-AVX|x64.Build.0 = Release-AVX|x64 + {7DF42126-D237-41D3-9ABE-A3ACC8BAC56E}.Release-AVX512|Win32.ActiveCfg = Release-SSE2|Win32 + {7DF42126-D237-41D3-9ABE-A3ACC8BAC56E}.Release-AVX512|Win32.Build.0 = Release-SSE2|Win32 + {7DF42126-D237-41D3-9ABE-A3ACC8BAC56E}.Release-AVX512|x64.ActiveCfg = Release-AVX512|x64 + {7DF42126-D237-41D3-9ABE-A3ACC8BAC56E}.Release-AVX512|x64.Build.0 = Release-AVX512|x64 + {7DF42126-D237-41D3-9ABE-A3ACC8BAC56E}.Release-SSE2|Win32.ActiveCfg = Release-SSE2|Win32 + {7DF42126-D237-41D3-9ABE-A3ACC8BAC56E}.Release-SSE2|Win32.Build.0 = Release-SSE2|Win32 + {7DF42126-D237-41D3-9ABE-A3ACC8BAC56E}.Release-SSE2|x64.ActiveCfg = Release|x64 + {C46B9A53-86D8-4B7F-AB15-B2C04518A195}.Debug|Win32.ActiveCfg = Debug|Win32 + {C46B9A53-86D8-4B7F-AB15-B2C04518A195}.Debug|Win32.Build.0 = Debug|Win32 + {C46B9A53-86D8-4B7F-AB15-B2C04518A195}.Debug|x64.ActiveCfg = Debug|x64 + {C46B9A53-86D8-4B7F-AB15-B2C04518A195}.Debug|x64.Build.0 = Debug|x64 + {C46B9A53-86D8-4B7F-AB15-B2C04518A195}.Release|Win32.ActiveCfg = Release|Win32 + {C46B9A53-86D8-4B7F-AB15-B2C04518A195}.Release|Win32.Build.0 = Release|Win32 + {C46B9A53-86D8-4B7F-AB15-B2C04518A195}.Release|x64.ActiveCfg = Release|x64 + {C46B9A53-86D8-4B7F-AB15-B2C04518A195}.Release|x64.Build.0 = Release|x64 + {C46B9A53-86D8-4B7F-AB15-B2C04518A195}.Release-AVX|Win32.ActiveCfg = Release|Win32 + {C46B9A53-86D8-4B7F-AB15-B2C04518A195}.Release-AVX|x64.ActiveCfg = Release-AVX|x64 + {C46B9A53-86D8-4B7F-AB15-B2C04518A195}.Release-AVX|x64.Build.0 = Release-AVX|x64 + {C46B9A53-86D8-4B7F-AB15-B2C04518A195}.Release-AVX512|Win32.ActiveCfg = Release-SSE2|Win32 + {C46B9A53-86D8-4B7F-AB15-B2C04518A195}.Release-AVX512|Win32.Build.0 = Release-SSE2|Win32 + {C46B9A53-86D8-4B7F-AB15-B2C04518A195}.Release-AVX512|x64.ActiveCfg = Release-AVX512|x64 + {C46B9A53-86D8-4B7F-AB15-B2C04518A195}.Release-AVX512|x64.Build.0 = Release-AVX512|x64 + {C46B9A53-86D8-4B7F-AB15-B2C04518A195}.Release-SSE2|Win32.ActiveCfg = Release-SSE2|Win32 + {C46B9A53-86D8-4B7F-AB15-B2C04518A195}.Release-SSE2|Win32.Build.0 = Release-SSE2|Win32 + {C46B9A53-86D8-4B7F-AB15-B2C04518A195}.Release-SSE2|x64.ActiveCfg = Release|x64 + {76ADDB29-9C6A-442C-9BA9-764C050F75DD}.Debug|Win32.ActiveCfg = Debug|Win32 + {76ADDB29-9C6A-442C-9BA9-764C050F75DD}.Debug|Win32.Build.0 = Debug|Win32 + {76ADDB29-9C6A-442C-9BA9-764C050F75DD}.Debug|x64.ActiveCfg = Debug|x64 + {76ADDB29-9C6A-442C-9BA9-764C050F75DD}.Debug|x64.Build.0 = Debug|x64 + {76ADDB29-9C6A-442C-9BA9-764C050F75DD}.Release|Win32.ActiveCfg = Release|Win32 + {76ADDB29-9C6A-442C-9BA9-764C050F75DD}.Release|Win32.Build.0 = Release|Win32 + {76ADDB29-9C6A-442C-9BA9-764C050F75DD}.Release|x64.ActiveCfg = Release|x64 + {76ADDB29-9C6A-442C-9BA9-764C050F75DD}.Release|x64.Build.0 = Release|x64 + {76ADDB29-9C6A-442C-9BA9-764C050F75DD}.Release-AVX|Win32.ActiveCfg = Release|Win32 + {76ADDB29-9C6A-442C-9BA9-764C050F75DD}.Release-AVX|x64.ActiveCfg = Release-AVX|x64 + {76ADDB29-9C6A-442C-9BA9-764C050F75DD}.Release-AVX|x64.Build.0 = Release-AVX|x64 + {76ADDB29-9C6A-442C-9BA9-764C050F75DD}.Release-AVX512|Win32.ActiveCfg = Release-SSE2|Win32 + {76ADDB29-9C6A-442C-9BA9-764C050F75DD}.Release-AVX512|Win32.Build.0 = Release-SSE2|Win32 + {76ADDB29-9C6A-442C-9BA9-764C050F75DD}.Release-AVX512|x64.ActiveCfg = Release-AVX512|x64 + {76ADDB29-9C6A-442C-9BA9-764C050F75DD}.Release-AVX512|x64.Build.0 = Release-AVX512|x64 + {76ADDB29-9C6A-442C-9BA9-764C050F75DD}.Release-SSE2|Win32.ActiveCfg = Release-SSE2|Win32 + {76ADDB29-9C6A-442C-9BA9-764C050F75DD}.Release-SSE2|Win32.Build.0 = Release-SSE2|Win32 + {76ADDB29-9C6A-442C-9BA9-764C050F75DD}.Release-SSE2|x64.ActiveCfg = Release|x64 + {9EDB5C0F-BFD0-4A59-BB93-F06A52BB0128}.Debug|Win32.ActiveCfg = Debug|Win32 + {9EDB5C0F-BFD0-4A59-BB93-F06A52BB0128}.Debug|Win32.Build.0 = Debug|Win32 + {9EDB5C0F-BFD0-4A59-BB93-F06A52BB0128}.Debug|x64.ActiveCfg = Debug|x64 + {9EDB5C0F-BFD0-4A59-BB93-F06A52BB0128}.Debug|x64.Build.0 = Debug|x64 + {9EDB5C0F-BFD0-4A59-BB93-F06A52BB0128}.Release|Win32.ActiveCfg = Release|Win32 + {9EDB5C0F-BFD0-4A59-BB93-F06A52BB0128}.Release|Win32.Build.0 = Release|Win32 + {9EDB5C0F-BFD0-4A59-BB93-F06A52BB0128}.Release|x64.ActiveCfg = Release|x64 + {9EDB5C0F-BFD0-4A59-BB93-F06A52BB0128}.Release|x64.Build.0 = Release|x64 + {9EDB5C0F-BFD0-4A59-BB93-F06A52BB0128}.Release-AVX|Win32.ActiveCfg = Release|Win32 + {9EDB5C0F-BFD0-4A59-BB93-F06A52BB0128}.Release-AVX|x64.ActiveCfg = Release-AVX|x64 + {9EDB5C0F-BFD0-4A59-BB93-F06A52BB0128}.Release-AVX|x64.Build.0 = Release-AVX|x64 + {9EDB5C0F-BFD0-4A59-BB93-F06A52BB0128}.Release-AVX512|Win32.ActiveCfg = Release-SSE2|Win32 + {9EDB5C0F-BFD0-4A59-BB93-F06A52BB0128}.Release-AVX512|Win32.Build.0 = Release-SSE2|Win32 + {9EDB5C0F-BFD0-4A59-BB93-F06A52BB0128}.Release-AVX512|x64.ActiveCfg = Release-AVX512|x64 + {9EDB5C0F-BFD0-4A59-BB93-F06A52BB0128}.Release-AVX512|x64.Build.0 = Release-AVX512|x64 + {9EDB5C0F-BFD0-4A59-BB93-F06A52BB0128}.Release-SSE2|Win32.ActiveCfg = Release-SSE2|Win32 + {9EDB5C0F-BFD0-4A59-BB93-F06A52BB0128}.Release-SSE2|Win32.Build.0 = Release-SSE2|Win32 + {9EDB5C0F-BFD0-4A59-BB93-F06A52BB0128}.Release-SSE2|x64.ActiveCfg = Release|x64 + {39C65232-04FB-4622-8283-34829739887C}.Debug|Win32.ActiveCfg = Release|Win32 + {39C65232-04FB-4622-8283-34829739887C}.Debug|Win32.Build.0 = Release|Win32 + {39C65232-04FB-4622-8283-34829739887C}.Debug|x64.ActiveCfg = Release|x64 + {39C65232-04FB-4622-8283-34829739887C}.Debug|x64.Build.0 = Release|x64 + {39C65232-04FB-4622-8283-34829739887C}.Release|Win32.ActiveCfg = Release|Win32 + {39C65232-04FB-4622-8283-34829739887C}.Release|Win32.Build.0 = Release|Win32 + {39C65232-04FB-4622-8283-34829739887C}.Release|x64.ActiveCfg = Release|x64 + {39C65232-04FB-4622-8283-34829739887C}.Release|x64.Build.0 = Release|x64 + {39C65232-04FB-4622-8283-34829739887C}.Release-AVX|Win32.ActiveCfg = Release|Win32 + {39C65232-04FB-4622-8283-34829739887C}.Release-AVX|x64.ActiveCfg = Release|x64 + {39C65232-04FB-4622-8283-34829739887C}.Release-AVX|x64.Build.0 = Release|x64 + {39C65232-04FB-4622-8283-34829739887C}.Release-AVX512|Win32.ActiveCfg = Release|Win32 + {39C65232-04FB-4622-8283-34829739887C}.Release-AVX512|Win32.Build.0 = Release|Win32 + {39C65232-04FB-4622-8283-34829739887C}.Release-AVX512|x64.ActiveCfg = Release|x64 + {39C65232-04FB-4622-8283-34829739887C}.Release-AVX512|x64.Build.0 = Release|x64 + {39C65232-04FB-4622-8283-34829739887C}.Release-SSE2|Win32.ActiveCfg = Release|Win32 + {39C65232-04FB-4622-8283-34829739887C}.Release-SSE2|Win32.Build.0 = Release|Win32 + {39C65232-04FB-4622-8283-34829739887C}.Release-SSE2|x64.ActiveCfg = Release|x64 + {9801D5FF-C1E0-46C5-A73E-47DEECE99DDB}.Debug|Win32.ActiveCfg = Release|Win32 + {9801D5FF-C1E0-46C5-A73E-47DEECE99DDB}.Debug|Win32.Build.0 = Release|Win32 + {9801D5FF-C1E0-46C5-A73E-47DEECE99DDB}.Debug|x64.ActiveCfg = Release|x64 + {9801D5FF-C1E0-46C5-A73E-47DEECE99DDB}.Debug|x64.Build.0 = Release|x64 + {9801D5FF-C1E0-46C5-A73E-47DEECE99DDB}.Release|Win32.ActiveCfg = Release|Win32 + {9801D5FF-C1E0-46C5-A73E-47DEECE99DDB}.Release|Win32.Build.0 = Release|Win32 + {9801D5FF-C1E0-46C5-A73E-47DEECE99DDB}.Release|x64.ActiveCfg = Release|x64 + {9801D5FF-C1E0-46C5-A73E-47DEECE99DDB}.Release|x64.Build.0 = Release|x64 + {9801D5FF-C1E0-46C5-A73E-47DEECE99DDB}.Release-AVX|Win32.ActiveCfg = Release|Win32 + {9801D5FF-C1E0-46C5-A73E-47DEECE99DDB}.Release-AVX|x64.ActiveCfg = Release|x64 + {9801D5FF-C1E0-46C5-A73E-47DEECE99DDB}.Release-AVX|x64.Build.0 = Release|x64 + {9801D5FF-C1E0-46C5-A73E-47DEECE99DDB}.Release-AVX512|Win32.ActiveCfg = Release|Win32 + {9801D5FF-C1E0-46C5-A73E-47DEECE99DDB}.Release-AVX512|Win32.Build.0 = Release|Win32 + {9801D5FF-C1E0-46C5-A73E-47DEECE99DDB}.Release-AVX512|x64.ActiveCfg = Release|x64 + {9801D5FF-C1E0-46C5-A73E-47DEECE99DDB}.Release-AVX512|x64.Build.0 = Release|x64 + {9801D5FF-C1E0-46C5-A73E-47DEECE99DDB}.Release-SSE2|Win32.ActiveCfg = Release|Win32 + {9801D5FF-C1E0-46C5-A73E-47DEECE99DDB}.Release-SSE2|Win32.Build.0 = Release|Win32 + {9801D5FF-C1E0-46C5-A73E-47DEECE99DDB}.Release-SSE2|x64.ActiveCfg = Release|x64 + {86D92BC4-4C57-42D1-9F63-26ABF811715B}.Debug|Win32.ActiveCfg = Debug|Win32 + {86D92BC4-4C57-42D1-9F63-26ABF811715B}.Debug|x64.ActiveCfg = Debug|x64 + {86D92BC4-4C57-42D1-9F63-26ABF811715B}.Release|Win32.ActiveCfg = Release|Win32 + {86D92BC4-4C57-42D1-9F63-26ABF811715B}.Release|x64.ActiveCfg = Release|x64 + {86D92BC4-4C57-42D1-9F63-26ABF811715B}.Release-AVX|Win32.ActiveCfg = Release|Win32 + {86D92BC4-4C57-42D1-9F63-26ABF811715B}.Release-AVX|x64.ActiveCfg = Release-AVX|x64 + {86D92BC4-4C57-42D1-9F63-26ABF811715B}.Release-AVX512|Win32.ActiveCfg = Release-SSE2|Win32 + {86D92BC4-4C57-42D1-9F63-26ABF811715B}.Release-AVX512|Win32.Build.0 = Release-SSE2|Win32 + {86D92BC4-4C57-42D1-9F63-26ABF811715B}.Release-AVX512|x64.ActiveCfg = Release-AVX512|x64 + {86D92BC4-4C57-42D1-9F63-26ABF811715B}.Release-SSE2|Win32.ActiveCfg = Release-SSE2|Win32 + {86D92BC4-4C57-42D1-9F63-26ABF811715B}.Release-SSE2|x64.ActiveCfg = Release|x64 + {7F9DA615-40A3-43A0-B8BB-528698DDE6E5}.Debug|Win32.ActiveCfg = Debug|Win32 + {7F9DA615-40A3-43A0-B8BB-528698DDE6E5}.Debug|Win32.Build.0 = Debug|Win32 + {7F9DA615-40A3-43A0-B8BB-528698DDE6E5}.Debug|x64.ActiveCfg = Debug|x64 + {7F9DA615-40A3-43A0-B8BB-528698DDE6E5}.Debug|x64.Build.0 = Debug|x64 + {7F9DA615-40A3-43A0-B8BB-528698DDE6E5}.Release|Win32.ActiveCfg = Release|Win32 + {7F9DA615-40A3-43A0-B8BB-528698DDE6E5}.Release|Win32.Build.0 = Release|Win32 + {7F9DA615-40A3-43A0-B8BB-528698DDE6E5}.Release|x64.ActiveCfg = Release|x64 + {7F9DA615-40A3-43A0-B8BB-528698DDE6E5}.Release|x64.Build.0 = Release|x64 + {7F9DA615-40A3-43A0-B8BB-528698DDE6E5}.Release-AVX|Win32.ActiveCfg = Release|Win32 + {7F9DA615-40A3-43A0-B8BB-528698DDE6E5}.Release-AVX|x64.ActiveCfg = Release-AVX|x64 + {7F9DA615-40A3-43A0-B8BB-528698DDE6E5}.Release-AVX|x64.Build.0 = Release-AVX|x64 + {7F9DA615-40A3-43A0-B8BB-528698DDE6E5}.Release-AVX512|Win32.ActiveCfg = Release-SSE2|Win32 + {7F9DA615-40A3-43A0-B8BB-528698DDE6E5}.Release-AVX512|Win32.Build.0 = Release-SSE2|Win32 + {7F9DA615-40A3-43A0-B8BB-528698DDE6E5}.Release-AVX512|x64.ActiveCfg = Release-AVX512|x64 + {7F9DA615-40A3-43A0-B8BB-528698DDE6E5}.Release-AVX512|x64.Build.0 = Release-AVX512|x64 + {7F9DA615-40A3-43A0-B8BB-528698DDE6E5}.Release-SSE2|Win32.ActiveCfg = Release-SSE2|Win32 + {7F9DA615-40A3-43A0-B8BB-528698DDE6E5}.Release-SSE2|Win32.Build.0 = Release-SSE2|Win32 + {7F9DA615-40A3-43A0-B8BB-528698DDE6E5}.Release-SSE2|x64.ActiveCfg = Release|x64 + {F0304A28-E1C7-4F4F-BE1F-DF57936C9664}.Debug|Win32.ActiveCfg = Debug|Win32 + {F0304A28-E1C7-4F4F-BE1F-DF57936C9664}.Debug|Win32.Build.0 = Debug|Win32 + {F0304A28-E1C7-4F4F-BE1F-DF57936C9664}.Debug|x64.ActiveCfg = Debug|x64 + {F0304A28-E1C7-4F4F-BE1F-DF57936C9664}.Debug|x64.Build.0 = Debug|x64 + {F0304A28-E1C7-4F4F-BE1F-DF57936C9664}.Release|Win32.ActiveCfg = Release|Win32 + {F0304A28-E1C7-4F4F-BE1F-DF57936C9664}.Release|Win32.Build.0 = Release|Win32 + {F0304A28-E1C7-4F4F-BE1F-DF57936C9664}.Release|x64.ActiveCfg = Release|x64 + {F0304A28-E1C7-4F4F-BE1F-DF57936C9664}.Release|x64.Build.0 = Release|x64 + {F0304A28-E1C7-4F4F-BE1F-DF57936C9664}.Release-AVX|Win32.ActiveCfg = Release|Win32 + {F0304A28-E1C7-4F4F-BE1F-DF57936C9664}.Release-AVX|x64.ActiveCfg = Release-AVX|x64 + {F0304A28-E1C7-4F4F-BE1F-DF57936C9664}.Release-AVX|x64.Build.0 = Release-AVX|x64 + {F0304A28-E1C7-4F4F-BE1F-DF57936C9664}.Release-AVX512|Win32.ActiveCfg = Release-SSE2|Win32 + {F0304A28-E1C7-4F4F-BE1F-DF57936C9664}.Release-AVX512|Win32.Build.0 = Release-SSE2|Win32 + {F0304A28-E1C7-4F4F-BE1F-DF57936C9664}.Release-AVX512|x64.ActiveCfg = Release-AVX512|x64 + {F0304A28-E1C7-4F4F-BE1F-DF57936C9664}.Release-AVX512|x64.Build.0 = Release-AVX512|x64 + {F0304A28-E1C7-4F4F-BE1F-DF57936C9664}.Release-SSE2|Win32.ActiveCfg = Release-SSE2|Win32 + {F0304A28-E1C7-4F4F-BE1F-DF57936C9664}.Release-SSE2|Win32.Build.0 = Release-SSE2|Win32 + {F0304A28-E1C7-4F4F-BE1F-DF57936C9664}.Release-SSE2|x64.ActiveCfg = Release|x64 + {B1E68128-84D7-4525-A3C1-E6C1077F2239}.Debug|Win32.ActiveCfg = Debug|Win32 + {B1E68128-84D7-4525-A3C1-E6C1077F2239}.Debug|Win32.Build.0 = Debug|Win32 + {B1E68128-84D7-4525-A3C1-E6C1077F2239}.Debug|x64.ActiveCfg = Debug|x64 + {B1E68128-84D7-4525-A3C1-E6C1077F2239}.Debug|x64.Build.0 = Debug|x64 + {B1E68128-84D7-4525-A3C1-E6C1077F2239}.Release|Win32.ActiveCfg = Release|Win32 + {B1E68128-84D7-4525-A3C1-E6C1077F2239}.Release|Win32.Build.0 = Release|Win32 + {B1E68128-84D7-4525-A3C1-E6C1077F2239}.Release|x64.ActiveCfg = Release|x64 + {B1E68128-84D7-4525-A3C1-E6C1077F2239}.Release|x64.Build.0 = Release|x64 + {B1E68128-84D7-4525-A3C1-E6C1077F2239}.Release-AVX|Win32.ActiveCfg = Release|Win32 + {B1E68128-84D7-4525-A3C1-E6C1077F2239}.Release-AVX|x64.ActiveCfg = Release-AVX|x64 + {B1E68128-84D7-4525-A3C1-E6C1077F2239}.Release-AVX|x64.Build.0 = Release-AVX|x64 + {B1E68128-84D7-4525-A3C1-E6C1077F2239}.Release-AVX512|Win32.ActiveCfg = Release-SSE2|Win32 + {B1E68128-84D7-4525-A3C1-E6C1077F2239}.Release-AVX512|Win32.Build.0 = Release-SSE2|Win32 + {B1E68128-84D7-4525-A3C1-E6C1077F2239}.Release-AVX512|x64.ActiveCfg = Release-AVX512|x64 + {B1E68128-84D7-4525-A3C1-E6C1077F2239}.Release-AVX512|x64.Build.0 = Release-AVX512|x64 + {B1E68128-84D7-4525-A3C1-E6C1077F2239}.Release-SSE2|Win32.ActiveCfg = Release-SSE2|Win32 + {B1E68128-84D7-4525-A3C1-E6C1077F2239}.Release-SSE2|Win32.Build.0 = Release-SSE2|Win32 + {B1E68128-84D7-4525-A3C1-E6C1077F2239}.Release-SSE2|x64.ActiveCfg = Release|x64 + {0C227B07-1830-4C5B-8D4E-2DEFFFD2792D}.Debug|Win32.ActiveCfg = Debug|Win32 + {0C227B07-1830-4C5B-8D4E-2DEFFFD2792D}.Debug|Win32.Build.0 = Debug|Win32 + {0C227B07-1830-4C5B-8D4E-2DEFFFD2792D}.Debug|x64.ActiveCfg = Debug|x64 + {0C227B07-1830-4C5B-8D4E-2DEFFFD2792D}.Debug|x64.Build.0 = Debug|x64 + {0C227B07-1830-4C5B-8D4E-2DEFFFD2792D}.Release|Win32.ActiveCfg = Release|Win32 + {0C227B07-1830-4C5B-8D4E-2DEFFFD2792D}.Release|Win32.Build.0 = Release|Win32 + {0C227B07-1830-4C5B-8D4E-2DEFFFD2792D}.Release|x64.ActiveCfg = Release|x64 + {0C227B07-1830-4C5B-8D4E-2DEFFFD2792D}.Release|x64.Build.0 = Release|x64 + {0C227B07-1830-4C5B-8D4E-2DEFFFD2792D}.Release-AVX|Win32.ActiveCfg = Release|Win32 + {0C227B07-1830-4C5B-8D4E-2DEFFFD2792D}.Release-AVX|x64.ActiveCfg = Release-AVX|x64 + {0C227B07-1830-4C5B-8D4E-2DEFFFD2792D}.Release-AVX|x64.Build.0 = Release-AVX|x64 + {0C227B07-1830-4C5B-8D4E-2DEFFFD2792D}.Release-AVX512|Win32.ActiveCfg = Release-SSE2|Win32 + {0C227B07-1830-4C5B-8D4E-2DEFFFD2792D}.Release-AVX512|Win32.Build.0 = Release-SSE2|Win32 + {0C227B07-1830-4C5B-8D4E-2DEFFFD2792D}.Release-AVX512|x64.ActiveCfg = Release-AVX512|x64 + {0C227B07-1830-4C5B-8D4E-2DEFFFD2792D}.Release-AVX512|x64.Build.0 = Release-AVX512|x64 + {0C227B07-1830-4C5B-8D4E-2DEFFFD2792D}.Release-SSE2|Win32.ActiveCfg = Release-SSE2|Win32 + {0C227B07-1830-4C5B-8D4E-2DEFFFD2792D}.Release-SSE2|Win32.Build.0 = Release-SSE2|Win32 + {0C227B07-1830-4C5B-8D4E-2DEFFFD2792D}.Release-SSE2|x64.ActiveCfg = Release|x64 + {D870A978-8130-4D1D-9FB2-3EE2028D2C50}.Debug|Win32.ActiveCfg = Debug|Win32 + {D870A978-8130-4D1D-9FB2-3EE2028D2C50}.Debug|Win32.Build.0 = Debug|Win32 + {D870A978-8130-4D1D-9FB2-3EE2028D2C50}.Debug|x64.ActiveCfg = Debug|x64 + {D870A978-8130-4D1D-9FB2-3EE2028D2C50}.Debug|x64.Build.0 = Debug|x64 + {D870A978-8130-4D1D-9FB2-3EE2028D2C50}.Release|Win32.ActiveCfg = Release|Win32 + {D870A978-8130-4D1D-9FB2-3EE2028D2C50}.Release|Win32.Build.0 = Release|Win32 + {D870A978-8130-4D1D-9FB2-3EE2028D2C50}.Release|x64.ActiveCfg = Release|x64 + {D870A978-8130-4D1D-9FB2-3EE2028D2C50}.Release|x64.Build.0 = Release|x64 + {D870A978-8130-4D1D-9FB2-3EE2028D2C50}.Release-AVX|Win32.ActiveCfg = Release|Win32 + {D870A978-8130-4D1D-9FB2-3EE2028D2C50}.Release-AVX|x64.ActiveCfg = Release-AVX|x64 + {D870A978-8130-4D1D-9FB2-3EE2028D2C50}.Release-AVX|x64.Build.0 = Release-AVX|x64 + {D870A978-8130-4D1D-9FB2-3EE2028D2C50}.Release-AVX512|Win32.ActiveCfg = Release-SSE2|Win32 + {D870A978-8130-4D1D-9FB2-3EE2028D2C50}.Release-AVX512|Win32.Build.0 = Release-SSE2|Win32 + {D870A978-8130-4D1D-9FB2-3EE2028D2C50}.Release-AVX512|x64.ActiveCfg = Release-AVX512|x64 + {D870A978-8130-4D1D-9FB2-3EE2028D2C50}.Release-AVX512|x64.Build.0 = Release-AVX512|x64 + {D870A978-8130-4D1D-9FB2-3EE2028D2C50}.Release-SSE2|Win32.ActiveCfg = Release-SSE2|Win32 + {D870A978-8130-4D1D-9FB2-3EE2028D2C50}.Release-SSE2|Win32.Build.0 = Release-SSE2|Win32 + {D870A978-8130-4D1D-9FB2-3EE2028D2C50}.Release-SSE2|x64.ActiveCfg = Release|x64 + {E7A73E97-7106-4D4A-98BA-AA43FBD19DB4}.Debug|Win32.ActiveCfg = Debug|Win32 + {E7A73E97-7106-4D4A-98BA-AA43FBD19DB4}.Debug|Win32.Build.0 = Debug|Win32 + {E7A73E97-7106-4D4A-98BA-AA43FBD19DB4}.Debug|x64.ActiveCfg = Debug|x64 + {E7A73E97-7106-4D4A-98BA-AA43FBD19DB4}.Debug|x64.Build.0 = Debug|x64 + {E7A73E97-7106-4D4A-98BA-AA43FBD19DB4}.Release|Win32.ActiveCfg = Release|Win32 + {E7A73E97-7106-4D4A-98BA-AA43FBD19DB4}.Release|Win32.Build.0 = Release|Win32 + {E7A73E97-7106-4D4A-98BA-AA43FBD19DB4}.Release|x64.ActiveCfg = Release|x64 + {E7A73E97-7106-4D4A-98BA-AA43FBD19DB4}.Release|x64.Build.0 = Release|x64 + {E7A73E97-7106-4D4A-98BA-AA43FBD19DB4}.Release-AVX|Win32.ActiveCfg = Release|Win32 + {E7A73E97-7106-4D4A-98BA-AA43FBD19DB4}.Release-AVX|x64.ActiveCfg = Release-AVX|x64 + {E7A73E97-7106-4D4A-98BA-AA43FBD19DB4}.Release-AVX|x64.Build.0 = Release-AVX|x64 + {E7A73E97-7106-4D4A-98BA-AA43FBD19DB4}.Release-AVX512|Win32.ActiveCfg = Release-SSE2|Win32 + {E7A73E97-7106-4D4A-98BA-AA43FBD19DB4}.Release-AVX512|Win32.Build.0 = Release-SSE2|Win32 + {E7A73E97-7106-4D4A-98BA-AA43FBD19DB4}.Release-AVX512|x64.ActiveCfg = Release-AVX512|x64 + {E7A73E97-7106-4D4A-98BA-AA43FBD19DB4}.Release-AVX512|x64.Build.0 = Release-AVX512|x64 + {E7A73E97-7106-4D4A-98BA-AA43FBD19DB4}.Release-SSE2|Win32.ActiveCfg = Release-SSE2|Win32 + {E7A73E97-7106-4D4A-98BA-AA43FBD19DB4}.Release-SSE2|Win32.Build.0 = Release-SSE2|Win32 + {E7A73E97-7106-4D4A-98BA-AA43FBD19DB4}.Release-SSE2|x64.ActiveCfg = Release|x64 + {37FDEA25-43CD-4AF0-A232-281E11851E75}.Debug|Win32.ActiveCfg = Debug|Win32 + {37FDEA25-43CD-4AF0-A232-281E11851E75}.Debug|Win32.Build.0 = Debug|Win32 + {37FDEA25-43CD-4AF0-A232-281E11851E75}.Debug|x64.ActiveCfg = Debug|x64 + {37FDEA25-43CD-4AF0-A232-281E11851E75}.Debug|x64.Build.0 = Debug|x64 + {37FDEA25-43CD-4AF0-A232-281E11851E75}.Release|Win32.ActiveCfg = Release|Win32 + {37FDEA25-43CD-4AF0-A232-281E11851E75}.Release|Win32.Build.0 = Release|Win32 + {37FDEA25-43CD-4AF0-A232-281E11851E75}.Release|x64.ActiveCfg = Release|x64 + {37FDEA25-43CD-4AF0-A232-281E11851E75}.Release|x64.Build.0 = Release|x64 + {37FDEA25-43CD-4AF0-A232-281E11851E75}.Release-AVX|Win32.ActiveCfg = Release|Win32 + {37FDEA25-43CD-4AF0-A232-281E11851E75}.Release-AVX|x64.ActiveCfg = Release|x64 + {37FDEA25-43CD-4AF0-A232-281E11851E75}.Release-AVX|x64.Build.0 = Release|x64 + {37FDEA25-43CD-4AF0-A232-281E11851E75}.Release-AVX512|Win32.ActiveCfg = Release|Win32 + {37FDEA25-43CD-4AF0-A232-281E11851E75}.Release-AVX512|Win32.Build.0 = Release|Win32 + {37FDEA25-43CD-4AF0-A232-281E11851E75}.Release-AVX512|x64.ActiveCfg = Release|x64 + {37FDEA25-43CD-4AF0-A232-281E11851E75}.Release-AVX512|x64.Build.0 = Release|x64 + {37FDEA25-43CD-4AF0-A232-281E11851E75}.Release-SSE2|Win32.ActiveCfg = Release|Win32 + {37FDEA25-43CD-4AF0-A232-281E11851E75}.Release-SSE2|Win32.Build.0 = Release|Win32 + {37FDEA25-43CD-4AF0-A232-281E11851E75}.Release-SSE2|x64.ActiveCfg = Release|x64 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(NestedProjects) = preSolution + {9BA806FC-C022-4ACF-A3F1-3EC8CAB45570} = {CB0679D3-62C5-4328-B49F-504E0AA9C65A} + {3780CCDE-4967-4C31-B6A3-3C2570BDD3E4} = {4178148C-8A0C-4EB0-ACD9-0E09676F2700} + {E1EA88AF-6B44-4225-B97B-B485FC9DB23E} = {4178148C-8A0C-4EB0-ACD9-0E09676F2700} + {186BAEF6-CF24-42C1-8CE3-25590CB9F6E7} = {4178148C-8A0C-4EB0-ACD9-0E09676F2700} + {8BB067C4-7135-4643-863C-49C520BEEA01} = {4178148C-8A0C-4EB0-ACD9-0E09676F2700} + {72793DF1-D4AF-4AA0-A606-7B51ED2A3F5C} = {4A043885-D401-40B2-9375-1C57136F03F6} + {851C772C-D7C2-4EE3-A90C-23386F0E9897} = {5319B36D-2906-4EAF-B623-B7C04F3CC2AD} + {3B6BB403-FC72-45FF-A431-9295A1AEB7A3} = {CB0679D3-62C5-4328-B49F-504E0AA9C65A} + {C6D9B754-11EB-4FC3-8683-593B53E9AD1F} = {5319B36D-2906-4EAF-B623-B7C04F3CC2AD} + {C6D9B754-11EB-4FC3-8683-593B2377D043} = {5319B36D-2906-4EAF-B623-B7C04F3CC2AD} + {C6D9B754-11EB-4FC3-8683-593BFD58C904} = {5319B36D-2906-4EAF-B623-B7C04F3CC2AD} + {10B193D4-E27B-4438-A825-BFB3D2B4C74D} = {31AFDB3C-8769-49DF-9C9E-2013E194D983} + {35A2DC31-84BC-4F7A-9C93-1D072432AD79} = {31AFDB3C-8769-49DF-9C9E-2013E194D983} + {7DF42126-D237-41D3-9ABE-A3ACC8BAC56E} = {30F7FB89-B9D5-473E-A14D-6A00700C1EA9} + {C46B9A53-86D8-4B7F-AB15-B2C04518A195} = {30F7FB89-B9D5-473E-A14D-6A00700C1EA9} + {76ADDB29-9C6A-442C-9BA9-764C050F75DD} = {30F7FB89-B9D5-473E-A14D-6A00700C1EA9} + {9EDB5C0F-BFD0-4A59-BB93-F06A52BB0128} = {30F7FB89-B9D5-473E-A14D-6A00700C1EA9} + {39C65232-04FB-4622-8283-34829739887C} = {30F7FB89-B9D5-473E-A14D-6A00700C1EA9} + {9801D5FF-C1E0-46C5-A73E-47DEECE99DDB} = {30F7FB89-B9D5-473E-A14D-6A00700C1EA9} + {86D92BC4-4C57-42D1-9F63-26ABF811715B} = {5319B36D-2906-4EAF-B623-B7C04F3CC2AD} + {7F9DA615-40A3-43A0-B8BB-528698DDE6E5} = {5319B36D-2906-4EAF-B623-B7C04F3CC2AD} + {F0304A28-E1C7-4F4F-BE1F-DF57936C9664} = {5319B36D-2906-4EAF-B623-B7C04F3CC2AD} + {B1E68128-84D7-4525-A3C1-E6C1077F2239} = {5319B36D-2906-4EAF-B623-B7C04F3CC2AD} + {0C227B07-1830-4C5B-8D4E-2DEFFFD2792D} = {5319B36D-2906-4EAF-B623-B7C04F3CC2AD} + {D870A978-8130-4D1D-9FB2-3EE2028D2C50} = {31AFDB3C-8769-49DF-9C9E-2013E194D983} + {E7A73E97-7106-4D4A-98BA-AA43FBD19DB4} = {5319B36D-2906-4EAF-B623-B7C04F3CC2AD} + {37FDEA25-43CD-4AF0-A232-281E11851E75} = {CB0679D3-62C5-4328-B49F-504E0AA9C65A} + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {072CB211-63C3-403B-BF4D-ED161D3C460C} + EndGlobalSection +EndGlobal diff --git a/windows/vs2015/povray.vcxproj b/windows/vs2022/povray.vcxproj similarity index 86% rename from windows/vs2015/povray.vcxproj rename to windows/vs2022/povray.vcxproj index 80e1a0ea5..feb5193e5 100644 --- a/windows/vs2015/povray.vcxproj +++ b/windows/vs2022/povray.vcxproj @@ -33,52 +33,70 @@ Release-AVX x64 + + Release-AVX512 + Win32 + + + Release-AVX512 + x64 + GUI {9BA806FC-C022-4ACF-A3F1-3EC8CAB45570} povwin + 10.0.20348.0 Application false - v140 + v143 Application false - v140 + v143 Application false true - v140 + v143 Application false true - v140 + v143 Application false true - v140 + v143 Application false true - v140 + v143 + + + Application + false + true + v143 - v140 + v143 + + + v143 - v140 + v143 @@ -102,6 +120,10 @@ + + + + bin32\ @@ -133,6 +155,11 @@ build\$(ProjectName)\$(Platform)\$(Configuration)\ pvengine$(ConfigTag) + + bin64\ + build\$(ProjectName)\$(Platform)\$(Configuration)\ + pvengine$(ConfigTag) + <_ProjectFileVersion>10.0.30319.1 @@ -502,6 +529,67 @@ ..\pvengine64.manifest;%(AdditionalManifestFiles) + + + NDEBUG;%(PreprocessorDefinitions) + true + true + X64 + + + Full + AnySuitable + true + Speed + true + ..\..\internal\windows;..\..\platform\x86;..\..\platform\windows;..\..\windows\povconfig;..\..\libraries\boost;..\rtrsupport;..\..\vfe\win;..\..\vfe;..\;..\..\source;..\..\libraries\jpeg;..\..\libraries\zlib;..\..\libraries\png;..\..\libraries\tiff\libtiff;%(AdditionalIncludeDirectories) + $(PovBuildDefs)BOOST_ALL_NO_LIB;NDEBUG;WIN32;WIN32_LEAN_AND_MEAN;_WINDOWS;CLASSLIB_DEFS_H;NOMINMAX;ISOLATION_AWARE_ENABLED;_CRT_SECURE_NO_DEPRECATE;_SECURE_SCL=0;BUILDING_AMD64=1;COMMONCTRL_VERSION=0x500;_WIN32_WINNT=0x0501;%(PreprocessorDefinitions) + true + Sync + MultiThreaded + false + false + NotSet + Precise + true + true + Use + winprecomp.h + $(IntDir)winprecomp.pch + true + $(IntDir) + Level3 + true + ProgramDatabase + Default + 4800;%(DisableSpecificWarnings) + winprecomp.h;%(ForcedIncludeFiles) + + + NDEBUG;%(PreprocessorDefinitions) + 0x0409 + + + comctl32.lib;gdi32.lib;user32.lib;kernel32.lib;advapi32.lib;shell32.lib;%(AdditionalDependencies) + true + %(IgnoreSpecificDefaultLibraries) + true + $(OutDir)$(TargetName).pdb + Windows + 67108864 + true + POVWINStartup + true + false + false + + + MachineX64 + + + ..\pvengine64.manifest;%(AdditionalManifestFiles) + + @@ -546,6 +634,7 @@ ..\..\source ..\..\source ..\..\source + ..\..\source @@ -584,6 +673,7 @@ Create Create Create + Create diff --git a/windows/vs2015/povray.vcxproj.filters b/windows/vs2022/povray.vcxproj.filters similarity index 100% rename from windows/vs2015/povray.vcxproj.filters rename to windows/vs2022/povray.vcxproj.filters diff --git a/windows/vs2015/povray64-avx.props b/windows/vs2022/povray64-avx.props similarity index 100% rename from windows/vs2015/povray64-avx.props rename to windows/vs2022/povray64-avx.props diff --git a/windows/vs2022/povray64-avx512.props b/windows/vs2022/povray64-avx512.props new file mode 100644 index 000000000..4c8b6e0a2 --- /dev/null +++ b/windows/vs2022/povray64-avx512.props @@ -0,0 +1,21 @@ + + + + + 64-avx512 + + + <_PropertySheetDisplayName>POV-Ray 64-bit AVX512 Optimization + + + + BUILD_AVX512=1;%(PreprocessorDefinitions) + /arch:AVX512 %(AdditionalOptions) + + + + + $(ConfigTag) + + + \ No newline at end of file diff --git a/windows/vs2015/povvm.vcxproj b/windows/vs2022/povvm.vcxproj similarity index 83% rename from windows/vs2015/povvm.vcxproj rename to windows/vs2022/povvm.vcxproj index 4cc830d31..a7910ee84 100644 --- a/windows/vs2015/povvm.vcxproj +++ b/windows/vs2022/povvm.vcxproj @@ -33,51 +33,69 @@ Release-AVX x64 + + Release-AVX512 + Win32 + + + Release-AVX512 + x64 + {E7A73E97-7106-4D4A-98BA-AA43FBD19DB4} pov_vm + 10.0.20348.0 StaticLibrary false - v140 + v143 StaticLibrary false - v140 + v143 StaticLibrary false true - v140 + v143 StaticLibrary false true - v140 + v143 StaticLibrary false true - v140 + v143 StaticLibrary false true - v140 + v143 + + + StaticLibrary + false + true + v143 - v140 + v143 + + + v143 - v140 + v143 @@ -101,6 +119,10 @@ + + + + bin32\lib\ @@ -132,6 +154,11 @@ build\$(ProjectName)\$(Platform)\$(Configuration)\ $(ProjectName)$(ConfigTag) + + bin64\lib\ + build\$(ProjectName)\$(Platform)\$(Configuration)\ + $(ProjectName)$(ConfigTag) + <_ProjectFileVersion>10.0.30319.1 @@ -398,6 +425,51 @@ $(OutDir)$(TargetName)$(TargetExt) + + + NDEBUG;%(PreprocessorDefinitions) + true + true + X64 + + + Full + AnySuitable + true + Speed + false + false + ..\..\internal\windows;..\..\platform\x86;..\..\platform\windows;..\..\windows\povconfig;..\..\libraries\boost;..\..\vfe\win\;..\..\vfe\;..\..\source;%(AdditionalIncludeDirectories) + $(PovBuildDefs)BOOST_ALL_NO_LIB;NDEBUG;WIN32;WIN32_LEAN_AND_MEAN;_WINDOWS;CLASSLIB_DEFS_H;NOMINMAX;ISOLATION_AWARE_ENABLED;_CRT_SECURE_NO_DEPRECATE;_SECURE_SCL=0;BUILDING_AMD64=1;%(PreprocessorDefinitions) + true + Sync + MultiThreaded + false + NotSet + Precise + false + true + true + Use + precomp.h + $(IntDir)precomp.pch + true + $(IntDir) + Level3 + true + ProgramDatabase + Default + 4800;4355;%(DisableSpecificWarnings) + precomp.h;%(ForcedIncludeFiles) + + + NDEBUG;%(PreprocessorDefinitions) + 0x0409 + + + $(OutDir)$(TargetName)$(TargetExt) + + @@ -408,6 +480,7 @@ Create Create Create + Create diff --git a/windows/vs2015/povvm.vcxproj.filters b/windows/vs2022/povvm.vcxproj.filters similarity index 100% rename from windows/vs2015/povvm.vcxproj.filters rename to windows/vs2022/povvm.vcxproj.filters diff --git a/windows/vs2015/rtrsupport.vcxproj b/windows/vs2022/rtrsupport.vcxproj similarity index 83% rename from windows/vs2015/rtrsupport.vcxproj rename to windows/vs2022/rtrsupport.vcxproj index 1a0e39102..634f4938b 100644 --- a/windows/vs2015/rtrsupport.vcxproj +++ b/windows/vs2022/rtrsupport.vcxproj @@ -33,51 +33,69 @@ Release-AVX x64 + + Release-AVX512 + Win32 + + + Release-AVX512 + x64 + {851C772C-D7C2-4EE3-A90C-23386F0E9897} rtrsupport + 10.0.20348.0 StaticLibrary false - v140 + v143 StaticLibrary false - v140 + v143 StaticLibrary false true - v140 + v143 StaticLibrary false true - v140 + v143 StaticLibrary false true - v140 + v143 StaticLibrary false true - v140 + v143 + + + StaticLibrary + false + true + v143 - v140 + v143 + + + v143 - v140 + v143 @@ -101,6 +119,10 @@ + + + + bin32\lib\ @@ -132,6 +154,11 @@ build\$(ProjectName)\$(Platform)\$(Configuration)\ $(ProjectName)$(ConfigTag) + + bin64\lib\ + build\$(ProjectName)\$(Platform)\$(Configuration)\ + $(ProjectName)$(ConfigTag) + <_ProjectFileVersion>10.0.30319.1 @@ -305,6 +332,34 @@ $(IntDir);%(AdditionalIncludeDirectories) + + + NDEBUG;%(PreprocessorDefinitions) + false + X64 + + + Full + true + ..\..\internal\windows;..\..\platform\x86;..\..\platform\windows;..\..\windows\povconfig;..\..\libraries\boost;..\..\vfe\win;..\..\vfe;..\;..\..\source;..\..\source\base;..\..\source\backend;..\..\source\frontend;..\..\libraries\jpeg;..\..\libraries\zlib;..\..\libraries\png;..\..\libraries\tiff\libtiff;%(AdditionalIncludeDirectories) + $(PovBuildDefs)BOOST_ALL_NO_LIB;WIN32;WIN32_LEAN_AND_MEAN;_WINDOWS;NDEBUG;ISOLATION_AWARE_ENABLED;_CRT_SECURE_NO_DEPRECATE;_SECURE_SCL=0;_CRT_NON_CONFORMING_SWPRINTFS;_WIN32_DCOM;WINVER=0x0500;_WIN32_WINNT=0x0500;COMMONCTRL_VERSION=0x500;CLASSLIB_DEFS_H;NOMINMAX;BUILDING_AMD64;%(PreprocessorDefinitions) + true + true + Sync + MultiThreaded + false + true + $(IntDir) + Level3 + ProgramDatabase + 4995;%(DisableSpecificWarnings) + + + NDEBUG;%(PreprocessorDefinitions) + 0x0c09 + $(IntDir);%(AdditionalIncludeDirectories) + + diff --git a/windows/vs2015/rtrsupport.vcxproj.filters b/windows/vs2022/rtrsupport.vcxproj.filters similarity index 100% rename from windows/vs2015/rtrsupport.vcxproj.filters rename to windows/vs2022/rtrsupport.vcxproj.filters diff --git a/windows/vs2015/tests.vcxproj b/windows/vs2022/tests.vcxproj similarity index 83% rename from windows/vs2015/tests.vcxproj rename to windows/vs2022/tests.vcxproj index bdbe343e0..189d5325b 100644 --- a/windows/vs2015/tests.vcxproj +++ b/windows/vs2022/tests.vcxproj @@ -33,57 +33,76 @@ Release-AVX x64 + + Release-AVX512 + Win32 + + + Release-AVX512 + x64 + {86D92BC4-4C57-42D1-9F63-26ABF811715B} tests + 10.0.20348.0 Application true MultiByte - v140 + v143 Application true MultiByte - v140 + v143 Application false MultiByte true - v140 + v143 Application false MultiByte true - v140 + v143 Application false MultiByte true - v140 + v143 Application false MultiByte true - v140 + v143 + + + Application + false + MultiByte + true + v143 - v140 + v143 + + + v143 - v140 + v143 @@ -107,6 +126,10 @@ + + + + bin32\ @@ -139,6 +162,11 @@ build\$(ProjectName)\$(Platform)\$(Configuration)\ povtests$(ConfigTag) + + bin64\ + build\$(ProjectName)\$(Platform)\$(Configuration)\ + povtests$(ConfigTag) + <_ProjectFileVersion>10.0.30319.1 @@ -277,6 +305,30 @@ Running Unit Tests + + + Full + Speed + true + ..\..\platform\windows;..\..\internal\windows;..\..\windows\povconfig;..\..\libraries\boost;..\..\vfe\win;..\..\vfe;..\;..\..\source;..\..\source\base;..\..\source\backend;..\..\source\frontend;..\..\source\tests;..\..\libraries\jpeg;..\..\libraries\zlib;..\..\libraries\png;..\..\libraries\tiff\libtiff;%(AdditionalIncludeDirectories) + $(PovBuildDefs)BOOST_ALL_NO_LIB;NDEBUG;WIN32;WIN32_LEAN_AND_MEAN;_WINDOWS;CLASSLIB_DEFS_H;NOMINMAX;ISOLATION_AWARE_ENABLED;_CRT_SECURE_NO_DEPRECATE;_SECURE_SCL=0;BUILDING_AMD64=1;COMMONCTRL_VERSION=0x500;_WIN32_WINNT=0x0500;%(PreprocessorDefinitions) + Async + MultiThreaded + Level3 + + + true + Console + MachineX64 + + + "$(TargetPath)" --result_code=no --log_level=test_suite --report_level=detailed --catch_system_errors=no --auto_start_dbg + + + Running Unit Tests + + + {d870a978-8130-4d1d-9fb2-3ee2028d2c50} diff --git a/windows/vs2015/tests.vcxproj.filters b/windows/vs2022/tests.vcxproj.filters similarity index 100% rename from windows/vs2015/tests.vcxproj.filters rename to windows/vs2022/tests.vcxproj.filters diff --git a/windows/vs2015/tifconf.mak b/windows/vs2022/tifconf.mak similarity index 100% rename from windows/vs2015/tifconf.mak rename to windows/vs2022/tifconf.mak diff --git a/windows/vs2015/tiff.vcxproj b/windows/vs2022/tiff.vcxproj similarity index 85% rename from windows/vs2015/tiff.vcxproj rename to windows/vs2022/tiff.vcxproj index 372ed8fc7..d3a456c4e 100644 --- a/windows/vs2015/tiff.vcxproj +++ b/windows/vs2022/tiff.vcxproj @@ -33,55 +33,73 @@ Release-AVX x64 + + Release-AVX512 + Win32 + + + Release-AVX512 + x64 + {186BAEF6-CF24-42C1-8CE3-25590CB9F6E7} tiff + 10.0.20348.0 StaticLibrary false MultiByte - v140 + v143 StaticLibrary false MultiByte - v140 + v143 StaticLibrary false MultiByte true - v140 + v143 StaticLibrary false MultiByte - v140 + v143 StaticLibrary false MultiByte true - v140 + v143 StaticLibrary false MultiByte - v140 + v143 + + + StaticLibrary + false + MultiByte + v143 - v140 + v143 + + + v143 - v140 + v143 @@ -105,6 +123,10 @@ + + + + bin32\lib\ @@ -136,6 +158,11 @@ build\$(ProjectName)\$(Platform)\$(Configuration)\ $(ProjectName)$(ConfigTag) + + bin64\lib\ + build\$(ProjectName)\$(Platform)\$(Configuration)\ + $(ProjectName)$(ConfigTag) + <_ProjectFileVersion>10.0.30319.1 @@ -349,6 +376,42 @@ true + + + nmake tifconf.mak + + + X64 + + + MaxSpeed + OnlyExplicitInline + ..\..\libraries\jpeg;..\..\libraries\zlib;%(AdditionalIncludeDirectories) + WIN32;WIN32_LEAN_AND_MEAN;NDEBUG;_LIB;USE_WIN32_FILEIO;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions) + true + Sync + MultiThreaded + false + false + + + + + true + $(IntDir) + Level2 + ProgramDatabase + Default + 4133;4005 + + + NDEBUG;%(PreprocessorDefinitions) + 0x0409 + + + true + + diff --git a/windows/vs2015/tiff.vcxproj.filters b/windows/vs2022/tiff.vcxproj.filters similarity index 100% rename from windows/vs2015/tiff.vcxproj.filters rename to windows/vs2022/tiff.vcxproj.filters diff --git a/windows/vs2015/vfewin.vcxproj b/windows/vs2022/vfewin.vcxproj similarity index 84% rename from windows/vs2015/vfewin.vcxproj rename to windows/vs2022/vfewin.vcxproj index 062b19fe2..566c620ad 100644 --- a/windows/vs2015/vfewin.vcxproj +++ b/windows/vs2022/vfewin.vcxproj @@ -33,52 +33,70 @@ Release-AVX x64 + + Release-AVX512 + Win32 + + + Release-AVX512 + x64 + {72793DF1-D4AF-4AA0-A606-7B51ED2A3F5C} vfewin Win32Proj + 10.0.20348.0 StaticLibrary false - v140 + v143 StaticLibrary false - v140 + v143 StaticLibrary false true - v140 + v143 StaticLibrary false true - v140 + v143 StaticLibrary false true - v140 + v143 StaticLibrary false true - v140 + v143 + + + StaticLibrary + false + true + v143 - v140 + v143 + + + v143 - v140 + v143 @@ -102,6 +120,10 @@ + + + + bin32\lib\ @@ -133,6 +155,11 @@ build\$(ProjectName)\$(Platform)\$(Configuration)\ vfe$(ConfigTag) + + bin64\lib\ + build\$(ProjectName)\$(Platform)\$(Configuration)\ + vfe$(ConfigTag) + <_ProjectFileVersion>10.0.30319.1 @@ -384,6 +411,47 @@ 0x0409 + + + NDEBUG;%(PreprocessorDefinitions) + true + true + X64 + $(Configuration)/povray.tlb + + + Full + AnySuitable + true + Speed + ..\..\internal\windows;..\..\platform\x86;..\..\platform\windows;..\..\windows\povconfig;..\..\libraries\boost;..\..\vfe\win\;..\..\vfe;..\..\source;..\..\source\base;..\..\source\backend;..\..\source\frontend;..\..\libraries\jpeg;..\..\libraries\zlib;..\..\libraries\png;..\..\libraries\tiff\libtiff;%(AdditionalIncludeDirectories) + $(PovBuildDefs)BOOST_ALL_NO_LIB;NDEBUG;WIN32;WIN32_LEAN_AND_MEAN;_WINDOWS;CLASSLIB_DEFS_H;NOMINMAX;ISOLATION_AWARE_ENABLED;_CRT_SECURE_NO_DEPRECATE;_SECURE_SCL=0;BUILDING_AMD64=1;COMMONCTRL_VERSION=0x500;_WIN32_WINNT=0x0500;%(PreprocessorDefinitions) + true + true + Sync + MultiThreaded + false + false + NotSet + true + true + Use + vfeprecomp.h + $(IntDir)vfeprecomp.pch + $(IntDir)$(ProjectName).pdb + true + Level3 + true + ProgramDatabase + Default + 4800;%(DisableSpecificWarnings) + vfeprecomp.h;%(ForcedIncludeFiles) + + + NDEBUG;%(PreprocessorDefinitions) + 0x0409 + + @@ -398,6 +466,7 @@ Create Create Create + Create diff --git a/windows/vs2015/vfewin.vcxproj.filters b/windows/vs2022/vfewin.vcxproj.filters similarity index 100% rename from windows/vs2015/vfewin.vcxproj.filters rename to windows/vs2022/vfewin.vcxproj.filters diff --git a/windows/vs2015/zlib.vcxproj b/windows/vs2022/zlib.vcxproj similarity index 83% rename from windows/vs2015/zlib.vcxproj rename to windows/vs2022/zlib.vcxproj index 60da569b7..4a53b8364 100644 --- a/windows/vs2015/zlib.vcxproj +++ b/windows/vs2022/zlib.vcxproj @@ -33,49 +33,66 @@ Release-AVX x64 + + Release-AVX512 + Win32 + + + Release-AVX512 + x64 + {8BB067C4-7135-4643-863C-49C520BEEA01} zlib + 10.0.20348.0 StaticLibrary false - v140 + v143 StaticLibrary false - v140 + v143 StaticLibrary false true - v140 + v143 StaticLibrary false - v140 + v143 StaticLibrary false true - v140 + v143 StaticLibrary false - v140 + v143 + + + StaticLibrary + false + v143 - v140 + v143 + + + v143 - v140 + v143 @@ -99,6 +116,10 @@ + + + + bin32\lib\ @@ -130,6 +151,11 @@ build\$(ProjectName)\$(Platform)\$(Configuration)\ $(ProjectName)$(ConfigTag) + + bin64\lib\ + build\$(ProjectName)\$(Platform)\$(Configuration)\ + $(ProjectName)$(ConfigTag) + <_ProjectFileVersion>10.0.30319.1 @@ -299,6 +325,35 @@ true + + + X64 + + + MaxSpeed + OnlyExplicitInline + WIN32;WIN32_LEAN_AND_MEAN;NDEBUG;_WINDOWS;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions) + true + Sync + MultiThreaded + false + false + + + + + true + $(IntDir) + Level2 + true + + + 0x0409 + + + true + + diff --git a/windows/vs2015/zlib.vcxproj.filters b/windows/vs2022/zlib.vcxproj.filters similarity index 100% rename from windows/vs2015/zlib.vcxproj.filters rename to windows/vs2022/zlib.vcxproj.filters