From 9e4f44ad30ec97b2179865131a492f8daae26ed0 Mon Sep 17 00:00:00 2001 From: Ray Molenkamp Date: Mon, 17 Sep 2018 11:58:13 -0600 Subject: build_environment: ffi/linux force predictable lib path. ffi stubbornly wants to put libs in lib64 even when you tell it not to on some linux distributions. patch based on sed fix the gentoo guys did [1] [1] https://bugs.gentoo.org/462814 --- build_files/build_environment/cmake/ffi.cmake | 2 ++ build_files/build_environment/patches/ffi.diff | 11 +++++++++++ 2 files changed, 13 insertions(+) create mode 100644 build_files/build_environment/patches/ffi.diff diff --git a/build_files/build_environment/cmake/ffi.cmake b/build_files/build_environment/cmake/ffi.cmake index 18531fd7906..bc0932022cb 100644 --- a/build_files/build_environment/cmake/ffi.cmake +++ b/build_files/build_environment/cmake/ffi.cmake @@ -25,8 +25,10 @@ ExternalProject_Add(external_ffi --enable-shared=no --enable-static=yes --with-pic + --libdir=${LIBDIR}/ffi/lib/ BUILD_COMMAND ${CONFIGURE_ENV} && cd ${BUILD_DIR}/ffi/src/external_ffi/ && make -j${MAKE_THREADS} INSTALL_COMMAND ${CONFIGURE_ENV} && cd ${BUILD_DIR}/ffi/src/external_ffi/ && make install + PATCH_COMMAND ${PATCH_CMD} -p 0 -d ${BUILD_DIR}/ffi/src/external_ffi < ${PATCH_DIR}/ffi.diff INSTALL_DIR ${LIBDIR}/ffi ) diff --git a/build_files/build_environment/patches/ffi.diff b/build_files/build_environment/patches/ffi.diff new file mode 100644 index 00000000000..84e7f0407e2 --- /dev/null +++ b/build_files/build_environment/patches/ffi.diff @@ -0,0 +1,11 @@ +--- Makefile.in 2014-11-12 06:59:58.000000000 -0500 ++++ Makefile.in 2018-09-17 13:36:10.974086554 -0400 +@@ -600,7 +600,7 @@ + target_os = @target_os@ + target_vendor = @target_vendor@ + toolexecdir = @toolexecdir@ +-toolexeclibdir = @toolexeclibdir@ ++toolexeclibdir = $(libdir) + top_build_prefix = @top_build_prefix@ + top_builddir = @top_builddir@ + top_srcdir = @top_srcdir@ -- cgit v1.2.3 From d2161d6463df405b8b9ee882a5a23b6ebeb46427 Mon Sep 17 00:00:00 2001 From: Ray Molenkamp Date: Mon, 17 Sep 2018 13:13:17 -0600 Subject: build_environment: linux/python, help python find ffi. we were building ffi, but python wasn't finding it. --- build_files/build_environment/cmake/python.cmake | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/build_files/build_environment/cmake/python.cmake b/build_files/build_environment/cmake/python.cmake index c61a0084b6f..ccef8a825b7 100644 --- a/build_files/build_environment/cmake/python.cmake +++ b/build_files/build_environment/cmake/python.cmake @@ -89,11 +89,12 @@ else() set(PYTHON_CONFIGURE_EXTRA_ARGS "--with-openssl=${LIBDIR}/ssl") set(PYTHON_CFLAGS "-I${LIBDIR}/sqlite/include -I${LIBDIR}/bzip2/include -I${LIBDIR}/lzma/include -I${LIBDIR}/zlib/include") - set(PYTHON_LDFLAGS "-L${LIBDIR}/sqlite/lib -L${LIBDIR}/bzip2/lib -L${LIBDIR}/lzma/lib -L${LIBDIR}/zlib/lib") + set(PYTHON_LDFLAGS "-L${LIBDIR}/ffi/lib -L${LIBDIR}/sqlite/lib -L${LIBDIR}/bzip2/lib -L${LIBDIR}/lzma/lib -L${LIBDIR}/zlib/lib") set(PYTHON_CONFIGURE_EXTRA_ENV export CFLAGS=${PYTHON_CFLAGS} && export CPPFLAGS=${PYTHON_CFLAGS} && - export LDFLAGS=${PYTHON_LDFLAGS}) + export LDFLAGS=${PYTHON_LDFLAGS} && + export PKG_CONFIG_PATH=${LIBDIR}/ffi/lib/pkgconfig) set(PYTHON_PATCH ${PATCH_CMD} --verbose -p1 -d ${BUILD_DIR}/python/src/external_python < ${PATCH_DIR}/python_linux.diff) ExternalProject_Add(external_python -- cgit v1.2.3 From 51ac494f219c2a7bd2937b63c91a3261d6ba3ad9 Mon Sep 17 00:00:00 2001 From: Ray Molenkamp Date: Mon, 17 Sep 2018 13:45:12 -0600 Subject: build_files: bump python version in FindPythonLibsUnix.cmake to 3.7 now that all platforms have been updated --- build_files/cmake/Modules/FindPythonLibsUnix.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build_files/cmake/Modules/FindPythonLibsUnix.cmake b/build_files/cmake/Modules/FindPythonLibsUnix.cmake index 140f8be048a..a6924972e42 100644 --- a/build_files/cmake/Modules/FindPythonLibsUnix.cmake +++ b/build_files/cmake/Modules/FindPythonLibsUnix.cmake @@ -38,7 +38,7 @@ IF(NOT PYTHON_ROOT_DIR AND NOT $ENV{PYTHON_ROOT_DIR} STREQUAL "") SET(PYTHON_ROOT_DIR $ENV{PYTHON_ROOT_DIR}) ENDIF() -SET(PYTHON_VERSION 3.6 CACHE STRING "Python Version (major and minor only)") +SET(PYTHON_VERSION 3.7 CACHE STRING "Python Version (major and minor only)") MARK_AS_ADVANCED(PYTHON_VERSION) -- cgit v1.2.3 From 16b8d223b718925d6aadd30b802967f010076f5d Mon Sep 17 00:00:00 2001 From: Ray Molenkamp Date: Mon, 17 Sep 2018 16:27:13 -0600 Subject: Cycles: Fix usage of AVX2 intrinsics in AVX kernel While building the AVX kernel, util_avxf.h/avxb.h were using some AVX2 intrinsics, these were never called, so it wasn't a run-time issue, but the intrinsics headers on centos excluded the AVX2 prototypes when building the AVX kernel causing build errors. This commit cleans up the improper usage of the AVX2 intrinsics and provides AVX fallback implementations for future use. Differential Revision: https://developer.blender.org/D3696 --- intern/cycles/util/util_avxb.h | 18 ++++++++++++++++-- intern/cycles/util/util_avxf.h | 6 ++++-- 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/intern/cycles/util/util_avxb.h b/intern/cycles/util/util_avxb.h index b6d77857c6f..4add69bcb91 100644 --- a/intern/cycles/util/util_avxb.h +++ b/intern/cycles/util/util_avxb.h @@ -49,7 +49,7 @@ struct avxb //////////////////////////////////////////////////////////////////////////////// __forceinline avxb( FalseTy ) : m256(_mm256_setzero_ps()) {} - __forceinline avxb( TrueTy ) : m256(_mm256_castsi256_ps(_mm256_cmpeq_epi32(_mm256_setzero_si256(), _mm256_setzero_si256()))) {} + __forceinline avxb( TrueTy ) : m256(_mm256_castsi256_ps(_mm256_set1_epi32(-1))) {} //////////////////////////////////////////////////////////////////////////////// /// Array Access @@ -86,7 +86,21 @@ __forceinline const avxb operator ^=( avxb& a, const avxb& b ) { return a = a ^ //////////////////////////////////////////////////////////////////////////////// __forceinline const avxb operator !=( const avxb& a, const avxb& b ) { return _mm256_xor_ps(a, b); } -__forceinline const avxb operator ==( const avxb& a, const avxb& b ) { return _mm256_castsi256_ps(_mm256_cmpeq_epi32(a, b)); } +__forceinline const avxb operator ==( const avxb& a, const avxb& b ) +{ +#ifdef __KERNEL_AVX2__ + return _mm256_castsi256_ps(_mm256_cmpeq_epi32(a, b)); +#else + __m128i a_lo = _mm_castps_si128(_mm256_extractf128_ps(a, 0)); + __m128i a_hi = _mm_castps_si128(_mm256_extractf128_ps(a, 1)); + __m128i b_lo = _mm_castps_si128(_mm256_extractf128_ps(b, 0)); + __m128i b_hi = _mm_castps_si128(_mm256_extractf128_ps(b, 1)); + __m128i c_lo = _mm_cmpeq_epi32(a_lo, b_lo); + __m128i c_hi = _mm_cmpeq_epi32(a_hi, b_hi); + __m256i result = _mm256_insertf128_si256(_mm256_castsi128_si256(c_lo), c_hi, 1); + return _mm256_castsi256_ps(result); +#endif +} __forceinline const avxb select( const avxb& m, const avxb& t, const avxb& f ) { #if defined(__KERNEL_SSE41__) diff --git a/intern/cycles/util/util_avxf.h b/intern/cycles/util/util_avxf.h index 5596702ca20..0c15ba5cbbd 100644 --- a/intern/cycles/util/util_avxf.h +++ b/intern/cycles/util/util_avxf.h @@ -214,17 +214,19 @@ __forceinline const avxf nmadd(const avxf& a, const avxf& b, const avxf& c) { #endif } __forceinline const avxf msub(const avxf& a, const avxf& b, const avxf& c) { +#ifdef __KERNEL_AVX2__ return _mm256_fmsub_ps(a, b, c); +#else + return (a*b) - c; +#endif } //////////////////////////////////////////////////////////////////////////////// /// Comparison Operators //////////////////////////////////////////////////////////////////////////////// -#ifdef __KERNEL_AVX2__ __forceinline const avxb operator <=(const avxf& a, const avxf& b) { return _mm256_cmp_ps(a.m256, b.m256, _CMP_LE_OS); } -#endif #endif -- cgit v1.2.3 From 8b41cd5b96ea50b41aea2072517bdfd95b58ac8d Mon Sep 17 00:00:00 2001 From: Ray Molenkamp Date: Mon, 17 Sep 2018 18:06:02 -0600 Subject: FIX: linker error with a 'make deps' library set and opencollada enabled. PCRE_LIBRARIES was not being set if the pcre library was found but not the headers. --- build_files/cmake/Modules/FindPCRE.cmake | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/build_files/cmake/Modules/FindPCRE.cmake b/build_files/cmake/Modules/FindPCRE.cmake index 20b5c1d5c28..1fd56dc1234 100644 --- a/build_files/cmake/Modules/FindPCRE.cmake +++ b/build_files/cmake/Modules/FindPCRE.cmake @@ -56,8 +56,13 @@ INCLUDE(FindPackageHandleStandardArgs) FIND_PACKAGE_HANDLE_STANDARD_ARGS(PCRE DEFAULT_MSG PCRE_LIBRARY PCRE_INCLUDE_DIR) +# With 'make deps' precompiled libs, opencollada ships with a copy of libpcre +# but not the headers, ${PCRE_LIBRARY} will be valid in this case +# but PCRE_FOUND will be FALSE. So we set this variable outside of +# the IF(PCRE_FOUND) below to allow blender to successfully link. +SET(PCRE_LIBRARIES ${PCRE_LIBRARY}) + IF(PCRE_FOUND) - SET(PCRE_LIBRARIES ${PCRE_LIBRARY}) SET(PCRE_INCLUDE_DIRS ${PCRE_INCLUDE_DIR}) ENDIF(PCRE_FOUND) -- cgit v1.2.3 From d04eb330e873488d8b7cbe49da5600d6f64ea6db Mon Sep 17 00:00:00 2001 From: Sergey Sharybin Date: Tue, 18 Sep 2018 11:10:49 +0200 Subject: Close OpenEXR thread pool on exit This partially solves ASAN report about unfreed memory. There is still something in the report, need to have a closer look with debug version of OpenEXE library. --- source/blender/imbuf/intern/filetype.c | 2 +- source/blender/imbuf/intern/openexr/openexr_api.cpp | 8 ++++++++ source/blender/imbuf/intern/openexr/openexr_api.h | 1 + 3 files changed, 10 insertions(+), 1 deletion(-) diff --git a/source/blender/imbuf/intern/filetype.c b/source/blender/imbuf/intern/filetype.c index 25bbd132a49..a5af51e3e95 100644 --- a/source/blender/imbuf/intern/filetype.c +++ b/source/blender/imbuf/intern/filetype.c @@ -74,7 +74,7 @@ const ImFileType IMB_FILE_TYPES[] = { {NULL, NULL, imb_is_a_hdr, NULL, imb_ftype_default, imb_loadhdr, NULL, imb_savehdr, NULL, IM_FTYPE_FLOAT, IMB_FTYPE_RADHDR, COLOR_ROLE_DEFAULT_FLOAT}, #endif #ifdef WITH_OPENEXR - {imb_initopenexr, NULL, imb_is_a_openexr, NULL, imb_ftype_default, imb_load_openexr, NULL, imb_save_openexr, NULL, IM_FTYPE_FLOAT, IMB_FTYPE_OPENEXR, COLOR_ROLE_DEFAULT_FLOAT}, + {imb_initopenexr, imb_exitopenexr, imb_is_a_openexr, NULL, imb_ftype_default, imb_load_openexr, NULL, imb_save_openexr, NULL, IM_FTYPE_FLOAT, IMB_FTYPE_OPENEXR, COLOR_ROLE_DEFAULT_FLOAT}, #endif #ifdef WITH_OPENJPEG {NULL, NULL, imb_is_a_jp2, NULL, imb_ftype_default, imb_load_jp2, NULL, imb_save_jp2, NULL, IM_FTYPE_FLOAT, IMB_FTYPE_JP2, COLOR_ROLE_DEFAULT_BYTE}, diff --git a/source/blender/imbuf/intern/openexr/openexr_api.cpp b/source/blender/imbuf/intern/openexr/openexr_api.cpp index e8e6e0576ed..bad5e0efd65 100644 --- a/source/blender/imbuf/intern/openexr/openexr_api.cpp +++ b/source/blender/imbuf/intern/openexr/openexr_api.cpp @@ -1921,4 +1921,12 @@ void imb_initopenexr(void) setGlobalThreadCount(num_threads); } +void imb_exitopenexr(void) +{ + /* Tells OpenEXR to free thread pool, also ensures there is no running + * tasks. + */ + setGlobalThreadCount(0); +} + } // export "C" diff --git a/source/blender/imbuf/intern/openexr/openexr_api.h b/source/blender/imbuf/intern/openexr/openexr_api.h index 92bbeecfd5d..32d276b31ea 100644 --- a/source/blender/imbuf/intern/openexr/openexr_api.h +++ b/source/blender/imbuf/intern/openexr/openexr_api.h @@ -40,6 +40,7 @@ extern "C" { #include void imb_initopenexr (void); +void imb_exitopenexr (void); int imb_is_a_openexr (const unsigned char *mem); -- cgit v1.2.3