1# Copyright (c) Meta Platforms, Inc. and affiliates. 2# All rights reserved. 3# 4# This source code is licensed under the BSD-style license found in the 5# LICENSE file in the root directory of this source tree. 6 7# ### Editing this file ### 8# 9# This file should be formatted with 10# ~~~ 11# cmake-format -i CMakeLists.txt 12# ~~~ 13# It should also be cmake-lint clean. 14# 15# The targets in this file will be built if EXECUTORCH_BUILD_VULKAN is ON 16 17cmake_minimum_required(VERSION 3.19) 18 19if(NOT EXECUTORCH_ROOT) 20 set(EXECUTORCH_ROOT ${CMAKE_CURRENT_SOURCE_DIR}/../..) 21endif() 22 23if(NOT RUNTIME_PATH) 24 set(RUNTIME_PATH ${CMAKE_CURRENT_SOURCE_DIR}/runtime) 25endif() 26 27if(NOT PYTHON_EXECUTABLE) 28 set(PYTHON_EXECUTABLE python3) 29endif() 30 31if(NOT FLATC_EXECUTABLE) 32 set(FLATC_EXECUTABLE flatc) 33endif() 34 35# Include this file to access target_link_options_shared_lib This is required to 36# provide access to target_link_options_shared_lib which allows libraries to be 37# linked with the --whole-archive flag. This is required for libraries that 38# perform dynamic registration via static initialization. 39include(${EXECUTORCH_ROOT}/build/Utils.cmake) 40 41include(cmake/ShaderLibrary.cmake) 42 43# Third party include paths 44 45set(VULKAN_THIRD_PARTY_PATH ${CMAKE_CURRENT_SOURCE_DIR}/third-party) 46 47set(VULKAN_HEADERS_PATH ${VULKAN_THIRD_PARTY_PATH}/Vulkan-Headers) 48set(VOLK_PATH ${VULKAN_THIRD_PARTY_PATH}/volk) 49set(VMA_PATH ${VULKAN_THIRD_PARTY_PATH}/VulkanMemoryAllocator) 50 51set(COMMON_INCLUDES ${EXECUTORCH_ROOT}/.. ${VULKAN_HEADERS_PATH}/include 52 ${VOLK_PATH} ${VMA_PATH} 53) 54 55# Compile settings 56 57set(VULKAN_CXX_FLAGS "-fexceptions") 58list(APPEND VULKAN_CXX_FLAGS "-DUSE_VULKAN_WRAPPER") 59list(APPEND VULKAN_CXX_FLAGS "-DUSE_VULKAN_VOLK") 60 61# vulkan API files 62 63file(GLOB_RECURSE vulkan_api_cpp ${RUNTIME_PATH}/api/*) 64file(GLOB_RECURSE vulkan_vkapi_cpp ${RUNTIME_PATH}/vk_api/*) 65list(APPEND vulkan_api_cpp ${vulkan_vkapi_cpp}) 66list(APPEND vulkan_api_cpp ${VOLK_PATH}/volk.c) 67 68# vulkan ComputeGraph files 69 70file(GLOB_RECURSE vulkan_graph_cpp ${RUNTIME_PATH}/graph/*) 71list(APPEND vulkan_graph_cpp ${vulkan_api_cpp}) 72 73# Standard GLSL shader library 74 75set(VULKAN_GRAPH_SHADERS_PATH ${RUNTIME_PATH}/graph/ops/glsl/) 76# Generates a spv.cpp file containing compiled GLSL shaders 77gen_vulkan_shader_lib_cpp(${VULKAN_GRAPH_SHADERS_PATH}) 78# Save the path of the generated cpp file 79set(vulkan_standard_shaders_cpp ${generated_spv_cpp}) 80 81# Generate Vulkan Delegate Schema Files from flatc 82 83set(SCHEMA_INCLUDE_DIR ${CMAKE_BINARY_DIR}/schema/include) 84 85set(GENERATED_HEADER 86 ${SCHEMA_INCLUDE_DIR}/executorch/backends/vulkan/serialization/schema_generated.h 87) 88 89add_custom_command( 90 OUTPUT ${GENERATED_HEADER} 91 COMMAND 92 ${FLATC_EXECUTABLE} --cpp --cpp-std c++11 --scoped-enums -o 93 "${SCHEMA_INCLUDE_DIR}/executorch/backends/vulkan/serialization/" ${_vulkan_schema__srcs} 94 WORKING_DIRECTORY ${EXECUTORCH_ROOT} 95 COMMENT "Generating vulkan_schema headers" 96 VERBATIM 97) 98 99# vulkan_schema library 100 101add_library(vulkan_schema INTERFACE ${GENERATED_HEADER}) 102set_target_properties(vulkan_schema PROPERTIES LINKER_LANGUAGE CXX) 103 104target_include_directories( 105 vulkan_schema INTERFACE ${SCHEMA_INCLUDE_DIR} 106 ${EXECUTORCH_ROOT}/third-party/flatbuffers/include 107) 108 109# vulkan_backend 110 111file(GLOB vulkan_backend_cpp ${RUNTIME_PATH}/*.cpp) 112list(APPEND vulkan_backend_cpp ${vulkan_graph_cpp}) 113list(APPEND vulkan_backend_cpp ${vulkan_standard_shaders_cpp}) 114 115add_library(vulkan_backend STATIC ${vulkan_backend_cpp}) 116target_include_directories( 117 vulkan_backend PRIVATE ${SCHEMA_INCLUDE_DIR} ${COMMON_INCLUDES} 118) 119target_link_libraries(vulkan_backend PRIVATE vulkan_schema executorch) 120target_compile_options(vulkan_backend PRIVATE ${VULKAN_CXX_FLAGS}) 121# Link this library with --whole-archive due to dynamic backend registration 122target_link_options_shared_lib(vulkan_backend) 123 124set_property(TARGET vulkan_backend PROPERTY CXX_STANDARD 17) 125 126# Executor Runner 127 128if(NOT CMAKE_TOOLCHAIN_FILE MATCHES ".*(iOS|ios\.toolchain)\.cmake$") 129 set(VULKAN_RUNNER_SRCS ${_executor_runner__srcs}) 130 list(TRANSFORM VULKAN_RUNNER_SRCS PREPEND "${EXECUTORCH_ROOT}/") 131 132 add_executable(vulkan_executor_runner ${VULKAN_RUNNER_SRCS}) 133 target_link_libraries( 134 vulkan_executor_runner ${_executor_runner_libs} vulkan_schema 135 vulkan_backend 136 ) 137 target_compile_options(vulkan_executor_runner PUBLIC ${VULKAN_CXX_FLAGS}) 138 139 add_library(vulkan_executor_runner_lib STATIC ${VULKAN_RUNNER_SRCS}) 140 target_link_libraries( 141 vulkan_executor_runner_lib ${_executor_runner_libs} vulkan_schema 142 vulkan_backend 143 ) 144 target_compile_options(vulkan_executor_runner_lib PUBLIC ${VULKAN_CXX_FLAGS}) 145endif() 146 147# Test targets 148 149install( 150 TARGETS vulkan_backend 151 DESTINATION lib 152 INCLUDES 153 DESTINATION ${COMMON_INCLUDES} 154) 155