diff --git a/data/cmake/FindFFTW3.cmake b/data/cmake/FindFFTW3.cmake new file mode 100644 index 00000000..a4ccf9f6 --- /dev/null +++ b/data/cmake/FindFFTW3.cmake @@ -0,0 +1,116 @@ +# - Find FFTW3 +# This module searches for the FFTW3 library. +# +# The module defines the following variables: +# FFTW3_INCLUDE_DIRS - where to find fftw3.h, etc. +# FFTW3_LIBRARIES - the libraries needed to use FFTW3. +# FFTW3_FOUND - if false, do not try to use FFTW3. +# +# Variables used by this module, they can change the default behavior and need +# to be set before calling find_package: +# +# FFTW3_PRECISION - String which determines the variant of the library to find +# based on the floating point type. Its value is one of +# "DOUBLE" (default), "SINGLE", "LONG DOUBLE" +# FFTW3_ROOT_DIR - The preferred installation prefix for searching for FFTW3. +# Set if this module has problems finding the proper +# FFTW3 instalation. +# + +# ============================================================================ +# Originally created by Robert Osfield. [OpenSceneGraph] +# ============================================================================ + +# Search FFTW3_ROOT_DIR is set +set (_FFTW3_SEARCHES "") +if (FFTW3_ROOT_DIR) + set(_FFTW3_SEARCH_ROOT PATHS ${FFTW3_ROOT_DIR} NO_DEFAULT_PATH) + list(APPEND _FFTW3_SEARCHES _FFTW3_SEARCH_ROOT) +endif() + +# Normal search +set(_FFTW3_SEARCH_NORMAL + PATHS "/usr/local" + "/opt/local/" + "/opt/local/Library/Frameworks" + "/opt") +list(APPEND _FFTW3_SEARCHES _FFTW3_SEARCH_NORMAL) + +# Default precision is double +if (NOT FFTW3_PRECISION) + set (FFTW3_PRECISION "DOUBLE") +else() + string (TOUPPER "${FFTW3_PRECISION}" FFTW3_PRECISION) +endif() + +# Suffix based on the precision +if (FFTW3_PRECISION STREQUAL "DOUBLE") + set(_FFTW3_SUFFIX "") +elseif (FFTW3_PRECISION STREQUAL "SINGLE") + set(_FFTW3_SUFFIX "f") +elseif (FFTW3_PRECISION STREQUAL "LONG DOUBLE") + set(_FFTW3_SUFFIX "l") +else() + message(FATAL_ERROR "Unknown FFTW3 precision: ${FFTW3_PRECISION}") +endif() + +# Names of the library, including two forms of version naming +set(_FFTW3_NAMES "fftw3${_FFTW3_SUFFIX}" "fftw${_FFTW3_SUFFIX}-3") +if (WIN32) + list(APPEND _FFTW3_NAMES "libfftw3${_FFTW3_SUFFIX}" "libfftw${_FFTW3_SUFFIX}-3") +endif() +foreach(version_minor 4 3 2 1) + list(APPEND _FFTW3_NAMES "fftw${_FFTW3_SUFFIX}-3.${version_minor}" + "fftw3${_FFTW3_SUFFIX}-${version_minor}") + if (WIN32) + list(APPEND _FFTW3_NAMES "libfftw${_FFTW3_SUFFIX}-3.${version_minor}" + "libfftw3${_FFTW3_SUFFIX}-${version_minor}") + endif() +endforeach() + +# The separate threads and OpenMP library have a suffix +if (UNIX AND NOT APPLE) + set(_FFTW3_THREADS_NAMES "") + set(_FFTW3_OMP_NAMES "") + foreach(name ${_FFTW3_NAMES}) + list(APPEND _FFTW3_THREADS_NAMES "${name}_threads") + list(APPEND _FFTW3_OMP_NAMES "${name}_omp") + endforeach() +endif() + +# Try each search configuration +foreach (search ${_FFTW3_SEARCHES}) + find_path (FFTW3_INCLUDE_DIR NAMES "fftw3.h" ${${search}} PATH_SUFFIXES "include") + find_library (FFTW3_LIBRARY NAMES ${_FFTW3_NAMES} ${${search}} PATH_SUFFIXES "include") + if (UNIX AND NOT APPLE) + find_library (FFTW3_THREADS_LIBRARY + NAMES ${_FFTW3_THREADS_NAMES} ${${search}} PATH_SUFFIXES "include") + find_library (FFTW3_OMP_LIBRARY + NAMES ${_FFTW3_OMP_NAMES} ${${search}} PATH_SUFFIXES "include") + endif() +endforeach() + +mark_as_advanced(FFTW3_INCLUDE_DIR FFTW3_LIBRARY) +if (UNIX AND NOT APPLE) + mark_as_advanced(FFTW3_THREADS_LIBRARY FFTW3_OMP_LIBRARY) +endif() + +# TODO: Define an option to look for an appropriate threads variant (pthreads or OMP) +set(_FFTW3_LIB_VARS FFTW3_LIBRARY) +if (UNIX AND NOT APPLE) + list(APPEND _FFTW3_LIB_VARS FFTW3_THREADS_LIBRARY) +endif() + +# handle the QUIETLY and REQUIRED arguments and set FFTW3_FOUND to TRUE if +# all listed variables are TRUE +include(FindPackageHandleStandardArgs) +FIND_PACKAGE_HANDLE_STANDARD_ARGS(FFTW3 DEFAULT_MSG FFTW3_INCLUDE_DIR ${_FFTW3_LIB_VARS}) + +if (FFTW3_FOUND) + # TODO: create a compile test to find if FFTW_DLL is needed on Windows + set(FFTW3_INCLUDE_DIRS ${FFTW3_INCLUDE_DIR}) + set(FFTW3_LIBRARIES "") + foreach(var ${_FFTW3_LIB_VARS}) + list(APPEND FFTW3_LIBRARIES ${${var}}) + endforeach() +endif() diff --git a/data/cmake/MitsubaExternal.cmake b/data/cmake/MitsubaExternal.cmake index ea5919ac..8b1e2b91 100644 --- a/data/cmake/MitsubaExternal.cmake +++ b/data/cmake/MitsubaExternal.cmake @@ -182,6 +182,16 @@ if (COLLADA_FOUND) add_definitions(-DMTS_HAS_COLLADA=1) endif() + +# FFTW3 (optional) +find_package(FFTW3) +CMAKE_DEPENDENT_OPTION(MTS_FFTW "Enable FFTW3 for fast image convolution support." ON + "FFTW3_FOUND" OFF) +if (MTS_FFTW) + add_definitions(-DMTS_HAS_FFTW=1) +endif() + + find_package(OpenGL REQUIRED) set (GLEW_MX ON) find_package(GLEW REQUIRED) diff --git a/src/libcore/CMakeLists.txt b/src/libcore/CMakeLists.txt index 090d23dd..f16bfe26 100644 --- a/src/libcore/CMakeLists.txt +++ b/src/libcore/CMakeLists.txt @@ -143,6 +143,12 @@ include_directories( set(LIBS ${ZLIB_LIBRARIES} ${PNG_LIBRARIES} ${JPEG_LIBRARIES} ${ILMBASE_LIBRARIES} ${OPENEXR_LIBRARIES} ${Boost_LIBRARIES} ${CMAKE_THREAD_LIBS_INIT} ${CMAKE_DL_LIBS}) + +if(MTS_FFTW) + include_directories(${FFTW3_INCLUDE_DIRS}) + list(APPEND LIBS ${FFTW3_LIBRARIES}) +endif() + if(WIN32) list(APPEND LIBS ws2_32 psapi) elseif (${CMAKE_SYSTEM_NAME} STREQUAL "Linux")