mark_as_advanced(WITH_CYCLES_DEBUG)
mark_as_advanced(WITH_CYCLES_WERROR)
+option(WITH_CUDA_DYNLOAD "Dynamically load CUDA libraries at runtime" ON)
+mark_as_advanced(WITH_CUDA_DYNLOAD)
+
# LLVM
option(WITH_LLVM "Use LLVM" OFF)
if(APPLE)
elseif(WITH_CYCLES_STANDALONE)
add_subdirectory(intern/cycles)
add_subdirectory(extern/clew)
- add_subdirectory(extern/cuew)
+ if(WITH_CUDA_DYNLOAD)
+ add_subdirectory(extern/cuew)
+ endif()
if(NOT WITH_SYSTEM_GLEW)
add_subdirectory(extern/glew)
endif()
# We put CLEW and CUEW here because OPENSUBDIV_LIBRARIES dpeends on them..
if(WITH_CYCLES OR WITH_COMPOSITOR OR WITH_OPENSUBDIV)
target_link_libraries(${target} "extern_clew")
- target_link_libraries(${target} "extern_cuew")
+ if(WITH_CUDA_DYNLOAD)
+ target_link_libraries(${target} "extern_cuew")
+ else()
+ target_link_libraries(${target} ${CUDA_CUDA_LIBRARY})
+ endif()
endif()
#system libraries with no dependencies such as platform link libs or opengl should go last
if(WITH_CYCLES OR WITH_COMPOSITOR OR WITH_OPENSUBDIV)
add_subdirectory(clew)
- add_subdirectory(cuew)
+ if(WITH_CUDA_DYNLOAD)
+ add_subdirectory(cuew)
+ endif()
endif()
if(WITH_MOD_BOOLEAN)
${TIFF_LIBRARY}
${PTHREADS_LIBRARIES}
extern_clew
- extern_cuew
)
+if(WITH_CUDA_DYNLOAD)
+ list(APPEND LIBRARIES extern_cuew)
+else()
+ list(APPEND LIBRARIES ${CUDA_CUDA_LIBRARY})
+endif()
+
if(WITH_CYCLES_OSL)
list(APPEND LIBRARIES cycles_kernel_osl)
endif()
###########################################################################
# CUDA
-if(WITH_CYCLES_CUDA_BINARIES)
+if(WITH_CYCLES_CUDA_BINARIES OR NOT WITH_CUDA_DUNLOAD)
find_package(CUDA) # Try to auto locate CUDA toolkit
if(CUDA_FOUND)
message(STATUS "CUDA nvcc = ${CUDA_NVCC_EXECUTABLE}")
set(INC_SYS
${GLEW_INCLUDE_DIR}
- ../../../extern/cuew/include
../../../extern/clew/include
)
+if(WITH_CUDA_DYNLOAD)
+ list(APPEND INC ../../../extern/cuew/include)
+ add_definitions(-DWITH_CUDA_DYNLOAD)
+else()
+ list(APPEND INC_SYS ${CUDA_TOOLKIT_INCLUDE})
+ add_definitions(-DCYCLES_CUDA_NVCC_EXECUTABLE="${CUDA_NVCC_EXECUTABLE}")
+endif()
+
set(SRC
device.cpp
device_cpu.cpp
#include "buffers.h"
-#include "cuew.h"
+#ifdef WITH_CUDA_DYNLOAD
+# include "cuew.h"
+#else
+# include "util_opengl.h"
+# include <cuda.h>
+# include <cudaGL.h>
+#endif
#include "util_debug.h"
#include "util_logging.h"
#include "util_map.h"
CCL_NAMESPACE_BEGIN
+#ifndef WITH_CUDA_DYNLOAD
+
+/* Transparently implement some functions, so majority of the file does not need
+ * to worry about difference between dynamically loaded and linked CUDA at all.
+ */
+
+namespace {
+
+const char *cuewErrorString(CUresult result)
+{
+ /* We can only give error code here without major code duplication, that
+ * should be enough since dynamic loading is only being disabled by folks
+ * who knows what they're doing anyway.
+ *
+ * NOTE: Avoid call from several threads.
+ */
+ static string error;
+ error = string_printf("%d", result);
+ return error.c_str();
+}
+
+const char *cuewCompilerPath(void)
+{
+ return CYCLES_CUDA_NVCC_EXECUTABLE;
+}
+
+int cuewCompilerVersion(void)
+{
+ return (CUDA_VERSION / 100) + (CUDA_VERSION % 100 / 10);
+}
+
+} /* namespace */
+#endif /* WITH_CUDA_DYNLOAD */
+
class CUDADevice : public Device
{
public:
bool device_cuda_init(void)
{
+#ifdef WITH_CUDA_DYNLOAD
static bool initialized = false;
static bool result = false;
}
return result;
+#else /* WITH_CUDA_DYNLOAD */
+ return true;
+#endif /* WITH_CUDA_DYNLOAD */
}
Device *device_cuda_create(DeviceInfo& info, Stats &stats, bool background)
# We put CLEW and CUEW here because OPENSUBDIV_LIBRARIES dpeends on them..
if(WITH_CYCLES OR WITH_COMPOSITOR OR WITH_OPENSUBDIV)
target_link_libraries(blenderplayer "extern_clew")
- target_link_libraries(blenderplayer "extern_cuew")
+ if(WITH_CUDA_DYNLOAD)
+ target_link_libraries(blenderplayer "extern_cuew")
+ else()
+ target_link_libraries(${target} ${CUDA_CUDA_LIBRARY})
+ endif()
endif()