# 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} )