|
|
@@ -1,5 +1,20 @@
|
|
|
+cmake_minimum_required(VERSION 3.19)
|
|
|
+cmake_policy(SET CMP0114 NEW)
|
|
|
+
|
|
|
find_package(Vulkan COMPONENTS glslc REQUIRED)
|
|
|
|
|
|
+function(detect_host_compiler)
|
|
|
+ if (CMAKE_HOST_SYSTEM_NAME STREQUAL "Windows")
|
|
|
+ find_program(HOST_C_COMPILER NAMES cl gcc clang NO_CMAKE_FIND_ROOT_PATH)
|
|
|
+ find_program(HOST_CXX_COMPILER NAMES cl g++ clang++ NO_CMAKE_FIND_ROOT_PATH)
|
|
|
+ else()
|
|
|
+ find_program(HOST_C_COMPILER NAMES gcc clang NO_CMAKE_FIND_ROOT_PATH)
|
|
|
+ find_program(HOST_CXX_COMPILER NAMES g++ clang++ NO_CMAKE_FIND_ROOT_PATH)
|
|
|
+ endif()
|
|
|
+ set(HOST_C_COMPILER "${HOST_C_COMPILER}" PARENT_SCOPE)
|
|
|
+ set(HOST_CXX_COMPILER "${HOST_CXX_COMPILER}" PARENT_SCOPE)
|
|
|
+endfunction()
|
|
|
+
|
|
|
if (Vulkan_FOUND)
|
|
|
message(STATUS "Vulkan found")
|
|
|
|
|
|
@@ -73,19 +88,56 @@ if (Vulkan_FOUND)
|
|
|
add_compile_definitions(GGML_VULKAN_RUN_TESTS)
|
|
|
endif()
|
|
|
|
|
|
- add_subdirectory(vulkan-shaders)
|
|
|
-
|
|
|
- set (_ggml_vk_genshaders_cmd vulkan-shaders-gen)
|
|
|
+ if (NOT CMAKE_CROSSCOMPILING)
|
|
|
+ add_subdirectory(vulkan-shaders)
|
|
|
+ if (MSVC)
|
|
|
+ foreach(CONFIG ${CMAKE_CONFIGURATION_TYPES})
|
|
|
+ string(TOUPPER ${CONFIG} CONFIG)
|
|
|
+ set_target_properties(vulkan-shaders-gen PROPERTIES
|
|
|
+ RUNTIME_OUTPUT_DIRECTORY_${CONFIG} ${CMAKE_RUNTIME_OUTPUT_DIRECTORY})
|
|
|
+ endforeach()
|
|
|
+ endif()
|
|
|
+ else()
|
|
|
+ if (GGML_VULKAN_SHADERS_GEN_TOOLCHAIN)
|
|
|
+ set(HOST_CMAKE_TOOLCHAIN_FILE ${GGML_VULKAN_SHADERS_GEN_TOOLCHAIN})
|
|
|
+ else()
|
|
|
+ detect_host_compiler()
|
|
|
+ if (NOT HOST_C_COMPILER OR NOT HOST_CXX_COMPILER)
|
|
|
+ message(FATAL_ERROR "Host compiler not found")
|
|
|
+ else()
|
|
|
+ message(STATUS "Host compiler: ${HOST_C_COMPILER} ${HOST_CXX_COMPILER}")
|
|
|
+ endif()
|
|
|
+ configure_file(${CMAKE_CURRENT_SOURCE_DIR}/cmake/host-toolchain.cmake.in ${CMAKE_BINARY_DIR}/host-toolchain.cmake @ONLY)
|
|
|
+ set(HOST_CMAKE_TOOLCHAIN_FILE ${CMAKE_BINARY_DIR}/host-toolchain.cmake)
|
|
|
+ endif()
|
|
|
+ message(STATUS "vulkan-shaders-gen toolchain file: ${HOST_CMAKE_TOOLCHAIN_FILE}")
|
|
|
+
|
|
|
+ include(ExternalProject)
|
|
|
+ # Native build through ExternalProject_Add
|
|
|
+ ExternalProject_Add(
|
|
|
+ vulkan-shaders-gen
|
|
|
+ SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/vulkan-shaders
|
|
|
+ CMAKE_ARGS -DCMAKE_TOOLCHAIN_FILE=${HOST_CMAKE_TOOLCHAIN_FILE}
|
|
|
+ -DCMAKE_INSTALL_PREFIX=${CMAKE_BINARY_DIR}
|
|
|
+ BUILD_COMMAND ${CMAKE_COMMAND} --build .
|
|
|
+ INSTALL_COMMAND ${CMAKE_COMMAND} --install .
|
|
|
+ INSTALL_DIR ${CMAKE_BINARY_DIR}
|
|
|
+ )
|
|
|
+ ExternalProject_Add_StepTargets(vulkan-shaders-gen build install)
|
|
|
+ endif()
|
|
|
+ set (_ggml_vk_host_suffix $<IF:$<STREQUAL:${CMAKE_HOST_SYSTEM_NAME},Windows>,.exe,>)
|
|
|
+ set (_ggml_vk_genshaders_cmd ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/vulkan-shaders-gen${_ggml_vk_host_suffix})
|
|
|
set (_ggml_vk_header ${CMAKE_CURRENT_BINARY_DIR}/ggml-vulkan-shaders.hpp)
|
|
|
set (_ggml_vk_source ${CMAKE_CURRENT_BINARY_DIR}/ggml-vulkan-shaders.cpp)
|
|
|
set (_ggml_vk_input_dir ${CMAKE_CURRENT_SOURCE_DIR}/vulkan-shaders)
|
|
|
set (_ggml_vk_output_dir ${CMAKE_CURRENT_BINARY_DIR}/vulkan-shaders.spv)
|
|
|
|
|
|
file(GLOB _ggml_vk_shader_deps "${_ggml_vk_input_dir}/*.comp")
|
|
|
+ set (_ggml_vk_shader_deps ${_ggml_vk_shader_deps} vulkan-shaders-gen)
|
|
|
|
|
|
- if (NOT CMAKE_CROSSCOMPILING)
|
|
|
- set(_ggml_vk_genshaders_cmd "$<TARGET_FILE_DIR:vulkan-shaders-gen>/${_ggml_vk_genshaders_cmd}")
|
|
|
- endif ()
|
|
|
+ if (CMAKE_CROSSCOMPILING)
|
|
|
+ set(_ggml_vk_shader_deps ${_ggml_vk_shader_deps} vulkan-shaders-gen-build vulkan-shaders-gen-install)
|
|
|
+ endif()
|
|
|
|
|
|
add_custom_command(
|
|
|
OUTPUT ${_ggml_vk_header}
|
|
|
@@ -99,7 +151,7 @@ if (Vulkan_FOUND)
|
|
|
--target-cpp ${_ggml_vk_source}
|
|
|
--no-clean
|
|
|
|
|
|
- DEPENDS ${_ggml_vk_shader_deps} ${_ggml_vk_genshaders_cmd}
|
|
|
+ DEPENDS ${_ggml_vk_shader_deps}
|
|
|
COMMENT "Generate vulkan shaders"
|
|
|
)
|
|
|
|