xref: /aosp_15_r20/external/executorch/backends/vulkan/CMakeLists.txt (revision 523fa7a60841cd1ecfb9cc4201f1ca8b03ed023a)
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