From e26c5c424accc2feeff7c197213288dfae44c7ad Mon Sep 17 00:00:00 2001 From: Srihari-mcw Date: Mon, 5 Dec 2022 15:53:30 -0800 Subject: [PATCH 1/6] Add updates for AVX512 version of POV-RAY --- .../ADDITIONAL_README_FOR_AVX512_Version.md | 65 + ...X512 - AMD 7600X and Intel I5-1035 G1.xlsx | Bin 0 -> 25292 bytes platform/x86/avx512/avx512noise.cpp | 1435 +++++++++++++++++ platform/x86/avx512/avx512noise.h | 73 + platform/x86/cpuid.cpp | 25 + platform/x86/cpuid.h | 1 + platform/x86/optimizednoise.cpp | 57 + source/core/material/noise.cpp | 190 ++- source/core/material/noise.h | 57 +- source/core/material/normal.cpp | 36 +- source/core/material/normal.h | 10 +- source/core/material/pattern.cpp | 164 +- source/core/material/pattern.h | 59 +- source/parser/parser_materials.cpp | 12 +- unix/configure.ac | 2 + unix/povconfig/syspovconfig.h | 21 + unix/prebuild.sh | 10 +- windows/README.md | 31 +- windows/cmedit/StdString.h | 2 +- windows/povconfig/syspovconfig.h | 5 +- windows/povconfig/syspovconfig_msvc.h | 11 +- windows/{vs2015 => vs2022}/StepOver.reg | Bin windows/{vs2015 => vs2022}/autoexp.dat | 0 .../boost_date_time.vcxproj | 68 +- .../boost_date_time.vcxproj.filters | 0 .../{vs2015 => vs2022}/boost_system.vcxproj | 68 +- .../boost_system.vcxproj.filters | 0 .../{vs2015 => vs2022}/boost_thread.vcxproj | 69 +- .../boost_thread.vcxproj.filters | 0 windows/{vs2015 => vs2022}/cmedit.vcxproj | 9 +- .../{vs2015 => vs2022}/cmedit.vcxproj.filters | 0 windows/{vs2015 => vs2022}/console.vcxproj | 79 +- .../console.vcxproj.filters | 0 windows/{vs2015 => vs2022}/jpeg.vcxproj | 74 +- .../{vs2015 => vs2022}/jpeg.vcxproj.filters | 0 windows/{vs2015 => vs2022}/libpng.vcxproj | 73 +- .../{vs2015 => vs2022}/openexr_Half.vcxproj | 66 +- .../openexr_Half.vcxproj.filters | 0 .../{vs2015 => vs2022}/openexr_Iex.vcxproj | 66 +- .../openexr_Iex.vcxproj.filters | 0 .../{vs2015 => vs2022}/openexr_IlmImf.vcxproj | 67 +- .../openexr_IlmImf.vcxproj.filters | 0 .../openexr_IlmThread.vcxproj | 66 +- .../openexr_IlmThread.vcxproj.filters | 0 .../{vs2015 => vs2022}/openexr_eLut.vcxproj | 5 +- .../openexr_eLut.vcxproj.filters | 0 .../openexr_toFloat.vcxproj | 5 +- .../openexr_toFloat.vcxproj.filters | 0 windows/{vs2015 => vs2022}/povbackend.vcxproj | 89 +- .../povbackend.vcxproj.filters | 0 windows/{vs2015 => vs2022}/povbase.vcxproj | 88 +- .../povbase.vcxproj.filters | 0 windows/{vs2015 => vs2022}/povcore.vcxproj | 89 +- .../povcore.vcxproj.filters | 0 .../{vs2015 => vs2022}/povfrontend.vcxproj | 86 +- .../povfrontend.vcxproj.filters | 0 windows/{vs2015 => vs2022}/povms.vcxproj | 87 +- .../{vs2015 => vs2022}/povms.vcxproj.filters | 0 windows/{vs2015 => vs2022}/povparser.vcxproj | 89 +- .../povparser.vcxproj.filters | 0 .../{vs2015 => vs2022}/povplatform.vcxproj | 105 +- .../povplatform.vcxproj.filters | 6 + windows/{vs2015 => vs2022}/povray.sln | 123 +- windows/{vs2015 => vs2022}/povray.vcxproj | 106 +- .../{vs2015 => vs2022}/povray.vcxproj.filters | 0 windows/{vs2015 => vs2022}/povray64-avx.props | 0 windows/{vs2015 => vs2022}/povvm.vcxproj | 89 +- .../{vs2015 => vs2022}/povvm.vcxproj.filters | 0 windows/{vs2015 => vs2022}/rtrsupport.vcxproj | 71 +- .../rtrsupport.vcxproj.filters | 0 windows/{vs2015 => vs2022}/tests.vcxproj | 68 +- .../{vs2015 => vs2022}/tests.vcxproj.filters | 0 windows/{vs2015 => vs2022}/tifconf.mak | 0 windows/{vs2015 => vs2022}/tiff.vcxproj | 79 +- .../{vs2015 => vs2022}/tiff.vcxproj.filters | 0 windows/{vs2015 => vs2022}/vfewin.vcxproj | 85 +- .../{vs2015 => vs2022}/vfewin.vcxproj.filters | 0 windows/{vs2015 => vs2022}/zlib.vcxproj | 71 +- .../{vs2015 => vs2022}/zlib.vcxproj.filters | 0 79 files changed, 4052 insertions(+), 260 deletions(-) create mode 100644 avx512_build_setup/ADDITIONAL_README_FOR_AVX512_Version.md create mode 100644 avx512_build_setup/POVRAY Compiled Results - AVX512 - AMD 7600X and Intel I5-1035 G1.xlsx create mode 100644 platform/x86/avx512/avx512noise.cpp create mode 100644 platform/x86/avx512/avx512noise.h rename windows/{vs2015 => vs2022}/StepOver.reg (100%) rename windows/{vs2015 => vs2022}/autoexp.dat (100%) rename windows/{vs2015 => vs2022}/boost_date_time.vcxproj (82%) rename windows/{vs2015 => vs2022}/boost_date_time.vcxproj.filters (100%) rename windows/{vs2015 => vs2022}/boost_system.vcxproj (82%) rename windows/{vs2015 => vs2022}/boost_system.vcxproj.filters (100%) rename windows/{vs2015 => vs2022}/boost_thread.vcxproj (82%) rename windows/{vs2015 => vs2022}/boost_thread.vcxproj.filters (100%) rename windows/{vs2015 => vs2022}/cmedit.vcxproj (98%) rename windows/{vs2015 => vs2022}/cmedit.vcxproj.filters (100%) rename windows/{vs2015 => vs2022}/console.vcxproj (85%) rename windows/{vs2015 => vs2022}/console.vcxproj.filters (100%) rename windows/{vs2015 => vs2022}/jpeg.vcxproj (85%) rename windows/{vs2015 => vs2022}/jpeg.vcxproj.filters (100%) rename windows/{vs2015 => vs2022}/libpng.vcxproj (83%) rename windows/{vs2015 => vs2022}/openexr_Half.vcxproj (83%) rename windows/{vs2015 => vs2022}/openexr_Half.vcxproj.filters (100%) rename windows/{vs2015 => vs2022}/openexr_Iex.vcxproj (83%) rename windows/{vs2015 => vs2022}/openexr_Iex.vcxproj.filters (100%) rename windows/{vs2015 => vs2022}/openexr_IlmImf.vcxproj (90%) rename windows/{vs2015 => vs2022}/openexr_IlmImf.vcxproj.filters (100%) rename windows/{vs2015 => vs2022}/openexr_IlmThread.vcxproj (83%) rename windows/{vs2015 => vs2022}/openexr_IlmThread.vcxproj.filters (100%) rename windows/{vs2015 => vs2022}/openexr_eLut.vcxproj (96%) rename windows/{vs2015 => vs2022}/openexr_eLut.vcxproj.filters (100%) rename windows/{vs2015 => vs2022}/openexr_toFloat.vcxproj (96%) rename windows/{vs2015 => vs2022}/openexr_toFloat.vcxproj.filters (100%) rename windows/{vs2015 => vs2022}/povbackend.vcxproj (85%) rename windows/{vs2015 => vs2022}/povbackend.vcxproj.filters (100%) rename windows/{vs2015 => vs2022}/povbase.vcxproj (86%) rename windows/{vs2015 => vs2022}/povbase.vcxproj.filters (100%) rename windows/{vs2015 => vs2022}/povcore.vcxproj (87%) rename windows/{vs2015 => vs2022}/povcore.vcxproj.filters (100%) rename windows/{vs2015 => vs2022}/povfrontend.vcxproj (84%) rename windows/{vs2015 => vs2022}/povfrontend.vcxproj.filters (100%) rename windows/{vs2015 => vs2022}/povms.vcxproj (84%) rename windows/{vs2015 => vs2022}/povms.vcxproj.filters (100%) rename windows/{vs2015 => vs2022}/povparser.vcxproj (84%) rename windows/{vs2015 => vs2022}/povparser.vcxproj.filters (100%) rename windows/{vs2015 => vs2022}/povplatform.vcxproj (79%) rename windows/{vs2015 => vs2022}/povplatform.vcxproj.filters (93%) rename windows/{vs2015 => vs2022}/povray.sln (78%) rename windows/{vs2015 => vs2022}/povray.vcxproj (86%) rename windows/{vs2015 => vs2022}/povray.vcxproj.filters (100%) rename windows/{vs2015 => vs2022}/povray64-avx.props (100%) rename windows/{vs2015 => vs2022}/povvm.vcxproj (83%) rename windows/{vs2015 => vs2022}/povvm.vcxproj.filters (100%) rename windows/{vs2015 => vs2022}/rtrsupport.vcxproj (83%) rename windows/{vs2015 => vs2022}/rtrsupport.vcxproj.filters (100%) rename windows/{vs2015 => vs2022}/tests.vcxproj (83%) rename windows/{vs2015 => vs2022}/tests.vcxproj.filters (100%) rename windows/{vs2015 => vs2022}/tifconf.mak (100%) rename windows/{vs2015 => vs2022}/tiff.vcxproj (85%) rename windows/{vs2015 => vs2022}/tiff.vcxproj.filters (100%) rename windows/{vs2015 => vs2022}/vfewin.vcxproj (84%) rename windows/{vs2015 => vs2022}/vfewin.vcxproj.filters (100%) rename windows/{vs2015 => vs2022}/zlib.vcxproj (83%) rename windows/{vs2015 => vs2022}/zlib.vcxproj.filters (100%) 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..a72f96472 --- /dev/null +++ b/avx512_build_setup/ADDITIONAL_README_FOR_AVX512_Version.md @@ -0,0 +1,65 @@ +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) +3. In syspovconfig.h(windows/povconfig/syspovconfig.h) uncomment the #define _CONSOLE. (line 56) + The AVX512 version was developed with the console version. + The GUI build has been skipped in the solution file. + **Note:** (Presently with the updated code the GUI project is skipped for building, + as the cmedit64.dll and povcmax64.dll from official windows distribution are + incompatible with VS2022. The console version alone is available to build and test). +4. Build the solution file and in the vs2022/bin64 folder we can run the POVRAY examples with povconsole-avx512.exe. +``` + General command example - povconsole-avx512.exe +Ibenchmark.pov + Single worker thread - povconsole-avx512.exe +WT1 benchmark.pov + Output image - benchmark.png +``` +5. 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.xlsx b/avx512_build_setup/POVRAY Compiled Results - AVX512 - AMD 7600X and Intel I5-1035 G1.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..777931598dd60b982ab80660a4cd63df686149b4 GIT binary patch literal 25292 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 literal 0 HcmV?d00001 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..693b53e89 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 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..b35ed1ce3 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 @@ -103,6 +103,9 @@ Build Steps make unofficial versions distinguishable from each other. Remove the `#error` directive afterwards to proceed with the build. Note that if you do not do this you will get compile errors. + **Note:** (Presently with the updated code the GUI project is skipped for building, + as the cmedit64.dll and povcmax64.dll from official windows distribution are + incompatible with VS2022. The console version alone is available to build and test). Note: If you are building in a Git local workspace, we recommend you run `git update-index --skip-workspace source/base/build.h`. This will keep @@ -131,8 +134,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 +153,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 +172,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..66ee9f153 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..e143845ba 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..f27aed8e3 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..e0539e425 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)\ + povconsole64-avx512 + <_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..5fc4b4ec2 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..eb3fcb730 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..7d56dd011 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..a053cf736 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..6707efc2a 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..218b2aa28 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..34e5c58d5 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..fcf4c17f4 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..4357b5717 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..994cbfd4d 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..b4cabc67d 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..589f68c00 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..19805f7ae 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 78% rename from windows/vs2015/povray.sln rename to windows/vs2022/povray.sln index be7603cf2..524282b05 100644 --- a/windows/vs2015/povray.sln +++ b/windows/vs2022/povray.sln @@ -1,7 +1,7 @@ Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 14 -VisualStudioVersion = 14.0.25420.1 -MinimumVisualStudioVersion = 14.0.23107.0 +# 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}" @@ -76,6 +76,8 @@ Global 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 @@ -83,14 +85,15 @@ Global {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-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-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 @@ -105,6 +108,10 @@ Global {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 @@ -119,6 +126,10 @@ Global {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 @@ -133,6 +144,10 @@ Global {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 @@ -147,6 +162,10 @@ Global {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 @@ -161,6 +180,10 @@ Global {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 @@ -175,15 +198,25 @@ Global {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-AVX|x64.Build.0 = 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-AVX512|x64.Build.0 = 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 @@ -197,6 +230,10 @@ Global {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 @@ -211,6 +248,10 @@ Global {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 @@ -225,6 +266,10 @@ Global {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 @@ -239,15 +284,25 @@ Global {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 @@ -261,6 +316,10 @@ Global {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 @@ -275,6 +334,10 @@ Global {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 @@ -289,6 +352,10 @@ Global {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 @@ -303,6 +370,10 @@ Global {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 @@ -317,6 +388,10 @@ Global {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 @@ -331,6 +406,10 @@ Global {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 @@ -340,6 +419,9 @@ Global {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 @@ -353,6 +435,10 @@ Global {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 @@ -367,6 +453,10 @@ Global {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 @@ -381,6 +471,10 @@ Global {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 @@ -395,6 +489,10 @@ Global {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 @@ -409,6 +507,10 @@ Global {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 @@ -423,6 +525,10 @@ Global {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 @@ -437,6 +543,10 @@ Global {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 @@ -473,4 +583,7 @@ Global {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..18a48da41 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/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..515a2141a 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..7b10fa902 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..dcd375c9a 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..5fd09fa2b 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..28d2a72fb 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..a1a63f8c8 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 From 81f15b3e9d0d7e95a12c029973f274de0e6e7232 Mon Sep 17 00:00:00 2001 From: Srihari-mcw Date: Sun, 14 May 2023 23:38:16 -0700 Subject: [PATCH 2/6] Update the sheet with additional performance details --- ...X and Intel I5-1035 G1 with +WT1 Option.xlsx | Bin 0 -> 84141 bytes ...AVX512 - AMD 7600X and Intel I5-1035 G1.xlsx | Bin 25292 -> 0 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 avx512_build_setup/POVRAY Compiled Results - AVX512 - AMD 7600X and Intel I5-1035 G1 with +WT1 Option.xlsx delete mode 100644 avx512_build_setup/POVRAY Compiled Results - AVX512 - AMD 7600X and Intel I5-1035 G1.xlsx 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 0000000000000000000000000000000000000000..4aa0bbb0288a529e0bab993e3c1dbc96c28b5620 GIT binary patch literal 84141 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

L4mgV7AA0pv;+>p*EV%A>=QZMDSR7R4v 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

7{c7Qn_=qH>f!MF5I%Xyr3xQF7j15G<) z+wq3*)Sw}-!(p2pli}O!z=^Q`ny&msV8_pmUNPsxJqD*8=sROXSdgjV=7KNaJKvbDp~K_z>aI%&c|T-Hal=4m>k%zcowG}E_pcZ zz}a_tKFJhY=I1#Wn0>+qfuL`FfIQuW`U0yLLV>R3Cz=?pp4;=>KVG~X}aQ1-MdyHXF z=32JdffE6H#}f=fau-fJaQ30tyIEjR4uiBTsNK!|2Tla+<-;)u{ex(PO*79hbI!2a zE%wSx7?gKQI8ku+A=vZYFeonx@vyEdIA_6On}t1<3VUtgV%TkLKT0_X4wJo_ZDL3>M(%%tUCbyKCrP9U>LxgVEXQFYx(zqjh$4&0BW)A0QmdB#!l2= z05#6+0QmdB#!h}<0M*!c0Q`L?xHY4IfrCJlIPf6b@(b8ex0N{FTs-~Urs6+nWbD$| xyc(u_EhpNWEi4;$X>0-rQ(A`$UHT^-Brin(cAbJic)-6{a9_O018zSc{{?jCEGGZ} literal 0 HcmV?d00001 diff --git a/avx512_build_setup/POVRAY Compiled Results - AVX512 - AMD 7600X and Intel I5-1035 G1.xlsx b/avx512_build_setup/POVRAY Compiled Results - AVX512 - AMD 7600X and Intel I5-1035 G1.xlsx deleted file mode 100644 index 777931598dd60b982ab80660a4cd63df686149b4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25292 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 From 7066e750eb2391117d86370e91e01b2f7378919b Mon Sep 17 00:00:00 2001 From: Srihari-mcw Date: Thu, 21 Nov 2024 07:54:53 -0800 Subject: [PATCH 3/6] Make updates to fix issues with OpenEXR dependency after latest Visual Studio Updates --- libraries/openexr/IlmImf/ImfAttribute.cpp | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) 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)(); From 1ac864b2362ef2df7472c94481bf8cb7dc36dd56 Mon Sep 17 00:00:00 2001 From: Srihari-MCW Date: Thu, 16 Jan 2025 05:19:05 -0800 Subject: [PATCH 4/6] Update the gui changes along with minor fixes --- .../boost/libs/thread/src/win32/tss_pe.cpp | 4 +- source/core/material/pattern.h | 2 +- windows/vs2022/boost_date_time.vcxproj | 2 +- windows/vs2022/boost_system.vcxproj | 2 +- windows/vs2022/boost_thread.vcxproj | 2 +- windows/vs2022/console.vcxproj | 4 +- windows/vs2022/jpeg.vcxproj | 2 +- windows/vs2022/libpng.vcxproj | 2 +- windows/vs2022/openexr_Half.vcxproj | 2 +- windows/vs2022/openexr_Iex.vcxproj | 2 +- windows/vs2022/openexr_IlmImf.vcxproj | 2 +- windows/vs2022/openexr_IlmThread.vcxproj | 2 +- windows/vs2022/povbackend.vcxproj | 2 +- windows/vs2022/povbase.vcxproj | 2 +- windows/vs2022/povcore.vcxproj | 2 +- windows/vs2022/povfrontend.vcxproj | 2 +- windows/vs2022/povms.vcxproj | 2 +- windows/vs2022/povparser.vcxproj | 2 +- windows/vs2022/povplatform.vcxproj | 2 +- windows/vs2022/povray.sln | 1178 ++++++++--------- windows/vs2022/povray.vcxproj | 2 +- windows/vs2022/povray64-avx512.props | 21 + windows/vs2022/povvm.vcxproj | 2 +- windows/vs2022/rtrsupport.vcxproj | 2 +- windows/vs2022/tests.vcxproj | 2 +- windows/vs2022/tiff.vcxproj | 2 +- windows/vs2022/vfewin.vcxproj | 2 +- windows/vs2022/zlib.vcxproj | 2 +- 28 files changed, 638 insertions(+), 617 deletions(-) create mode 100644 windows/vs2022/povray64-avx512.props diff --git a/libraries/boost/libs/thread/src/win32/tss_pe.cpp b/libraries/boost/libs/thread/src/win32/tss_pe.cpp index 841f98b87..f1a78369f 100644 --- a/libraries/boost/libs/thread/src/win32/tss_pe.cpp +++ b/libraries/boost/libs/thread/src/win32/tss_pe.cpp @@ -112,8 +112,8 @@ 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 - typedef void (__cdecl *_PVFV)(); + #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 #else diff --git a/source/core/material/pattern.h b/source/core/material/pattern.h index 693b53e89..c39d8746f 100644 --- a/source/core/material/pattern.h +++ b/source/core/material/pattern.h @@ -1238,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/windows/vs2022/boost_date_time.vcxproj b/windows/vs2022/boost_date_time.vcxproj index 66ee9f153..73fa35a6b 100644 --- a/windows/vs2022/boost_date_time.vcxproj +++ b/windows/vs2022/boost_date_time.vcxproj @@ -132,7 +132,7 @@ - + diff --git a/windows/vs2022/boost_system.vcxproj b/windows/vs2022/boost_system.vcxproj index e143845ba..4b789014a 100644 --- a/windows/vs2022/boost_system.vcxproj +++ b/windows/vs2022/boost_system.vcxproj @@ -130,7 +130,7 @@ - + diff --git a/windows/vs2022/boost_thread.vcxproj b/windows/vs2022/boost_thread.vcxproj index f27aed8e3..d2fe7120a 100644 --- a/windows/vs2022/boost_thread.vcxproj +++ b/windows/vs2022/boost_thread.vcxproj @@ -133,7 +133,7 @@ - + diff --git a/windows/vs2022/console.vcxproj b/windows/vs2022/console.vcxproj index e0539e425..7e4c5f7ea 100644 --- a/windows/vs2022/console.vcxproj +++ b/windows/vs2022/console.vcxproj @@ -114,7 +114,7 @@ - + @@ -151,7 +151,7 @@ bin64\ build\$(ProjectName)\$(Platform)\$(Configuration)\ - povconsole64-avx512 + povconsole$(ConfigTag) <_ProjectFileVersion>10.0.30319.1 diff --git a/windows/vs2022/jpeg.vcxproj b/windows/vs2022/jpeg.vcxproj index 5fc4b4ec2..c3e24527e 100644 --- a/windows/vs2022/jpeg.vcxproj +++ b/windows/vs2022/jpeg.vcxproj @@ -124,7 +124,7 @@ - + diff --git a/windows/vs2022/libpng.vcxproj b/windows/vs2022/libpng.vcxproj index eb3fcb730..76a7aa015 100644 --- a/windows/vs2022/libpng.vcxproj +++ b/windows/vs2022/libpng.vcxproj @@ -117,7 +117,7 @@ - + diff --git a/windows/vs2022/openexr_Half.vcxproj b/windows/vs2022/openexr_Half.vcxproj index 7d56dd011..c8f68fef0 100644 --- a/windows/vs2022/openexr_Half.vcxproj +++ b/windows/vs2022/openexr_Half.vcxproj @@ -122,7 +122,7 @@ - + diff --git a/windows/vs2022/openexr_Iex.vcxproj b/windows/vs2022/openexr_Iex.vcxproj index a053cf736..cdc9ac955 100644 --- a/windows/vs2022/openexr_Iex.vcxproj +++ b/windows/vs2022/openexr_Iex.vcxproj @@ -122,7 +122,7 @@ - + diff --git a/windows/vs2022/openexr_IlmImf.vcxproj b/windows/vs2022/openexr_IlmImf.vcxproj index 6707efc2a..84935fd22 100644 --- a/windows/vs2022/openexr_IlmImf.vcxproj +++ b/windows/vs2022/openexr_IlmImf.vcxproj @@ -122,7 +122,7 @@ - + diff --git a/windows/vs2022/openexr_IlmThread.vcxproj b/windows/vs2022/openexr_IlmThread.vcxproj index 218b2aa28..dede5e577 100644 --- a/windows/vs2022/openexr_IlmThread.vcxproj +++ b/windows/vs2022/openexr_IlmThread.vcxproj @@ -122,7 +122,7 @@ - + diff --git a/windows/vs2022/povbackend.vcxproj b/windows/vs2022/povbackend.vcxproj index 34e5c58d5..6299366ed 100644 --- a/windows/vs2022/povbackend.vcxproj +++ b/windows/vs2022/povbackend.vcxproj @@ -119,7 +119,7 @@ - + diff --git a/windows/vs2022/povbase.vcxproj b/windows/vs2022/povbase.vcxproj index fcf4c17f4..9b60fe20d 100644 --- a/windows/vs2022/povbase.vcxproj +++ b/windows/vs2022/povbase.vcxproj @@ -119,7 +119,7 @@ - + diff --git a/windows/vs2022/povcore.vcxproj b/windows/vs2022/povcore.vcxproj index 4357b5717..56dcc950c 100644 --- a/windows/vs2022/povcore.vcxproj +++ b/windows/vs2022/povcore.vcxproj @@ -120,7 +120,7 @@ - + diff --git a/windows/vs2022/povfrontend.vcxproj b/windows/vs2022/povfrontend.vcxproj index 994cbfd4d..af6aa2294 100644 --- a/windows/vs2022/povfrontend.vcxproj +++ b/windows/vs2022/povfrontend.vcxproj @@ -119,7 +119,7 @@ - + diff --git a/windows/vs2022/povms.vcxproj b/windows/vs2022/povms.vcxproj index b4cabc67d..3cf8988e9 100644 --- a/windows/vs2022/povms.vcxproj +++ b/windows/vs2022/povms.vcxproj @@ -119,7 +119,7 @@ - + diff --git a/windows/vs2022/povparser.vcxproj b/windows/vs2022/povparser.vcxproj index 589f68c00..04a1099b1 100644 --- a/windows/vs2022/povparser.vcxproj +++ b/windows/vs2022/povparser.vcxproj @@ -120,7 +120,7 @@ - + diff --git a/windows/vs2022/povplatform.vcxproj b/windows/vs2022/povplatform.vcxproj index 19805f7ae..d3cd8c275 100644 --- a/windows/vs2022/povplatform.vcxproj +++ b/windows/vs2022/povplatform.vcxproj @@ -120,7 +120,7 @@ - + diff --git a/windows/vs2022/povray.sln b/windows/vs2022/povray.sln index 524282b05..867514c7f 100644 --- a/windows/vs2022/povray.sln +++ b/windows/vs2022/povray.sln @@ -1,589 +1,589 @@ -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-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-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-AVX|x64.Build.0 = 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-AVX512|x64.Build.0 = 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 +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/vs2022/povray.vcxproj b/windows/vs2022/povray.vcxproj index 18a48da41..feb5193e5 100644 --- a/windows/vs2022/povray.vcxproj +++ b/windows/vs2022/povray.vcxproj @@ -121,7 +121,7 @@ - + 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/vs2022/povvm.vcxproj b/windows/vs2022/povvm.vcxproj index 515a2141a..a7910ee84 100644 --- a/windows/vs2022/povvm.vcxproj +++ b/windows/vs2022/povvm.vcxproj @@ -120,7 +120,7 @@ - + diff --git a/windows/vs2022/rtrsupport.vcxproj b/windows/vs2022/rtrsupport.vcxproj index 7b10fa902..634f4938b 100644 --- a/windows/vs2022/rtrsupport.vcxproj +++ b/windows/vs2022/rtrsupport.vcxproj @@ -120,7 +120,7 @@ - + diff --git a/windows/vs2022/tests.vcxproj b/windows/vs2022/tests.vcxproj index dcd375c9a..189d5325b 100644 --- a/windows/vs2022/tests.vcxproj +++ b/windows/vs2022/tests.vcxproj @@ -127,7 +127,7 @@ - + diff --git a/windows/vs2022/tiff.vcxproj b/windows/vs2022/tiff.vcxproj index 5fd09fa2b..d3a456c4e 100644 --- a/windows/vs2022/tiff.vcxproj +++ b/windows/vs2022/tiff.vcxproj @@ -124,7 +124,7 @@ - + diff --git a/windows/vs2022/vfewin.vcxproj b/windows/vs2022/vfewin.vcxproj index 28d2a72fb..566c620ad 100644 --- a/windows/vs2022/vfewin.vcxproj +++ b/windows/vs2022/vfewin.vcxproj @@ -121,7 +121,7 @@ - + diff --git a/windows/vs2022/zlib.vcxproj b/windows/vs2022/zlib.vcxproj index a1a63f8c8..4a53b8364 100644 --- a/windows/vs2022/zlib.vcxproj +++ b/windows/vs2022/zlib.vcxproj @@ -117,7 +117,7 @@ - + From 8e06545a3d9ac767d9636b015ab09d2b43fa3247 Mon Sep 17 00:00:00 2001 From: Srihari-mcw Date: Fri, 17 Jan 2025 01:19:04 -0800 Subject: [PATCH 5/6] update indentation --- libraries/boost/libs/thread/src/win32/tss_pe.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/boost/libs/thread/src/win32/tss_pe.cpp b/libraries/boost/libs/thread/src/win32/tss_pe.cpp index f1a78369f..235d94fdd 100644 --- a/libraries/boost/libs/thread/src/win32/tss_pe.cpp +++ b/libraries/boost/libs/thread/src/win32/tss_pe.cpp @@ -113,7 +113,7 @@ extern BOOL (WINAPI * const _pDefaultRawDllMainOrig)(HANDLE, DWORD, LPVOID) = NU //Definitions required by implementation #if (_MSC_VER < 1300) || (_MSC_VER > 1941) // 1300 == VC++ 7.0, 1941 == VC++ 14.32 - typedef void(__cdecl* _PVFV)(); + typedef void(__cdecl *_PVFV)(); #define INIRETSUCCESS #define PVAPI void __cdecl #else From ebfdc8cc98297ec7cef891dd67f7b6e68b2f81c8 Mon Sep 17 00:00:00 2001 From: Srihari-mcw Date: Fri, 17 Jan 2025 03:16:26 -0800 Subject: [PATCH 6/6] Update README files --- .../ADDITIONAL_README_FOR_AVX512_Version.md | 17 +++++++---------- .../boost/libs/thread/src/win32/tss_pe.cpp | 2 +- windows/README.md | 3 --- 3 files changed, 8 insertions(+), 14 deletions(-) diff --git a/avx512_build_setup/ADDITIONAL_README_FOR_AVX512_Version.md b/avx512_build_setup/ADDITIONAL_README_FOR_AVX512_Version.md index a72f96472..0210dc2a9 100644 --- a/avx512_build_setup/ADDITIONAL_README_FOR_AVX512_Version.md +++ b/avx512_build_setup/ADDITIONAL_README_FOR_AVX512_Version.md @@ -6,19 +6,16 @@ The visual studio version was updated from vs2015 to vs2022 to enable support of 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) -3. In syspovconfig.h(windows/povconfig/syspovconfig.h) uncomment the #define _CONSOLE. (line 56) - The AVX512 version was developed with the console version. - The GUI build has been skipped in the solution file. - **Note:** (Presently with the updated code the GUI project is skipped for building, - as the cmedit64.dll and povcmax64.dll from official windows distribution are - incompatible with VS2022. The console version alone is available to build and test). -4. Build the solution file and in the vs2022/bin64 folder we can run the POVRAY examples with povconsole-avx512.exe. + +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 - povconsole-avx512.exe +Ibenchmark.pov - Single worker thread - povconsole-avx512.exe +WT1 benchmark.pov + General command example - povconsole64-avx512.exe +Ibenchmark.pov + Single worker thread - povconsole64-avx512.exe +WT1 benchmark.pov Output image - benchmark.png ``` -5. Results with the AVX512 version has been attached in the same folder. +Results with the AVX512 version has been attached in the same folder. Notes for UNIX build ==================== diff --git a/libraries/boost/libs/thread/src/win32/tss_pe.cpp b/libraries/boost/libs/thread/src/win32/tss_pe.cpp index 235d94fdd..eec7043d8 100644 --- a/libraries/boost/libs/thread/src/win32/tss_pe.cpp +++ b/libraries/boost/libs/thread/src/win32/tss_pe.cpp @@ -113,7 +113,7 @@ extern BOOL (WINAPI * const _pDefaultRawDllMainOrig)(HANDLE, DWORD, LPVOID) = NU //Definitions required by implementation #if (_MSC_VER < 1300) || (_MSC_VER > 1941) // 1300 == VC++ 7.0, 1941 == VC++ 14.32 - typedef void(__cdecl *_PVFV)(); + typedef void (__cdecl *_PVFV)(); #define INIRETSUCCESS #define PVAPI void __cdecl #else diff --git a/windows/README.md b/windows/README.md index b35ed1ce3..1d34449bd 100644 --- a/windows/README.md +++ b/windows/README.md @@ -103,9 +103,6 @@ Build Steps make unofficial versions distinguishable from each other. Remove the `#error` directive afterwards to proceed with the build. Note that if you do not do this you will get compile errors. - **Note:** (Presently with the updated code the GUI project is skipped for building, - as the cmedit64.dll and povcmax64.dll from official windows distribution are - incompatible with VS2022. The console version alone is available to build and test). Note: If you are building in a Git local workspace, we recommend you run `git update-index --skip-workspace source/base/build.h`. This will keep