pbrt-v4/CMakeLists.txt
Matt Pharr c7e3879c78
Unicode normalization (#225)
Normalize unicode strings for user-supplied names (objects, materials,
media, etc.)  Note that there is no need to normalize strings for things
like the name of the selected sampler, light source types, or the
parameters provided to pbrt objects, as all of the valid ones are plain old
ASCII text. We also intentionally do not normalize pathnames, as doing so
can cause all sorts of trouble.
2022-02-02 07:10:03 -08:00

1065 lines
35 KiB
CMake

# pbrt-v4 top-level CMakeLists.txt
cmake_minimum_required (VERSION 3.12)
project (PBRT-V4 LANGUAGES CXX C)
set (CMAKE_CXX_STANDARD 17)
set (CMAKE_CXX_STANDARD_REQUIRED ON)
# For sanitizers
list (INSERT CMAKE_MODULE_PATH 0 "${CMAKE_SOURCE_DIR}/cmake")
# Configuration options
option (PBRT_FLOAT_AS_DOUBLE "Use 64-bit floats" OFF)
option (PBRT_BUILD_NATIVE_EXECUTABLE "Build executable optimized for CPU architecture of system pbrt was built on" ON)
option (PBRT_DBG_LOGGING "Enable (very verbose!) debug logging" OFF)
option (PBRT_NVTX "Insert NVTX annotations for NVIDIA Profiling and Debugging Tools" OFF)
option (PBRT_NVML "Use NVML for GPU performance measurement" OFF)
option (PBRT_USE_PREGENERATED_RGB_TO_SPECTRUM_TABLES "Use pregenerated rgbspectrum_*.cpp files rather than running rgb2spec_opt to generate them at build time" OFF)
set (PBRT_OPTIX7_PATH "" CACHE PATH "Path to OptiX 7 SDK")
set (PBRT_GPU_SHADER_MODEL "" CACHE STRING "")
if (NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
message (STATUS "Setting build type to 'Release' as none was specified.")
set (CMAKE_BUILD_TYPE Release CACHE STRING "Choose the type of build." FORCE)
set_property (CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS "Debug" "Release"
"MinSizeRel" "RelWithDebInfo")
endif ()
function (CHECK_EXT NAME DIR HASH)
if (NOT IS_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/src/ext/${DIR}")
message (FATAL_ERROR "The ${NAME} submodule directory is missing! "
"Either that submodule was recently added to pbrt or you did not clone the project with --recursive. "
"In order to update the submodules, run:\n"
" \"git submodule update --init --recursive\"")
endif ()
find_package(Git)
if (GIT_FOUND)
execute_process (
COMMAND ${GIT_EXECUTABLE} rev-parse HEAD
WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/src/ext/${DIR}"
RESULT_VARIABLE "git_return"
ERROR_QUIET
OUTPUT_STRIP_TRAILING_WHITESPACE
OUTPUT_VARIABLE "git_hash")
if (NOT ${git_hash} MATCHES "^${HASH}")
message (FATAL_ERROR "The ${CMAKE_CURRENT_SOURCE_DIR}/src/ext/${DIR} "
"submodule isn't up to date (${git_hash} vs ${HASH}). Please run:\n"
" \"git submodule update --recursive\"")
else ()
message (STATUS "${NAME} at commit: ${git_hash}")
endif()
else (GIT_FOUND)
message (STATUS "git not found: unable to verify revisions in submodules")
endif (GIT_FOUND)
endfunction ()
check_ext ("OpenEXR" "openexr/OpenEXR" 5cfb5dab6dfada731586b0281bdb15ee75e26782)
check_ext ("OpenVDB" "openvdb/nanovdb" 414bed84c2fc22e188eac7b611aa85c7edd7a5a9)
check_ext ("Ptex" "ptex/src" 4cd8e9a6db2b06e478dfbbd8c26eb6df97f84483)
check_ext ("double-conversion" "double-conversion/cmake" cc1f75a114aca8d2af69f73a5a959aecbab0e87a)
check_ext ("filesystem" "filesystem/filesystem" c5f9de30142453eb3c6fe991e82dfc2583373116)
check_ext ("libdeflate" "libdeflate/common" 1fd0bea6ca2073c68493632dafc4b1ddda1bcbc3)
check_ext ("lodepng" "lodepng/examples" 8c6a9e30576f07bf470ad6f09458a2dcd7a6a84a)
check_ext ("stb" "stb/tools" af1a5bc352164740c1cc1354942b1c6b72eacb8a)
check_ext ("utf8proc" "utf8proc/bench" 2484e2ed5e1d9c19edcccf392a7d9920ad90dfaf)
check_ext ("zlib" "zlib/doc" 54d591eabf9fe0e84c725638f8d5d8d202a093fa)
add_compile_definitions ("$<$<CONFIG:DEBUG>:PBRT_DEBUG_BUILD>")
enable_testing ()
find_package (Sanitizers)
find_package (Threads)
set_property (GLOBAL PROPERTY USE_FOLDERS ON)
if (MSVC)
list (APPEND PBRT_DEFINITIONS "PBRT_IS_MSVC" "_CRT_SECURE_NO_WARNINGS")
list (APPEND PBRT_DEFINITIONS "PBRT_IS_MSVC" "_ENABLE_EXTENDED_ALIGNED_STORAGE")
endif ()
if (PBRT_FLOAT_AS_DOUBLE)
list (APPEND PBRT_DEFINITIONS "PBRT_FLOAT_AS_DOUBLE")
endif ()
if (PBRT_DBG_LOGGING)
list (APPEND PBRT_DEFINITIONS "PBRT_DBG_LOGGING")
endif ()
#######################################
## ext
set (BUILD_SHARED_LIBS OFF)
add_subdirectory (${CMAKE_CURRENT_SOURCE_DIR}/src/ext)
########################################
# os/compiler-specific stuff
if (CMAKE_SYSTEM_NAME STREQUAL Windows)
list (APPEND PBRT_DEFINITIONS "PBRT_IS_WINDOWS" "NOMINMAX")
elseif (CMAKE_SYSTEM_NAME STREQUAL Darwin)
list (APPEND PBRT_DEFINITIONS "PBRT_IS_OSX")
elseif (CMAKE_SYSTEM_NAME STREQUAL Linux)
list (APPEND PBRT_DEFINITIONS "PBRT_IS_LINUX")
# -rdynamic so we can get backtrace symbols...
# --no-as-needed so libprofiler sticks around
string (APPEND CMAKE_EXE_LINKER_FLAGS " -rdynamic -Wl,--no-as-needed")
else ()
message (SEND_ERROR "Unknown system name: " + CMAKE_SYSTEM_NAME)
endif()
# libgoogle-perftools-dev
find_library (PROFILE_LIB profiler)
if (NOT PROFILE_LIB)
message (STATUS "Unable to find -lprofiler")
else ()
message (STATUS "Found -lprofiler: ${PROFILE_LIB}")
endif ()
add_library (pbrt_warnings INTERFACE)
target_compile_options (
pbrt_warnings
INTERFACE
"$<$<CXX_COMPILER_ID:MSVC>:$<$<COMPILE_LANGUAGE:CUDA>:SHELL:-Xcompiler >/wd4244>" # int -> float conversion
"$<$<CXX_COMPILER_ID:MSVC>:$<$<COMPILE_LANGUAGE:CUDA>:SHELL:-Xcompiler >/wd4267>" # size_t -> int conversion
"$<$<CXX_COMPILER_ID:MSVC>:$<$<COMPILE_LANGUAGE:CUDA>:SHELL:-Xcompiler >/wd4305>" # double constant assigned to float
"$<$<CXX_COMPILER_ID:MSVC>:$<$<COMPILE_LANGUAGE:CUDA>:SHELL:-Xcompiler >/wd4552>" # result of expression not used
"$<$<CXX_COMPILER_ID:MSVC>:$<$<COMPILE_LANGUAGE:CUDA>:SHELL:-Xcompiler >/wd4838>" # double -> int conversion
"$<$<CXX_COMPILER_ID:MSVC>:$<$<COMPILE_LANGUAGE:CUDA>:SHELL:-Xcompiler >/wd4843>" # double -> float conversion
"$<$<CXX_COMPILER_ID:MSVC>:$<$<COMPILE_LANGUAGE:CUDA>:SHELL:-Xcompiler >/wd26451>" # arithmetic on 4-byte value, then cast to 8-byte
"$<$<CXX_COMPILER_ID:MSVC>:$<$<COMPILE_LANGUAGE:CUDA>:SHELL:-Xcompiler >/wd26495>" # uninitialized member variable
)
add_library (pbrt_opt INTERFACE)
#########################################
## CUDA / OptiX
add_library (cuda_build_configuration INTERFACE)
include (CheckLanguage)
check_language(CUDA)
if (CMAKE_CUDA_COMPILER)
if (CUDA_VERSION_MAJOR LESS 11)
message (WARNING "pbrt-v4 requires CUDA version 11.0 or later but version ${CUDA_VERSION_MAJOR}.${CUDA_VERSION_MINOR}\
was found. GPU support is therefore disabled. If you have multiple versions\
of CUDA installed, please update your PATH.")
else ()
find_package (CUDA REQUIRED)
# This seems to be necessary starting with 3.17.1, but gives an error
# about 17 being an unsupported version earlier...
if (${CMAKE_VERSION} VERSION_GREATER_EQUAL "3.17.0")
set (CMAKE_CUDA_STANDARD 17)
endif ()
# https://github.com/VIAME/VIAME/blob/aa6c5f56a898b08e4da102c400b453e23952199c/CMakeLists.txt#L291
if (NOT CUDA_VERSION_PATCH)
if (CUDA_NVCC_EXECUTABLE AND
CUDA_NVCC_EXECUTABLE STREQUAL CMAKE_CUDA_COMPILER AND
CMAKE_CUDA_COMPILER_VERSION MATCHES [=[([0-9]+)\.([0-9]+)\.([0-9]+)]=])
set (CUDA_VERSION_PATCH "${CMAKE_MATCH_3}")
elseif (CUDA_NVCC_EXECUTABLE)
execute_process (COMMAND ${CUDA_NVCC_EXECUTABLE} "--version" OUTPUT_VARIABLE NOUT)
if (NOUT MATCHES [=[ V([0-9]+)\.([0-9]+)\.([0-9]+)]=])
set (CUDA_VERSION_PATCH "${CMAKE_MATCH_3}")
endif ()
endif ()
endif ()
message (STATUS "Found CUDA: ${CUDA_VERSION_MAJOR}.${CUDA_VERSION_MINOR}.${CUDA_VERSION_PATCH}")
if (CUDA_VERSION_MAJOR EQUAL 11 AND CUDA_VERSION_MINOR EQUAL 3 AND CUDA_VERSION_PATCH LESS 109)
message (SEND_ERROR "Unfortunately, pbrt-v4 triggers an internal compiler error in CUDA 11.3.0. Please either use CUDA 11.0-11.2 or 11.3.1 or later.")
endif ()
if ("${PBRT_OPTIX7_PATH}" STREQUAL "")
message (WARNING "Found CUDA but PBRT_OPTIX7_PATH is not set. Disabling GPU compilation.")
else ()
enable_language (CUDA)
list (APPEND PBRT_DEFINITIONS "PBRT_BUILD_GPU_RENDERER")
if (PBRT_NVTX)
list (APPEND PBRT_DEFINITIONS "NVTX")
endif ()
if (PBRT_NVML)
list (APPEND PBRT_DEFINITIONS "PBRT_USE_NVML")
endif ()
set (PBRT_CUDA_ENABLED ON)
# FIXME
include_directories (${CMAKE_CUDA_TOOLKIT_INCLUDE_DIRECTORIES}) # for regular c++ compiles
# http://www.ssl.berkeley.edu/~jimm/grizzly_docs/SSL/opt/intel/cc/9.0/lib/locale/en_US/mcpcom.msg
target_compile_options (
pbrt_warnings
INTERFACE
#"$<$<COMPILE_LANGUAGE:CUDA>:SHELL:-Xptxas --warn-on-double-precision-use>"
"$<$<COMPILE_LANGUAGE:CUDA>:SHELL:-Xcudafe --diag_suppress=partial_override>"
"$<$<COMPILE_LANGUAGE:CUDA>:SHELL:-Xcudafe --diag_suppress=virtual_function_decl_hidden>"
"$<$<COMPILE_LANGUAGE:CUDA>:SHELL:-Xcudafe --diag_suppress=integer_sign_change>"
"$<$<COMPILE_LANGUAGE:CUDA>:SHELL:-Xcudafe --diag_suppress=declared_but_not_referenced>"
# WAR invalid warnings about this with "if constexpr"
"$<$<COMPILE_LANGUAGE:CUDA>:SHELL:-Xcudafe --diag_suppress=implicit_return_from_non_void_function>"
)
# Willie hears yeh..
string (APPEND CMAKE_CUDA_FLAGS " -Xnvlink -suppress-stack-size-warning")
target_compile_options (
cuda_build_configuration
INTERFACE
"$<$<COMPILE_LANGUAGE:CUDA>:--std=c++17;--use_fast_math;--expt-relaxed-constexpr;--extended-lambda;--forward-unknown-to-host-compiler>"
# The "$<NOT:$<BOOL:$<TARGET_PROPERTY:CUDA_PTX_COMPILATION>>>" part is to not add debugging symbols when generating PTX files for OptiX; see https://github.com/mmp/pbrt-v4/issues/69#issuecomment-715499748.
"$<$<COMPILE_LANGUAGE:CUDA>:$<IF:$<AND:$<CONFIG:Debug>,$<NOT:$<BOOL:$<TARGET_PROPERTY:CUDA_PTX_COMPILATION>>>>,-G;-g,-lineinfo;-maxrregcount;128>>"
)
if (PBRT_GPU_SHADER_MODEL STREQUAL "")
# https://wagonhelm.github.io/articles/2018-03/detecting-cuda-capability-with-cmake
# Get CUDA compute capability
set (CHECK_CUDA_OUTPUT_EXE ${CMAKE_BINARY_DIR}/checkcuda)
if (MSVC)
execute_process (COMMAND ${CMAKE_CUDA_COMPILER} -lcuda ${CMAKE_SOURCE_DIR}/cmake/checkcuda.cu -ccbin ${CMAKE_CXX_COMPILER} -o ${CHECK_CUDA_OUTPUT_EXE}
RESULT_VARIABLE BUILD_CHECK_CUDA_RETURN_CODE)
else ()
execute_process (COMMAND ${CMAKE_CUDA_COMPILER} -lcuda ${CMAKE_SOURCE_DIR}/cmake/checkcuda.cu -o ${CHECK_CUDA_OUTPUT_EXE}
RESULT_VARIABLE BUILD_CHECK_CUDA_RETURN_CODE)
endif ()
if (NOT ${BUILD_CHECK_CUDA_RETURN_CODE} EQUAL 0)
message (SEND_ERROR "Was unable to build checkcuda, consider manually setting PBRT_GPU_SHADER_MODEL")
endif ()
execute_process (COMMAND ${CHECK_CUDA_OUTPUT_EXE}
RESULT_VARIABLE CUDA_RETURN_CODE
OUTPUT_VARIABLE CHECK_CUDA_OUTPUT)
if (NOT ${CUDA_RETURN_CODE} EQUAL 0)
message (SEND_ERROR ${CHECK_CUDA_OUTPUT})
else ()
set(ARCH "${CHECK_CUDA_OUTPUT}")
message (STATUS "Detected CUDA Architecture: ${ARCH}")
string (APPEND CMAKE_CUDA_FLAGS " --gpu-architecture=${ARCH}")
endif ()
else ()
set(ARCH "${PBRT_GPU_SHADER_MODEL}")
message (STATUS "Specified CUDA Architecture: ${ARCH}")
string (APPEND CMAKE_CUDA_FLAGS " --gpu-architecture=${ARCH}")
endif ()
set (PBRT_CUDA_LIB cuda)
# optix
# FIXME
include_directories (${PBRT_OPTIX7_PATH}/include)
# find CUDA's bin2c executable
get_filename_component (cuda_compiler_bin "${CMAKE_CUDA_COMPILER}" DIRECTORY)
find_program (BIN2C
NAMES bin2c
PATHS ${cuda_compiler_bin}
DOC "Path to the CUDA SDK bin2c executable."
NO_DEFAULT_PATH)
if (NOT BIN2C)
message (FATAL_ERROR
"bin2c not found:\n"
" CMAKE_CUDA_COMPILER='${CMAKE_CUDA_COMPILER}'\n"
" cuda_compiler_bin='${cuda_compiler_bin}'\n"
)
endif ()
# this macro defines cmake rules that execute the following four steps:
# 1) compile the given cuda file ${cuda_file} to an intermediary PTX file
# 2) use the 'bin2c' tool (that comes with CUDA) to
# create a second intermediary (.c-)file which defines a const string variable
# (named '${c_var_name}') whose (constant) value is the PTX output
# from the previous step.
# 3) compile the given .c file to an intermediary object file (why thus has
# that PTX string 'embedded' as a global constant.
# 4) assign the name of the intermediary .o file to the cmake variable
# 'output_var', which can then be added to cmake targets.
macro (cuda_compile_and_embed output_var cuda_file lib_name)
add_library ("${lib_name}" OBJECT "${cuda_file}")
set_property (TARGET "${lib_name}" PROPERTY CUDA_PTX_COMPILATION ON)
# disable "extern declaration... is treated as a static definition" warning
if (CUDA_VERSION_MAJOR EQUAL 11 AND CUDA_VERSION_MINOR LESS 2)
target_compile_options ("${lib_name}" PRIVATE
-Xcudafe=--display_error_number -Xcudafe=--diag_suppress=3089)
else ()
target_compile_options ("${lib_name}" PRIVATE
-Xcudafe=--display_error_number -Xcudafe=--diag_suppress=20044)
endif ()
# CUDA integration in Visual Studio seems broken as even if "Use
# Host Preprocessor Definitions" is checked, the host preprocessor
# definitions are still not used when compiling device code.
# To work around that, define the macros using --define-macro to
# avoid CMake identifying those as macros and using the proper (but
# broken) way of specifying them.
if (${CMAKE_GENERATOR} MATCHES "^Visual Studio")
# As PBRT_DEBUG_BUILD is specified globally as a definition, we need to
# manually add it due to the bug mentioned earlier and due to it
# not being found in PBRT_DEFINITIONS.
if (CMAKE_BUILD_TYPE MATCHES Debug)
set (cuda_definitions "--define-macro=PBRT_DEBUG_BUILD")
endif ()
foreach (arg ${PBRT_DEFINITIONS})
list (APPEND cuda_definitions "--define-macro=${arg}")
endforeach ()
target_compile_options ("${lib_name}" PRIVATE ${cuda_definitions})
else ()
target_compile_definitions ("${lib_name}" PRIVATE ${PBRT_DEFINITIONS})
endif ()
target_include_directories ("${lib_name}" PRIVATE src ${CMAKE_BINARY_DIR})
target_include_directories ("${lib_name}" SYSTEM PRIVATE ${NANOVDB_INCLUDE})
target_link_libraries ("${lib_name}" PRIVATE cuda_build_configuration pbrt_opt pbrt_warnings)
add_dependencies ("${lib_name}" pbrt_soa_generated)
set (c_var_name ${output_var})
set (embedded_file ${cuda_file}.ptx_embedded.c)
add_custom_command (
OUTPUT "${embedded_file}"
COMMAND ${CMAKE_COMMAND}
"-DBIN_TO_C_COMMAND=${BIN2C}"
"-DOBJECTS=$<TARGET_OBJECTS:${lib_name}>"
"-DVAR_NAME=${c_var_name}"
"-DOUTPUT=${embedded_file}"
-P ${CMAKE_CURRENT_SOURCE_DIR}/cmake/bin2c_wrapper.cmake
VERBATIM
DEPENDS "${lib_name}" $<TARGET_OBJECTS:${lib_name}>
COMMENT "Embedding PTX generated from ${cuda_file}"
)
set (${output_var} ${embedded_file})
endmacro ()
endif ()
endif()
else ()
message (STATUS "CUDA not found")
endif ()
###########################################################################
# Annoying compiler-specific details
include (CheckCXXCompilerFlag)
check_cxx_compiler_flag ("-march=native" COMPILER_SUPPORTS_MARCH_NATIVE)
if (COMPILER_SUPPORTS_MARCH_NATIVE AND PBRT_BUILD_NATIVE_EXECUTABLE)
target_compile_options (pbrt_opt INTERFACE
"$<$<COMPILE_LANGUAGE:CUDA>:SHELL:-Xcompiler >-march=native")
endif ()
if (CMAKE_CXX_COMPILER_ID STREQUAL "Intel")
list (APPEND PBRT_CXX_FLAGS "-std=c++17")
find_program (XIAR xiar)
if (XIAR)
set (CMAKE_AR "${XIAR}")
endif (XIAR)
mark_as_advanced (XIAR)
find_program(XILD xild)
if (XILD)
set (CMAKE_LINKER "${XILD}")
endif (XILD)
mark_as_advanced (XILD)
# ICC will default to -fp-model fast=1, which performs value-unsafe optimizations which will
# cause pbrt_test to fail. For safety, -fp-model precise is explicitly set here by default.
set (FP_MODEL "precise" CACHE STRING "The floating point model to compile with.")
set_property (CACHE FP_MODEL PROPERTY STRINGS "precise" "fast=1" "fast=2")
list (APPEND PBRT_CXX_FLAGS "-fp-model" "${FP_MODEL}")
endif ()
if (MSVC AND MSVC_VERSION LESS 1920)
message (SEND_ERROR "pbrt-v4 currently requires MSVC 2019 to build on Windows. PRs that get MSVC 2017 working as well would be welcomed. :-)")
endif ()
###########################################################################
# Check for various C++ features and set preprocessor variables or
# define workarounds.
include (CheckCXXSourceCompiles)
check_cxx_source_compiles ("
#include <fcntl.h>
#include <sys/mman.h>
#include <sys/stat.h>
#include <sys/types.h>
int main() {
int fd = open(\"foo\", O_RDONLY);
struct stat s;
fstat(fd, &s);
size_t len = s.st_size;
void *ptr = mmap(0, len, PROT_READ, MAP_FILE | MAP_SHARED, fd, 0);
munmap(ptr, len);
}
" HAVE_MMAP)
if (HAVE_MMAP)
list (APPEND PBRT_DEFINITIONS "PBRT_HAVE_MMAP")
ENDIF ()
include (CheckIncludeFiles)
check_cxx_source_compiles ("
#include <intrin.h>
int main() {
unsigned long lz = 0, v = 1234;
if (_BitScanReverse(&lz, v)) return lz;
return 0;
} " HAS_INTRIN_H)
if (HAS_INTRIN_H)
list (APPEND PBRT_DEFINITIONS "PBRT_HAS_INTRIN_H")
endif ()
########################################
# noinline
check_cxx_source_compiles (
"__declspec(noinline) void foo() { }
int main() { }"
HAVE_DECLSPEC_NOINLINE)
check_cxx_source_compiles (
"__attribute__((noinline)) void foo() { }
int main() { }"
HAVE_ATTRIBUTE_NOINLINE)
if (HAVE_ATTRIBUTE_NOINLINE)
list (APPEND PBRT_DEFINITIONS "PBRT_NOINLINE=__attribute__((noinline))")
elseif (HAVE_DECLSPEC_NOINLINE)
list (APPEND PBRT_DEFINITIONS "PBRT_NOINLINE=__declspec(noinline)")
else ()
list (APPEND PBRT_DEFINITIONS "PBRT_NOINLINE")
endif ()
########################################
# restrict
check_cxx_source_compiles (
"int * __restrict__ ptr;
int main() { }"
HAVE_PRE_POST_BAR_RESTRICT)
check_cxx_source_compiles (
"int * __restrict ptr;
int main() { }"
HAVE_PRE_BAR_RESTRICT)
if (HAVE_PRE_POST_BAR_RESTRICT)
list (APPEND PBRT_DEFINITIONS "PBRT_RESTRICT=__restrict__")
elseif (HAVE_PRE_BAR_RESTRICT)
list (APPEND PBRT_DEFINITIONS "PBRT_RESTRICT=__restrict")
else ()
list (APPEND PBRT_DEFINITIONS "PBRT_RESTRICT")
endif ()
########################################
# Aligned memory allocation
check_cxx_source_compiles ( "
#include <malloc.h>
int main() { void * ptr = _aligned_malloc(1024, 32); }
" HAVE__ALIGNED_MALLOC )
check_cxx_source_compiles ( "
#include <stdlib.h>
int main() {
void *ptr;
posix_memalign(&ptr, 32, 1024);
} " HAVE_POSIX_MEMALIGN )
if (HAVE__ALIGNED_MALLOC)
list (APPEND PBRT_DEFINITIONS "PBRT_HAVE__ALIGNED_MALLOC")
elseif (HAVE_POSIX_MEMALIGN)
list (APPEND PBRT_DEFINITIONS "PBRT_HAVE_POSIX_MEMALIGN")
else ()
message (SEND_ERROR "Unable to find a way to allocate aligned memory")
endif ()
########################################
# are long and int64_t the same
check_cxx_source_compiles ("
#include <cstdint>
#include <type_traits>
static_assert(!std::is_same<long, int64_t>::value && !std::is_same<long long, int64_t>::value);
int main() { }
" INT64_IS_OWN_TYPE)
if (INT64_IS_OWN_TYPE)
list (APPEND PBRT_DEFINITIONS "PBRT_INT64_IS_OWN_TYPE")
endif ()
if (PBRT_NVTX)
add_definitions (-D NVTX)
endif()
###########################################################################
# On to pbrt...
set (PBRT_SOURCE
src/pbrt/bsdf.cpp
src/pbrt/bssrdf.cpp
src/pbrt/bxdfs.cpp
src/pbrt/cameras.cpp
src/pbrt/film.cpp
src/pbrt/filters.cpp
src/pbrt/interaction.cpp
src/pbrt/lights.cpp
src/pbrt/lightsamplers.cpp
src/pbrt/materials.cpp
src/pbrt/media.cpp
src/pbrt/options.cpp
src/pbrt/paramdict.cpp
src/pbrt/parser.cpp
src/pbrt/pbrt.cpp
src/pbrt/ray.cpp
src/pbrt/samplers.cpp
src/pbrt/scene.cpp
src/pbrt/shapes.cpp
src/pbrt/textures.cpp
src/pbrt/cmd/pspec_gpu.cpp
)
set (PBRT_SOURCE_HEADERS
src/pbrt/bsdf.h
src/pbrt/bssrdf.h
src/pbrt/bxdfs.h
src/pbrt/cameras.h
src/pbrt/film.h
src/pbrt/filters.h
src/pbrt/interaction.h
src/pbrt/lightsamplers.h
src/pbrt/lights.h
src/pbrt/materials.h
src/pbrt/media.h
src/pbrt/options.h
src/pbrt/paramdict.h
src/pbrt/parser.h
src/pbrt/pbrt.h
src/pbrt/pbrt.soa
src/pbrt/ray.h
src/pbrt/samplers.h
src/pbrt/scene.h
src/pbrt/shapes.h
src/pbrt/textures.h
)
SET (PBRT_CPU_SOURCE
src/pbrt/cpu/aggregates.cpp
src/pbrt/cpu/integrators.cpp
src/pbrt/cpu/primitive.cpp
src/pbrt/cpu/render.cpp
)
SET (PBRT_CPU_SOURCE_HEADERS
src/pbrt/cpu/aggregates.h
src/pbrt/cpu/integrators.h
src/pbrt/cpu/primitive.h
src/pbrt/cpu/render.h
)
SET (PBRT_WAVEFRONT_SOURCE
src/pbrt/wavefront/aggregate.cpp
src/pbrt/wavefront/camera.cpp
src/pbrt/wavefront/film.cpp
src/pbrt/wavefront/integrator.cpp
src/pbrt/wavefront/media.cpp
src/pbrt/wavefront/samples.cpp
src/pbrt/wavefront/surfscatter.cpp
src/pbrt/wavefront/subsurface.cpp
src/pbrt/wavefront/wavefront.cpp
)
SET (PBRT_WAVEFRONT_SOURCE_HEADERS
src/pbrt/wavefront/aggregate.h
src/pbrt/wavefront/integrator.h
src/pbrt/wavefront/intersect.h
src/pbrt/wavefront/wavefront.h
src/pbrt/wavefront/workitems.h
src/pbrt/wavefront/workitems.soa
src/pbrt/wavefront/workqueue.h
)
SET (PBRT_UTIL_SOURCE
src/pbrt/util/args.cpp
src/pbrt/util/bluenoise.cpp
src/pbrt/util/buffercache.cpp
src/pbrt/util/check.cpp
src/pbrt/util/color.cpp
src/pbrt/util/colorspace.cpp
src/pbrt/util/display.cpp
src/pbrt/util/error.cpp
src/pbrt/util/file.cpp
src/pbrt/util/float.cpp
src/pbrt/util/image.cpp
src/pbrt/util/log.cpp
src/pbrt/util/loopsubdiv.cpp
src/pbrt/util/lowdiscrepancy.cpp
src/pbrt/util/math.cpp
src/pbrt/util/memory.cpp
src/pbrt/util/mesh.cpp
src/pbrt/util/mipmap.cpp
src/pbrt/util/noise.cpp
src/pbrt/util/parallel.cpp
src/pbrt/util/pmj02tables.cpp
src/pbrt/util/primes.cpp
src/pbrt/util/print.cpp
src/pbrt/util/progressreporter.cpp
src/pbrt/util/pstd.cpp
src/pbrt/util/rng.cpp
src/pbrt/util/sampling.cpp
src/pbrt/util/scattering.cpp
src/pbrt/util/sobolmatrices.cpp
src/pbrt/util/spectrum.cpp
src/pbrt/util/stats.cpp
src/pbrt/util/stbimage.cpp
src/pbrt/util/string.cpp
src/pbrt/util/transform.cpp
src/pbrt/util/vecmath.cpp
)
SET (PBRT_UTIL_SOURCE_HEADERS
src/pbrt/util/args.h
src/pbrt/util/bluenoise.h
src/pbrt/util/buffercache.h
src/pbrt/util/check.h
src/pbrt/util/color.h
src/pbrt/util/colorspace.h
src/pbrt/util/containers.h
src/pbrt/util/display.h
src/pbrt/util/error.h
src/pbrt/util/file.h
src/pbrt/util/float.h
src/pbrt/util/hash.h
src/pbrt/util/image.h
src/pbrt/util/log.h
src/pbrt/util/loopsubdiv.h
src/pbrt/util/lowdiscrepancy.h
src/pbrt/util/math.h
src/pbrt/util/memory.h
src/pbrt/util/mesh.h
src/pbrt/util/mipmap.h
src/pbrt/util/noise.h
src/pbrt/util/parallel.h
src/pbrt/util/pmj02tables.h
src/pbrt/util/primes.h
src/pbrt/util/print.h
src/pbrt/util/progressreporter.h
src/pbrt/util/pstd.h
src/pbrt/util/rng.h
src/pbrt/util/sampling.h
src/pbrt/util/scattering.h
src/pbrt/util/soa.h
src/pbrt/util/sobolmatrices.h
src/pbrt/util/spectrum.h
src/pbrt/util/splines.h
src/pbrt/util/stats.h
src/pbrt/util/string.h
src/pbrt/util/taggedptr.h
src/pbrt/util/transform.h
src/pbrt/util/vecmath.h
)
if (PBRT_CUDA_ENABLED)
set (PBRT_GPU_SOURCE
src/pbrt/gpu/aggregate.cpp
src/pbrt/gpu/memory.cpp
src/pbrt/gpu/util.cpp
)
set (PBRT_GPU_SOURCE_HEADERS
src/pbrt/gpu/aggregate.h
src/pbrt/gpu/memory.h
src/pbrt/gpu/optix.h
src/pbrt/gpu/util.h
)
set_source_files_properties (
src/pbrt/bsdf.cpp
src/pbrt/bssrdf.cpp
src/pbrt/bxdfs.cpp
src/pbrt/cameras.cpp
src/pbrt/film.cpp
src/pbrt/filters.cpp
# src/pbrt/genscene.cpp
src/pbrt/interaction.cpp
src/pbrt/lights.cpp
src/pbrt/lightsamplers.cpp
src/pbrt/materials.cpp
# src/pbrt/media.cpp
src/pbrt/options.cpp
# src/pbrt/paramdict.cpp
# src/pbrt/parser.cpp
src/pbrt/pbrt.cpp
src/pbrt/samplers.cpp
src/pbrt/shapes.cpp
src/pbrt/textures.cpp
src/pbrt/util/bluenoise.cpp
src/pbrt/util/check.cpp
src/pbrt/util/color.cpp
src/pbrt/util/colorspace.cpp
src/pbrt/util/error.cpp
# src/pbrt/util/file.cpp
# src/pbrt/util/float.cpp
# src/pbrt/util/image.cpp
src/pbrt/util/log.cpp
# src/pbrt/util/loopsubdiv.cpp
src/pbrt/util/lowdiscrepancy.cpp
src/pbrt/util/math.cpp
# src/pbrt/util/memory.cpp
src/pbrt/util/mesh.cpp
# src/pbrt/util/mipmap.cpp
src/pbrt/util/noise.cpp
# src/pbrt/util/parallel.cpp
src/pbrt/util/pmj02tables.cpp
src/pbrt/util/primes.cpp
# src/pbrt/util/print.cpp
# src/pbrt/util/progressreporter.cpp
src/pbrt/util/pstd.cpp
src/pbrt/util/rng.cpp
src/pbrt/util/sampling.cpp
src/pbrt/util/scattering.cpp
src/pbrt/util/sobolmatrices.cpp
src/pbrt/util/spectrum.cpp
src/pbrt/util/stats.cpp
# src/pbrt/util/stbimage.cpp
# src/pbrt/util/string.cpp
src/pbrt/util/transform.cpp
src/pbrt/util/vecmath.cpp
${PBRT_WAVEFRONT_SOURCE}
${PBRT_GPU_SOURCE}
src/pbrt/cmd/pspec_gpu.cpp
PROPERTIES LANGUAGE CUDA
)
cuda_compile_and_embed (PBRT_EMBEDDED_PTX src/pbrt/gpu/optix.cu optix.cu)
endif ()
source_group ("Source Files" FILES ${PBRT_SOURCE})
source_group ("Header Files" FILES ${PBRT_SOURCE_HEADERS})
source_group ("Source Files/cpu" FILES ${PBRT_CPU_SOURCE})
source_group ("Header Files/cpu" FILES ${PBRT_CPU_SOURCE_HEADERS})
source_group ("Source Files/util" FILES ${PBRT_UTIL_SOURCE})
source_group ("Header Files/util" FILES ${PBRT_UTIL_SOURCE_HEADERS})
source_group ("Source Files/wavefront" FILES ${PBRT_WAVEFRONT_SOURCE})
source_group ("Header Files/wavefront" FILES ${PBRT_WAVEFRONT_SOURCE_HEADERS})
if (PBRT_CUDA_ENABLED)
source_group ("Source Files/gpu" FILES ${PBRT_GPU_SOURCE})
source_group ("Header Files/gpu" FILES ${PBRT_GPU_SOURCE_HEADERS})
endif ()
###########################################################################
# pbrt libraries and executables
list (APPEND PBRT_DEFINITIONS "PTEX_STATIC")
######################
# soac
add_executable (soac src/pbrt/cmd/soac.cpp)
add_executable (pbrt::soac ALIAS soac)
target_compile_definitions (soac PRIVATE ${PBRT_DEFINITIONS})
target_compile_options (soac PUBLIC ${PBRT_CXX_FLAGS})
target_link_libraries (soac PRIVATE pbrt_warnings pbrt_opt)
set_target_properties (soac PROPERTIES OUTPUT_NAME soac)
add_custom_command (OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/pbrt_soa.h
COMMAND soac ${CMAKE_SOURCE_DIR}/src/pbrt/pbrt.soa > ${CMAKE_CURRENT_BINARY_DIR}/pbrt_soa.h
DEPENDS soac ${CMAKE_SOURCE_DIR}/src/pbrt/pbrt.soa)
set (PBRT_SOA_GENERATED ${CMAKE_CURRENT_BINARY_DIR}/pbrt_soa.h)
add_custom_command (OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/wavefront_workitems_soa.h
COMMAND soac ${CMAKE_SOURCE_DIR}/src/pbrt/wavefront/workitems.soa > ${CMAKE_CURRENT_BINARY_DIR}/wavefront_workitems_soa.h
DEPENDS soac ${CMAKE_SOURCE_DIR}/src/pbrt/wavefront/workitems.soa)
set (PBRT_SOA_GENERATED ${PBRT_SOA_GENERATED} ${CMAKE_CURRENT_BINARY_DIR}/wavefront_workitems_soa.h)
add_custom_target (pbrt_soa_generated DEPENDS ${PBRT_SOA_GENERATED})
set_property (TARGET soac PROPERTY FOLDER "cmd")
######################
# pbrt_lib
add_library (pbrt_lib STATIC
${CMAKE_CURRENT_BINARY_DIR}/rgbspectrum_srgb.cpp
${CMAKE_CURRENT_BINARY_DIR}/rgbspectrum_dci_p3.cpp
${CMAKE_CURRENT_BINARY_DIR}/rgbspectrum_rec2020.cpp
${CMAKE_CURRENT_BINARY_DIR}/rgbspectrum_aces.cpp
${PBRT_SOA_GENERATED}
${PBRT_SOURCE}
${PBRT_SOURCE_HEADERS}
${PBRT_CPU_SOURCE}
${PBRT_CPU_SOURCE_HEADERS}
${PBRT_UTIL_SOURCE}
${PBRT_UTIL_SOURCE_HEADERS}
${PBRT_WAVEFRONT_SOURCE}
${PBRT_WAVEFRONT_SOURCE_HEADERS}
${PBRT_GPU_SOURCE}
${PBRT_GPU_SOURCE_HEADERS}
src/ext/gtest/gtest-all.cc
src/ext/lodepng/lodepng.cpp
src/ext/rply/rply.cpp
)
add_library (pbrt::pbrt_lib ALIAS pbrt_lib)
add_dependencies (pbrt_lib pbrt_soa_generated)
target_compile_definitions (pbrt_lib PRIVATE ${PBRT_DEFINITIONS})
# Attempt to work-around Windows/CUDA build issues.
# As per https://stackoverflow.com/a/51566919, this works around a cmake
# bug that leads to undefined symbols...
set_property(TARGET pbrt_lib PROPERTY CUDA_RESOLVE_DEVICE_SYMBOLS ON)
target_include_directories (pbrt_lib PUBLIC
src
src/ext
${STB_INCLUDE}
${OPENEXR_INCLUDE}
${ZLIB_INCLUDE_DIRS}
${LIBDEFLATE_INCLUDE_DIRS}
${FILESYSTEM_INCLUDE}
${PTEX_INCLUDE}
${DOUBLE_CONVERSION_INCLUDE}
${NANOVDB_INCLUDE}
${CMAKE_CURRENT_BINARY_DIR}
)
if (PBRT_CUDA_ENABLED AND PBRT_OPTIX7_PATH)
target_include_directories (pbrt_lib SYSTEM PUBLIC ${PBRT_OPTIX7_PATH}/include)
endif ()
target_compile_options (pbrt_lib PUBLIC ${PBRT_CXX_FLAGS})
target_link_libraries (pbrt_lib PRIVATE pbrt_warnings pbrt_opt $<$<BOOL:PBRT_CUDA_ENABLED>:cuda_build_configuration>)
add_sanitizers (pbrt_lib)
if (WIN32)
# Avoid a name clash when building on Visual Studio
set_target_properties (pbrt_lib PROPERTIES OUTPUT_NAME libpbrt)
endif()
set (ALL_PBRT_LIBS
pbrt_lib
${CMAKE_THREAD_LIBS_INIT}
${OPENEXR_LIBS}
Ptex_static
${ZLIB_LIBRARIES}
${LIBDEFLATE_LIBRARIES}
double-conversion
${PBRT_CUDA_LIB}
utf8proc
)
if (PBRT_CUDA_ENABLED)
set_property (TARGET pbrt_lib PROPERTY CUDA_SEPARABLE_COMPILATION ON)
add_library (pbrt_embedded_ptx_lib STATIC
${PBRT_EMBEDDED_PTX}
)
add_dependencies (pbrt_embedded_ptx_lib pbrt_soa_generated)
list (APPEND ALL_PBRT_LIBS pbrt_embedded_ptx_lib)
if (PBRT_NVML)
list (APPEND ALL_PBRT_LIBS "nvidia-ml")
endif ()
endif ()
if (WIN32)
list (APPEND ALL_PBRT_LIBS "dbghelp" "wsock32" "ws2_32")
endif ()
if (PROFILE_LIB)
list (APPEND ALL_PBRT_LIBS "${PROFILE_LIB}")
endif ()
######################
## rgb2spec_opt
add_executable (rgb2spec_opt src/pbrt/cmd/rgb2spec_opt.cpp)
add_executable (pbrt::rgb2spec_opt ALIAS rgb2spec_opt)
target_compile_definitions (rgb2spec_opt PRIVATE ${PBRT_DEFINITIONS})
target_compile_options (rgb2spec_opt PUBLIC ${PBRT_CXX_FLAGS})
target_link_libraries (rgb2spec_opt PRIVATE ${CMAKE_THREAD_LIBS_INIT} pbrt_opt pbrt_warnings)
if (NOT PBRT_USE_PREGENERATED_RGB_TO_SPECTRUM_TABLES)
add_custom_command (OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/rgbspectrum_aces.cpp
COMMAND rgb2spec_opt 64 ${CMAKE_CURRENT_BINARY_DIR}/rgbspectrum_aces.cpp ACES2065_1
DEPENDS rgb2spec_opt)
add_custom_command (OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/rgbspectrum_dci_p3.cpp
COMMAND rgb2spec_opt 64 ${CMAKE_CURRENT_BINARY_DIR}/rgbspectrum_dci_p3.cpp DCI_P3
DEPENDS rgb2spec_opt)
add_custom_command (OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/rgbspectrum_rec2020.cpp
COMMAND rgb2spec_opt 64 ${CMAKE_CURRENT_BINARY_DIR}/rgbspectrum_rec2020.cpp REC2020
DEPENDS rgb2spec_opt)
add_custom_command (OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/rgbspectrum_srgb.cpp
COMMAND rgb2spec_opt 64 ${CMAKE_CURRENT_BINARY_DIR}/rgbspectrum_srgb.cpp sRGB
DEPENDS rgb2spec_opt)
endif ()
set_property (TARGET rgb2spec_opt PROPERTY FOLDER "cmd")
######################
# Main renderer
add_executable (pbrt_exe src/pbrt/cmd/pbrt.cpp)
add_executable (pbrt::pbrt_exe ALIAS pbrt_exe)
target_compile_definitions (pbrt_exe PRIVATE ${PBRT_DEFINITIONS})
target_compile_options (pbrt_exe PRIVATE ${PBRT_CXX_FLAGS})
target_include_directories (pbrt_exe PRIVATE src src/ext)
target_link_libraries (pbrt_exe PRIVATE ${ALL_PBRT_LIBS} pbrt_opt pbrt_warnings)
set_target_properties (pbrt_exe PROPERTIES OUTPUT_NAME pbrt)
add_sanitizers (pbrt_exe)
set_property (TARGET pbrt_exe PROPERTY FOLDER "cmd")
######################
# imgtool
add_executable (imgtool src/pbrt/cmd/imgtool.cpp)
add_executable (pbrt::imgtool ALIAS imgtool)
add_library (sky_lib STATIC src/ext/skymodel/ArHosekSkyModel.c)
set_property (TARGET sky_lib PROPERTY FOLDER "ext")
target_compile_definitions (imgtool PRIVATE ${PBRT_DEFINITIONS})
target_compile_options (imgtool PRIVATE ${PBRT_CXX_FLAGS})
target_include_directories (imgtool PRIVATE src src/ext ${FLIP_INCLUDE})
target_link_libraries (imgtool PRIVATE ${ALL_PBRT_LIBS} pbrt_opt pbrt_warnings sky_lib flip_lib)
add_sanitizers (imgtool)
set_property (TARGET imgtool PROPERTY FOLDER "cmd")
######################
# pspec
add_executable (pspec src/pbrt/cmd/pspec.cpp)
add_executable (pbrt::pspec ALIAS pspec)
target_compile_definitions (pspec PRIVATE ${PBRT_DEFINITIONS})
target_compile_options (pspec PRIVATE ${PBRT_CXX_FLAGS})
target_include_directories (pspec PRIVATE src src/ext)
target_link_libraries (pspec PRIVATE ${ALL_PBRT_LIBS} pbrt_warnings)
add_sanitizers (pspec)
set_property (TARGET pspec PROPERTY FOLDER "cmd")
######################
# plytool
add_executable (plytool src/pbrt/cmd/plytool.cpp)
add_executable (pbrt::plytool ALIAS plytool)
target_compile_definitions (plytool PRIVATE ${PBRT_DEFINITIONS})
target_compile_options (plytool PUBLIC ${PBRT_CXX_FLAGS})
target_include_directories (plytool PUBLIC src src/ext)
target_link_libraries (plytool PRIVATE ${ALL_PBRT_LIBS} pbrt_warnings pbrt_opt)
set_target_properties (plytool PROPERTIES OUTPUT_NAME plytool)
add_sanitizers (plytool)
set_property (TARGET plytool PROPERTY FOLDER "cmd")
######################
# cyhair2pbrt
add_executable (cyhair2pbrt src/pbrt/cmd/cyhair2pbrt.cpp)
target_compile_definitions (cyhair2pbrt PRIVATE ${PBRT_DEFINITIONS})
target_compile_options (cyhair2pbrt PRIVATE ${PBRT_CXX_FLAGS})
target_link_libraries (cyhair2pbrt PRIVATE pbrt_opt pbrt_warnings)
add_sanitizers (cyhair2pbrt)
set_property (TARGET cyhair2pbrt PROPERTY FOLDER "cmd")
##################
# Unit tests
set (PBRT_TEST_SOURCE
src/pbrt/bsdfs_test.cpp
src/pbrt/filters_test.cpp
src/pbrt/lights_test.cpp
src/pbrt/lightsamplers_test.cpp
src/pbrt/media_test.cpp
src/pbrt/parser_test.cpp
src/pbrt/samplers_test.cpp
src/pbrt/shapes_test.cpp
src/pbrt/cpu/integrators_test.cpp
src/pbrt/util/args_test.cpp
src/pbrt/util/buffercache_test.cpp
src/pbrt/util/color_test.cpp
src/pbrt/util/containers_test.cpp
src/pbrt/util/file_test.cpp
src/pbrt/util/float_test.cpp
src/pbrt/util/hash_test.cpp
src/pbrt/util/image_test.cpp
src/pbrt/util/math_test.cpp
src/pbrt/util/parallel_test.cpp
src/pbrt/util/print_test.cpp
src/pbrt/util/pstd_test.cpp
src/pbrt/util/rng_test.cpp
src/pbrt/util/sampling_test.cpp
src/pbrt/util/spectrum_test.cpp
src/pbrt/util/splines_test.cpp
src/pbrt/util/string_test.cpp
src/pbrt/util/taggedptr_test.cpp
src/pbrt/util/transform_test.cpp
src/pbrt/util/vecmath_test.cpp
)
add_executable (pbrt_test src/pbrt/cmd/pbrt_test.cpp ${PBRT_TEST_SOURCE})
target_link_libraries (pbrt_test PRIVATE ${ALL_PBRT_LIBS} pbrt_opt pbrt_warnings)
target_compile_definitions (pbrt_test PRIVATE ${PBRT_DEFINITIONS})
target_include_directories (pbrt_test PRIVATE src src/ext ${DOUBLE_CONVERSION_INCLUDE})
target_compile_options(pbrt_test PUBLIC ${PBRT_CXX_FLAGS})
add_sanitizers (pbrt_test)
add_test (pbrt_unit_test pbrt_test)
set_property (TARGET pbrt_test PROPERTY FOLDER "cmd")
###############################
# Installation
install (TARGETS
pbrt_exe
imgtool
pspec
plytool
cyhair2pbrt
DESTINATION
bin
)
install (TARGETS
pbrt_lib
DESTINATION
lib
)