diff --git a/CMakeLists.txt b/CMakeLists.txt index fde0209e..3e2e1e5c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -37,6 +37,8 @@ option(SHERPA_ONNX_ENABLE_C_API "Whether to build C API" ON) option(SHERPA_ONNX_ENABLE_WEBSOCKET "Whether to build webscoket server/client" ON) option(SHERPA_ONNX_ENABLE_GPU "Enable ONNX Runtime GPU support" OFF) option(SHERPA_ONNX_ENABLE_DIRECTML "Enable ONNX Runtime DirectML support" OFF) +option(SHERPA_ONNX_LINK_D3D "Whether static ONNX runtime lib with DML" OFF) + option(SHERPA_ONNX_ENABLE_WASM "Whether to enable WASM" OFF) option(SHERPA_ONNX_ENABLE_WASM_SPEAKER_DIARIZATION "Whether to enable WASM for speaker diarization" OFF) option(SHERPA_ONNX_ENABLE_WASM_TTS "Whether to enable WASM for TTS" OFF) @@ -165,6 +167,7 @@ message(STATUS "SHERPA_ONNX_USE_PRE_INSTALLED_ONNXRUNTIME_IF_AVAILABLE ${SHERPA_ message(STATUS "SHERPA_ONNX_ENABLE_SANITIZER: ${SHERPA_ONNX_ENABLE_SANITIZER}") message(STATUS "SHERPA_ONNX_BUILD_C_API_EXAMPLES: ${SHERPA_ONNX_BUILD_C_API_EXAMPLES}") message(STATUS "SHERPA_ONNX_ENABLE_RKNN: ${SHERPA_ONNX_ENABLE_RKNN}") +message(STATUS "SHERPA_ONNX_LINK_D3D: ${SHERPA_ONNX_LINK_D3D}") if(BUILD_SHARED_LIBS OR SHERPA_ONNX_ENABLE_JNI) set(CMAKE_CXX_VISIBILITY_PRESET hidden) @@ -311,6 +314,7 @@ if(WIN32) add_definitions(-DNOMINMAX) # Otherwise, std::max() and std::min() won't work endif() + if(WIN32 AND MSVC) # disable various warnings for MSVC # 4244: 'return': conversion from 'unsigned __int64' to 'int', possible loss of data diff --git a/cmake/onnxruntime-win-x64-directml.cmake b/cmake/onnxruntime-win-x64-directml.cmake index a171a69a..8fa4c42e 100644 --- a/cmake/onnxruntime-win-x64-directml.cmake +++ b/cmake/onnxruntime-win-x64-directml.cmake @@ -19,80 +19,86 @@ if(NOT SHERPA_ONNX_ENABLE_DIRECTML) message(FATAL_ERROR "This file is for DirectML. Given SHERPA_ONNX_ENABLE_DIRECTML: ${SHERPA_ONNX_ENABLE_DIRECTML}") endif() -set(onnxruntime_URL "https://globalcdn.nuget.org/packages/microsoft.ml.onnxruntime.directml.1.14.1.nupkg") -set(onnxruntime_URL2 "https://hf-mirror.com/csukuangfj/sherpa-onnx-cmake-deps/resolve/main/microsoft.ml.onnxruntime.directml.1.14.1.nupkg") -set(onnxruntime_HASH "SHA256=c8ae7623385b19cd5de968d0df5383e13b97d1b3a6771c9177eac15b56013a5a") - -# If you don't have access to the Internet, -# please download onnxruntime to one of the following locations. -# You can add more if you want. -set(possible_file_locations - $ENV{HOME}/Downloads/microsoft.ml.onnxruntime.directml.1.14.1.nupkg - ${PROJECT_SOURCE_DIR}/microsoft.ml.onnxruntime.directml.1.14.1.nupkg - ${PROJECT_BINARY_DIR}/microsoft.ml.onnxruntime.directml.1.14.1.nupkg - /tmp/microsoft.ml.onnxruntime.directml.1.14.1.nupkg -) - -foreach(f IN LISTS possible_file_locations) - if(EXISTS ${f}) - set(onnxruntime_URL "${f}") - file(TO_CMAKE_PATH "${onnxruntime_URL}" onnxruntime_URL) - message(STATUS "Found local downloaded onnxruntime: ${onnxruntime_URL}") - set(onnxruntime_URL2) - break() - endif() -endforeach() - -FetchContent_Declare(onnxruntime - URL - ${onnxruntime_URL} - ${onnxruntime_URL2} - URL_HASH ${onnxruntime_HASH} -) - -FetchContent_GetProperties(onnxruntime) -if(NOT onnxruntime_POPULATED) - message(STATUS "Downloading onnxruntime from ${onnxruntime_URL}") - FetchContent_Populate(onnxruntime) -endif() -message(STATUS "onnxruntime is downloaded to ${onnxruntime_SOURCE_DIR}") - -find_library(location_onnxruntime onnxruntime - PATHS - "${onnxruntime_SOURCE_DIR}/runtimes/win-x64/native" - NO_CMAKE_SYSTEM_PATH -) - -message(STATUS "location_onnxruntime: ${location_onnxruntime}") - -add_library(onnxruntime SHARED IMPORTED) - -set_target_properties(onnxruntime PROPERTIES - IMPORTED_LOCATION ${location_onnxruntime} - INTERFACE_INCLUDE_DIRECTORIES "${onnxruntime_SOURCE_DIR}/build/native/include" -) - -set_property(TARGET onnxruntime - PROPERTY - IMPORTED_IMPLIB "${onnxruntime_SOURCE_DIR}/runtimes/win-x64/native/onnxruntime.lib" -) - -file(COPY ${onnxruntime_SOURCE_DIR}/runtimes/win-x64/native/onnxruntime.dll - DESTINATION - ${CMAKE_BINARY_DIR}/bin/${CMAKE_BUILD_TYPE} -) - -file(GLOB onnxruntime_lib_files "${onnxruntime_SOURCE_DIR}/runtimes/win-x64/native/onnxruntime.*") - -message(STATUS "onnxruntime lib files: ${onnxruntime_lib_files}") - -if(SHERPA_ONNX_ENABLE_PYTHON) - install(FILES ${onnxruntime_lib_files} DESTINATION ..) +if(location_onnxruntime_header_dir AND location_onnxruntime_lib) + message("Use preinstall onnxruntime with directml: ${location_onnxruntime_lib}") else() - install(FILES ${onnxruntime_lib_files} DESTINATION lib) -endif() -install(FILES ${onnxruntime_lib_files} DESTINATION bin) + set(onnxruntime_URL "https://globalcdn.nuget.org/packages/microsoft.ml.onnxruntime.directml.1.14.1.nupkg") + set(onnxruntime_URL2 "https://hf-mirror.com/csukuangfj/sherpa-onnx-cmake-deps/resolve/main/microsoft.ml.onnxruntime.directml.1.14.1.nupkg") + set(onnxruntime_HASH "SHA256=c8ae7623385b19cd5de968d0df5383e13b97d1b3a6771c9177eac15b56013a5a") + + # If you don't have access to the Internet, + # please download onnxruntime to one of the following locations. + # You can add more if you want. + set(possible_file_locations + $ENV{HOME}/Downloads/microsoft.ml.onnxruntime.directml.1.14.1.nupkg + ${PROJECT_SOURCE_DIR}/microsoft.ml.onnxruntime.directml.1.14.1.nupkg + ${PROJECT_BINARY_DIR}/microsoft.ml.onnxruntime.directml.1.14.1.nupkg + /tmp/microsoft.ml.onnxruntime.directml.1.14.1.nupkg + ) + + foreach(f IN LISTS possible_file_locations) + if(EXISTS ${f}) + set(onnxruntime_URL "${f}") + file(TO_CMAKE_PATH "${onnxruntime_URL}" onnxruntime_URL) + message(STATUS "Found local downloaded onnxruntime: ${onnxruntime_URL}") + set(onnxruntime_URL2) + break() + endif() + endforeach() + + FetchContent_Declare(onnxruntime + URL + ${onnxruntime_URL} + ${onnxruntime_URL2} + URL_HASH ${onnxruntime_HASH} + ) + + FetchContent_GetProperties(onnxruntime) + if(NOT onnxruntime_POPULATED) + message(STATUS "Downloading onnxruntime from ${onnxruntime_URL}") + FetchContent_Populate(onnxruntime) + endif() + message(STATUS "onnxruntime is downloaded to ${onnxruntime_SOURCE_DIR}") + + find_library(location_onnxruntime onnxruntime + PATHS + "${onnxruntime_SOURCE_DIR}/runtimes/win-x64/native" + NO_CMAKE_SYSTEM_PATH + ) + + message(STATUS "location_onnxruntime: ${location_onnxruntime}") + + add_library(onnxruntime SHARED IMPORTED) + + set_target_properties(onnxruntime PROPERTIES + IMPORTED_LOCATION ${location_onnxruntime} + INTERFACE_INCLUDE_DIRECTORIES "${onnxruntime_SOURCE_DIR}/build/native/include" + ) + + set_property(TARGET onnxruntime + PROPERTY + IMPORTED_IMPLIB "${onnxruntime_SOURCE_DIR}/runtimes/win-x64/native/onnxruntime.lib" + ) + + file(COPY ${onnxruntime_SOURCE_DIR}/runtimes/win-x64/native/onnxruntime.dll + DESTINATION + ${CMAKE_BINARY_DIR}/bin/${CMAKE_BUILD_TYPE} + ) + + file(GLOB onnxruntime_lib_files "${onnxruntime_SOURCE_DIR}/runtimes/win-x64/native/onnxruntime.*") + + message(STATUS "onnxruntime lib files: ${onnxruntime_lib_files}") + + if(SHERPA_ONNX_ENABLE_PYTHON) + install(FILES ${onnxruntime_lib_files} DESTINATION ..) + else() + install(FILES ${onnxruntime_lib_files} DESTINATION lib) + endif() + + install(FILES ${onnxruntime_lib_files} DESTINATION bin) + +endif() # Setup DirectML diff --git a/cmake/onnxruntime.cmake b/cmake/onnxruntime.cmake index 6ed15c29..f96d27cb 100644 --- a/cmake/onnxruntime.cmake +++ b/cmake/onnxruntime.cmake @@ -154,6 +154,9 @@ if(SHERPA_ONNX_USE_PRE_INSTALLED_ONNXRUNTIME_IF_AVAILABLE) set(location_onnxruntime_lib $ENV{SHERPA_ONNXRUNTIME_LIB_DIR}/libonnxruntime.dylib) elseif(WIN32) set(location_onnxruntime_lib $ENV{SHERPA_ONNXRUNTIME_LIB_DIR}/onnxruntime.lib) + if(SHERPA_ONNX_ENABLE_DIRECTML) + include(onnxruntime-win-x64-directml) + endif() else() set(location_onnxruntime_lib $ENV{SHERPA_ONNXRUNTIME_LIB_DIR}/libonnxruntime.so) endif() diff --git a/sherpa-onnx/csrc/CMakeLists.txt b/sherpa-onnx/csrc/CMakeLists.txt index d09db762..073cce14 100644 --- a/sherpa-onnx/csrc/CMakeLists.txt +++ b/sherpa-onnx/csrc/CMakeLists.txt @@ -216,6 +216,16 @@ endif() # Always static build add_library(sherpa-onnx-core STATIC ${sources}) + +if(WIN32 AND SHERPA_ONNX_LINK_D3D) + target_link_libraries(sherpa-onnx-core dxguid.lib d3d12.lib dxgi.lib dxcore.lib) +endif() + + +if(TARGET directml) + target_link_libraries(sherpa-onnx-core directml) +endif() + set_target_properties( sherpa-onnx-core PROPERTIES