diff --git a/CMakeLists.txt b/CMakeLists.txt index f8f56945e1..6657de2c05 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -412,15 +412,6 @@ endif() # --- OpenCL --- if(WITH_OPENCL) include(cmake/OpenCVDetectOpenCL.cmake) - if(OPENCL_FOUND) - set(HAVE_OPENCL 1) - endif() - if(WITH_OPENCLAMDFFT AND CLAMDFFT_INCLUDE_DIR) - set(HAVE_CLAMDFFT 1) - endif() - if(WITH_OPENCLAMDBLAS AND CLAMDBLAS_INCLUDE_DIR) - set(HAVE_CLAMDBLAS 1) - endif() endif() # ---------------------------------------------------------------------------- @@ -795,7 +786,7 @@ if(HAVE_OPENCL AND BUILD_opencv_ocl) status("") status(" OpenCL") if(OPENCL_INCLUDE_DIR) - status(" Include path:" ${OPENCL_INCLUDE_DIR}) + status(" Include path:" ${OPENCL_INCLUDE_DIRS}) endif() if(OPENCL_LIBRARIES) status(" libraries:" ${OPENCL_LIBRARIES}) diff --git a/cmake/OpenCVDetectOpenCL.cmake b/cmake/OpenCVDetectOpenCL.cmake index 12ab9d3eae..76f76ebc12 100644 --- a/cmake/OpenCVDetectOpenCL.cmake +++ b/cmake/OpenCVDetectOpenCL.cmake @@ -1,154 +1,104 @@ if(APPLE) set(OPENCL_FOUND YES) - set(OPENCL_LIBRARIES "-framework OpenCL") -else() + set(OPENCL_LIBRARY "-framework OpenCL" CACHE STRING "OpenCL library") + set(OPENCL_INCLUDE_DIR "" CACHE STRING "OpenCL include directory") + mark_as_advanced(OPENCL_INCLUDE_DIR OPENCL_LIBRARY) +else(APPLE) find_package(OpenCL QUIET) - if(WITH_OPENCLAMDFFT) - set(CLAMDFFT_SEARCH_PATH $ENV{CLAMDFFT_PATH}) - if(NOT CLAMDFFT_SEARCH_PATH) - if(WIN32) - set( CLAMDFFT_SEARCH_PATH "C:\\Program Files (x86)\\AMD\\clAmdFft" ) - endif() - endif() - set( CLAMDFFT_INCLUDE_SEARCH_PATH ${CLAMDFFT_SEARCH_PATH}/include ) - if(UNIX) - if(CMAKE_SIZEOF_VOID_P EQUAL 4) - set(CLAMDFFT_LIB_SEARCH_PATH /usr/lib) - else() - set(CLAMDFFT_LIB_SEARCH_PATH /usr/lib64) - endif() - else() - if(CMAKE_SIZEOF_VOID_P EQUAL 4) - set(CLAMDFFT_LIB_SEARCH_PATH ${CLAMDFFT_SEARCH_PATH}\\lib32\\import) - else() - set(CLAMDFFT_LIB_SEARCH_PATH ${CLAMDFFT_SEARCH_PATH}\\lib64\\import) - endif() - endif() - find_path(CLAMDFFT_INCLUDE_DIR - NAMES clAmdFft.h - PATHS ${CLAMDFFT_INCLUDE_SEARCH_PATH} - PATH_SUFFIXES clAmdFft - NO_DEFAULT_PATH) - find_library(CLAMDFFT_LIBRARY - NAMES clAmdFft.Runtime - PATHS ${CLAMDFFT_LIB_SEARCH_PATH} - NO_DEFAULT_PATH) - if(CLAMDFFT_LIBRARY) - set(CLAMDFFT_LIBRARIES ${CLAMDFFT_LIBRARY}) - else() - set(CLAMDFFT_LIBRARIES "") - endif() - endif() - if(WITH_OPENCLAMDBLAS) - set(CLAMDBLAS_SEARCH_PATH $ENV{CLAMDBLAS_PATH}) - if(NOT CLAMDBLAS_SEARCH_PATH) - if(WIN32) - set( CLAMDBLAS_SEARCH_PATH "C:\\Program Files (x86)\\AMD\\clAmdBlas" ) - endif() - endif() - set( CLAMDBLAS_INCLUDE_SEARCH_PATH ${CLAMDBLAS_SEARCH_PATH}/include ) - if(UNIX) - if(CMAKE_SIZEOF_VOID_P EQUAL 4) - set(CLAMDBLAS_LIB_SEARCH_PATH /usr/lib) - else() - set(CLAMDBLAS_LIB_SEARCH_PATH /usr/lib64) - endif() - else() - if(CMAKE_SIZEOF_VOID_P EQUAL 4) - set(CLAMDBLAS_LIB_SEARCH_PATH ${CLAMDBLAS_SEARCH_PATH}\\lib32\\import) - else() - set(CLAMDBLAS_LIB_SEARCH_PATH ${CLAMDBLAS_SEARCH_PATH}\\lib64\\import) - endif() - endif() - find_path(CLAMDBLAS_INCLUDE_DIR - NAMES clAmdBlas.h - PATHS ${CLAMDBLAS_INCLUDE_SEARCH_PATH} - PATH_SUFFIXES clAmdBlas - NO_DEFAULT_PATH) - find_library(CLAMDBLAS_LIBRARY - NAMES clAmdBlas - PATHS ${CLAMDBLAS_LIB_SEARCH_PATH} - NO_DEFAULT_PATH) - if(CLAMDBLAS_LIBRARY) - set(CLAMDBLAS_LIBRARIES ${CLAMDBLAS_LIBRARY}) - else() - set(CLAMDBLAS_LIBRARIES "") - endif() - endif() - # Try AMD/ATI Stream SDK + if (NOT OPENCL_FOUND) - set(ENV_AMDSTREAMSDKROOT $ENV{AMDAPPSDKROOT}) - set(ENV_AMDAPPSDKROOT $ENV{AMDAPPSDKROOT}) - set(ENV_OPENCLROOT $ENV{OPENCLROOT}) - set(ENV_CUDA_PATH $ENV{CUDA_PATH}) - set(ENV_INTELOCLSDKROOT $ENV{INTELOCLSDKROOT}) - if(ENV_AMDSTREAMSDKROOT) - set(OPENCL_INCLUDE_SEARCH_PATH ${ENV_AMDAPPSDKROOT}/include) - if(CMAKE_SIZEOF_VOID_P EQUAL 4) - set(OPENCL_LIB_SEARCH_PATH ${OPENCL_LIB_SEARCH_PATH} ${ENV_AMDAPPSDKROOT}/lib/x86) - else() - set(OPENCL_LIB_SEARCH_PATH ${OPENCL_LIB_SEARCH_PATH} ${ENV_AMDAPPSDKROOT}/lib/x86_64) - endif() - elseif(ENV_AMDSTREAMSDKROOT) - set(OPENCL_INCLUDE_SEARCH_PATH ${ENV_AMDSTREAMSDKROOT}/include) - if(CMAKE_SIZEOF_VOID_P EQUAL 4) - set(OPENCL_LIB_SEARCH_PATH ${OPENCL_LIB_SEARCH_PATH} ${ENV_AMDSTREAMSDKROOT}/lib/x86) - else() - set(OPENCL_LIB_SEARCH_PATH ${OPENCL_LIB_SEARCH_PATH} ${ENV_AMDSTREAMSDKROOT}/lib/x86_64) - endif() - elseif(ENV_CUDA_PATH AND WIN32) - set(OPENCL_INCLUDE_SEARCH_PATH ${ENV_CUDA_PATH}/include) - if(CMAKE_SIZEOF_VOID_P EQUAL 4) - set(OPENCL_LIB_SEARCH_PATH ${OPENCL_LIB_SEARCH_PATH} ${ENV_CUDA_PATH}/lib/Win32) - else() - set(OPENCL_LIB_SEARCH_PATH ${OPENCL_LIB_SEARCH_PATH} ${ENV_CUDA_PATH}/lib/x64) - endif() - elseif(ENV_OPENCLROOT AND UNIX) - set(OPENCL_INCLUDE_SEARCH_PATH ${ENV_OPENCLROOT}/inc) - if(CMAKE_SIZEOF_VOID_P EQUAL 4) - set(OPENCL_LIB_SEARCH_PATH ${OPENCL_LIB_SEARCH_PATH} /usr/lib) - else() - set(OPENCL_LIB_SEARCH_PATH ${OPENCL_LIB_SEARCH_PATH} /usr/lib64) - endif() - elseif(ENV_INTELOCLSDKROOT) - set(OPENCL_INCLUDE_SEARCH_PATH ${ENV_INTELOCLSDKROOT}/include) - if(CMAKE_SIZEOF_VOID_P EQUAL 4) - set(OPENCL_LIB_SEARCH_PATH ${OPENCL_LIB_SEARCH_PATH} ${ENV_INTELOCLSDKROOT}/lib/x86) - else() - set(OPENCL_LIB_SEARCH_PATH ${OPENCL_LIB_SEARCH_PATH} ${ENV_INTELOCLSDKROOT}/lib/x64) - endif() + find_path(OPENCL_ROOT_DIR + NAMES OpenCL/cl.h CL/cl.h include/CL/cl.h include/nvidia-current/CL/cl.h + PATHS ENV OCLROOT ENV AMDAPPSDKROOT ENV CUDA_PATH ENV INTELOCLSDKROOT + DOC "OpenCL root directory" + NO_DEFAULT_PATH) + + find_path(OPENCL_INCLUDE_DIR + NAMES OpenCL/cl.h CL/cl.h + HINTS ${OPENCL_ROOT_DIR} + PATH_SUFFIXES include include/nvidia-current + DOC "OpenCL include directory") + + if (X86_64) + set(OPENCL_POSSIBLE_LIB_SUFFIXES lib/Win64 lib/x86_64 lib/x64) + elseif (X86) + set(OPENCL_POSSIBLE_LIB_SUFFIXES lib/Win32 lib/x86) endif() - if(OPENCL_INCLUDE_SEARCH_PATH) - find_path(OPENCL_INCLUDE_DIR - NAMES CL/cl.h OpenCL/cl.h - PATHS ${OPENCL_INCLUDE_SEARCH_PATH} - NO_DEFAULT_PATH) - else() - find_path(OPENCL_INCLUDE_DIR - NAMES CL/cl.h OpenCL/cl.h) - endif() - - if(OPENCL_LIB_SEARCH_PATH) - find_library(OPENCL_LIBRARY NAMES OpenCL PATHS ${OPENCL_LIB_SEARCH_PATH} NO_DEFAULT_PATH) - else() - find_library(OPENCL_LIBRARY NAMES OpenCL) - endif() + find_library(OPENCL_LIBRARY + NAMES OpenCL + HINTS ${OPENCL_ROOT_DIR} + PATH_SUFFIXES ${OPENCL_POSSIBLE_LIB_SUFFIXES} + DOC "OpenCL library") + mark_as_advanced(OPENCL_INCLUDE_DIR OPENCL_LIBRARY) include(FindPackageHandleStandardArgs) - find_package_handle_standard_args( - OPENCL - DEFAULT_MSG - OPENCL_LIBRARY OPENCL_INCLUDE_DIR - ) + FIND_PACKAGE_HANDLE_STANDARD_ARGS(OPENCL DEFAULT_MSG OPENCL_LIBRARY OPENCL_INCLUDE_DIR ) + endif() +endif(APPLE) - if(OPENCL_FOUND) - set(OPENCL_LIBRARIES ${OPENCL_LIBRARY}) - set(HAVE_OPENCL 1) - else() - set(OPENCL_LIBRARIES) +if(OPENCL_FOUND) + set(HAVE_OPENCL 1) + set(OPENCL_INCLUDE_DIRS ${OPENCL_INCLUDE_DIR}) + set(OPENCL_LIBRARIES ${OPENCL_LIBRARY}) + + if (X86_64) + set(CLAMD_POSSIBLE_LIB_SUFFIXES lib32/import) + elseif (X86) + set(CLAMD_POSSIBLE_LIB_SUFFIXES lib32/import) + endif() + + if(WITH_OPENCLAMDFFT) + find_path(CLAMDFFT_ROOT_DIR + NAMES include/clAmdFft.h + PATHS ENV CLAMDFFT_PATH ENV ProgramFiles + PATH_SUFFIXES clAmdFft AMD/clAmdFft + DOC "AMD FFT root directory" + NO_DEFAULT_PATH) + + find_path(CLAMDFFT_INCLUDE_DIR + NAMES clAmdFft.h + HINTS ${CLAMDFFT_ROOT_DIR} + PATH_SUFFIXES include + DOC "clAmdFft include directory") + + find_library(CLAMDFFT_LIBRARY + NAMES clAmdFft.Runtime + HINTS ${CLAMDFFT_ROOT_DIR} + PATH_SUFFIXES ${CLAMD_POSSIBLE_LIB_SUFFIXES} + DOC "clAmdFft library") + + if(CLAMDFFT_LIBRARY AND CLAMDFFT_INCLUDE_DIR) + set(HAVE_CLAMDFFT 1) + list(APPEND OPENCL_INCLUDE_DIRS "${CLAMDFFT_INCLUDE_DIR}") + list(APPEND OPENCL_LIBRARIES "${CLAMDFFT_LIBRARY}") + endif() + endif() + + if(WITH_OPENCLAMDBLAS) + find_path(CLAMDBLAS_ROOT_DIR + NAMES include/clAmdBlas.h + PATHS ENV CLAMDFFT_PATH ENV ProgramFiles + PATH_SUFFIXES clAmdBlas AMD/clAmdBlas + DOC "AMD FFT root directory" + NO_DEFAULT_PATH) + + find_path(CLAMDBLAS_INCLUDE_DIR + NAMES clAmdBlas.h + HINTS ${CLAMDBLAS_ROOT_DIR} + PATH_SUFFIXES include + DOC "clAmdFft include directory") + + find_library(CLAMDBLAS_LIBRARY + NAMES clAmdBlas + HINTS ${CLAMDBLAS_ROOT_DIR} + PATH_SUFFIXES ${CLAMD_POSSIBLE_LIB_SUFFIXES} + DOC "clAmdBlas library") + + if(CLAMDBLAS_LIBRARY AND CLAMDBLAS_INCLUDE_DIR) + set(HAVE_CLAMDBLAS 1) + list(APPEND OPENCL_INCLUDE_DIRS "${CLAMDBLAS_INCLUDE_DIR}") + list(APPEND OPENCL_LIBRARIES "${CLAMDBLAS_LIBRARY}") endif() - else() - set(HAVE_OPENCL 1) endif() endif() diff --git a/modules/ocl/CMakeLists.txt b/modules/ocl/CMakeLists.txt index a9ec2f4a0a..7e621f42ba 100644 --- a/modules/ocl/CMakeLists.txt +++ b/modules/ocl/CMakeLists.txt @@ -1,12 +1,10 @@ -# Will be modified later if(NOT HAVE_OPENCL) ocv_module_disable(ocl) endif() set(the_description "OpenCL-accelerated Computer Vision") ocv_add_module(ocl opencv_core opencv_imgproc opencv_features2d opencv_objdetect opencv_video opencv_nonfree) - -ocv_module_include_directories() +ocv_module_include_directories(${OPENCL_INCLUDE_DIRS}) file(GLOB CL_FILES "${CMAKE_CURRENT_SOURCE_DIR}/src/kernels/*.cl") set(kernels_cpp "${CMAKE_CURRENT_BINARY_DIR}/kernels.cpp") @@ -24,30 +22,10 @@ file(GLOB lib_int_hdrs "src/*.h*") source_group("Include" FILES ${lib_hdrs}) source_group("Src\\Host" FILES ${lib_srcs} ${lib_int_hdrs} ${kernels_cpp}) -if (HAVE_OPENCL) - set(ocl_link_libs ${OPENCL_LIBRARIES}) - if(OPENCL_INCLUDE_DIR) - ocv_include_directories(${OPENCL_INCLUDE_DIR}) - endif() - if (HAVE_CLAMDFFT) - set(ocl_link_libs ${ocl_link_libs} ${CLAMDFFT_LIBRARIES}) - ocv_include_directories(${CLAMDFFT_INCLUDE_DIR}) - endif() - if (HAVE_CLAMDBLAS) - set(ocl_link_libs ${ocl_link_libs} ${CLAMDBLAS_LIBRARIES}) - ocv_include_directories(${CLAMDBLAS_INCLUDE_DIR}) - endif() -endif() - ocv_warnings_disable(CMAKE_CXX_FLAGS -Wshadow) ocv_set_module_sources(HEADERS ${lib_hdrs} SOURCES ${lib_int_hdrs} ${lib_srcs} ${kernels_cpp}) -ocv_create_module(${ocl_link_libs}) - -install(FILES ${lib_hdrs} - DESTINATION include/opencv2/${name} - COMPONENT main) - +ocv_create_module(${OPENCL_LIBRARIES}) ocv_add_precompiled_headers(${the_module}) ################################################################################################################