blob: fca34fdf6a4f0965ecb2ad4033a9b3c0fc63df1d [file]
# Copyright (c) Meta Platforms, Inc. and affiliates.
# All rights reserved.
#
# This source code is licensed under the BSD-style license found in the
# LICENSE file in the root directory of this source tree.
# ### Editing this file ###
#
# This file should be formatted with
# ~~~
# cmake-format -i CMakeLists.txt
# ~~~
# It should also be cmake-lint clean.
#
# The targets in this file will be built if EXECUTORCH_BUILD_VULKAN is ON
cmake_minimum_required(VERSION 3.19)
if(NOT EXECUTORCH_ROOT)
set(EXECUTORCH_ROOT ${CMAKE_CURRENT_SOURCE_DIR}/../..)
endif()
if(NOT RUNTIME_PATH)
set(RUNTIME_PATH ${CMAKE_CURRENT_SOURCE_DIR}/runtime)
endif()
if(NOT PYTHON_EXECUTABLE)
set(PYTHON_EXECUTABLE python3)
endif()
if(NOT FLATC_EXECUTABLE)
set(FLATC_EXECUTABLE flatc)
endif()
# Include this file to access target_link_options_shared_lib This is required to
# provide access to target_link_options_shared_lib which allows libraries to be
# linked with the --whole-archive flag. This is required for libraries that
# perform dynamic registration via static initialization.
include(${EXECUTORCH_ROOT}/build/Utils.cmake)
include(cmake/ShaderLibrary.cmake)
# Third party include paths
set(VULKAN_THIRD_PARTY_PATH ${CMAKE_CURRENT_SOURCE_DIR}/third-party)
set(VULKAN_HEADERS_PATH ${VULKAN_THIRD_PARTY_PATH}/Vulkan-Headers)
set(VOLK_PATH ${VULKAN_THIRD_PARTY_PATH}/volk)
set(VMA_PATH ${VULKAN_THIRD_PARTY_PATH}/VulkanMemoryAllocator)
set(COMMON_INCLUDES ${EXECUTORCH_ROOT}/.. ${VULKAN_HEADERS_PATH}/include
${VOLK_PATH} ${VMA_PATH}
)
# Compile settings
set(VULKAN_CXX_FLAGS "-fexceptions")
list(APPEND VULKAN_CXX_FLAGS "-DUSE_VULKAN_WRAPPER")
list(APPEND VULKAN_CXX_FLAGS "-DUSE_VULKAN_VOLK")
# vulkan API files
file(GLOB_RECURSE vulkan_api_cpp ${RUNTIME_PATH}/api/*)
file(GLOB_RECURSE vulkan_vkapi_cpp ${RUNTIME_PATH}/vk_api/*)
list(APPEND vulkan_api_cpp ${vulkan_vkapi_cpp})
list(APPEND vulkan_api_cpp ${VOLK_PATH}/volk.c)
# vulkan ComputeGraph files
file(GLOB_RECURSE vulkan_graph_cpp ${RUNTIME_PATH}/graph/*)
list(APPEND vulkan_graph_cpp ${vulkan_api_cpp})
# Standard GLSL shader library
set(VULKAN_GRAPH_SHADERS_PATH ${RUNTIME_PATH}/graph/ops/glsl/)
# Generates a spv.cpp file containing compiled GLSL shaders
gen_vulkan_shader_lib_cpp(${VULKAN_GRAPH_SHADERS_PATH})
# Save the path of the generated cpp file
set(vulkan_standard_shaders_cpp ${generated_spv_cpp})
# Generate Vulkan Delegate Schema Files from flatc
set(SCHEMA_INCLUDE_DIR ${CMAKE_BINARY_DIR}/schema/include)
set(GENERATED_HEADER
${SCHEMA_INCLUDE_DIR}/executorch/backends/vulkan/serialization/schema_generated.h
)
add_custom_command(
OUTPUT ${GENERATED_HEADER}
COMMAND
${FLATC_EXECUTABLE} --cpp --cpp-std c++11 --scoped-enums -o
"${SCHEMA_INCLUDE_DIR}/executorch/backends/vulkan/serialization/" ${_vulkan_schema__srcs}
WORKING_DIRECTORY ${EXECUTORCH_ROOT}
COMMENT "Generating vulkan_schema headers"
VERBATIM
)
# vulkan_schema library
add_library(vulkan_schema INTERFACE ${GENERATED_HEADER})
set_target_properties(vulkan_schema PROPERTIES LINKER_LANGUAGE CXX)
target_include_directories(
vulkan_schema INTERFACE ${SCHEMA_INCLUDE_DIR}
${EXECUTORCH_ROOT}/third-party/flatbuffers/include
)
# vulkan_backend
file(GLOB vulkan_backend_cpp ${RUNTIME_PATH}/*.cpp)
list(APPEND vulkan_backend_cpp ${vulkan_graph_cpp})
list(APPEND vulkan_backend_cpp ${vulkan_standard_shaders_cpp})
add_library(vulkan_backend STATIC ${vulkan_backend_cpp})
target_include_directories(
vulkan_backend PRIVATE ${SCHEMA_INCLUDE_DIR} ${COMMON_INCLUDES}
)
target_link_libraries(vulkan_backend PRIVATE vulkan_schema executorch)
target_compile_options(vulkan_backend PRIVATE ${VULKAN_CXX_FLAGS})
# Link this library with --whole-archive due to dynamic backend registration
target_link_options_shared_lib(vulkan_backend)
set_property(TARGET vulkan_backend PROPERTY CXX_STANDARD 17)
# Executor Runner
if(NOT CMAKE_TOOLCHAIN_FILE MATCHES ".*(iOS|ios\.toolchain)\.cmake$")
set(VULKAN_RUNNER_SRCS ${_executor_runner__srcs})
list(TRANSFORM VULKAN_RUNNER_SRCS PREPEND "${EXECUTORCH_ROOT}/")
add_executable(vulkan_executor_runner ${VULKAN_RUNNER_SRCS})
target_link_libraries(
vulkan_executor_runner ${_executor_runner_libs} vulkan_schema
vulkan_backend
)
target_compile_options(vulkan_executor_runner PUBLIC ${VULKAN_CXX_FLAGS})
add_library(vulkan_executor_runner_lib STATIC ${VULKAN_RUNNER_SRCS})
target_link_libraries(
vulkan_executor_runner_lib ${_executor_runner_libs} vulkan_schema
vulkan_backend
)
target_compile_options(vulkan_executor_runner_lib PUBLIC ${VULKAN_CXX_FLAGS})
endif()
# Test targets
install(
TARGETS vulkan_backend
DESTINATION lib
INCLUDES
DESTINATION ${COMMON_INCLUDES}
)