xref: /aosp_15_r20/external/executorch/backends/vulkan/cmake/ShaderLibrary.cmake (revision 523fa7a60841cd1ecfb9cc4201f1ca8b03ed023a)
1*523fa7a6SAndroid Build Coastguard Worker# Copyright (c) Meta Platforms, Inc. and affiliates.
2*523fa7a6SAndroid Build Coastguard Worker# All rights reserved.
3*523fa7a6SAndroid Build Coastguard Worker#
4*523fa7a6SAndroid Build Coastguard Worker# This source code is licensed under the BSD-style license found in the
5*523fa7a6SAndroid Build Coastguard Worker# LICENSE file in the root directory of this source tree.
6*523fa7a6SAndroid Build Coastguard Worker
7*523fa7a6SAndroid Build Coastguard Worker# ### Editing this file ###
8*523fa7a6SAndroid Build Coastguard Worker#
9*523fa7a6SAndroid Build Coastguard Worker# This file should be formatted with
10*523fa7a6SAndroid Build Coastguard Worker# ~~~
11*523fa7a6SAndroid Build Coastguard Worker# cmake-format -i ATenVulkan.cmake
12*523fa7a6SAndroid Build Coastguard Worker# ~~~
13*523fa7a6SAndroid Build Coastguard Worker# It should also be cmake-lint clean.
14*523fa7a6SAndroid Build Coastguard Worker#
15*523fa7a6SAndroid Build Coastguard Worker# The targets in this file will be built if EXECUTORCH_BUILD_VULKAN is ON
16*523fa7a6SAndroid Build Coastguard Worker
17*523fa7a6SAndroid Build Coastguard Workerif(NOT PYTHON_EXECUTABLE)
18*523fa7a6SAndroid Build Coastguard Worker  message(
19*523fa7a6SAndroid Build Coastguard Worker    "WARNING: PYTHON_EXECUTABLE is not set! A failure is likely imminent."
20*523fa7a6SAndroid Build Coastguard Worker  )
21*523fa7a6SAndroid Build Coastguard Workerendif()
22*523fa7a6SAndroid Build Coastguard Worker
23*523fa7a6SAndroid Build Coastguard Workerif(NOT EXECUTORCH_ROOT)
24*523fa7a6SAndroid Build Coastguard Worker  message("WARNING: EXECUTORCH_ROOT is not set! A failure is likely imminent.")
25*523fa7a6SAndroid Build Coastguard Workerendif()
26*523fa7a6SAndroid Build Coastguard Worker
27*523fa7a6SAndroid Build Coastguard Workerif(ANDROID)
28*523fa7a6SAndroid Build Coastguard Worker  if(NOT ANDROID_NDK)
29*523fa7a6SAndroid Build Coastguard Worker    message(FATAL_ERROR "ANDROID_NDK not set")
30*523fa7a6SAndroid Build Coastguard Worker  endif()
31*523fa7a6SAndroid Build Coastguard Worker
32*523fa7a6SAndroid Build Coastguard Worker  set(GLSLC_PATH
33*523fa7a6SAndroid Build Coastguard Worker      "${ANDROID_NDK}/shader-tools/${ANDROID_NDK_HOST_SYSTEM_NAME}/glslc"
34*523fa7a6SAndroid Build Coastguard Worker  )
35*523fa7a6SAndroid Build Coastguard Workerelse()
36*523fa7a6SAndroid Build Coastguard Worker  find_program(GLSLC_PATH glslc PATHS $ENV{PATH})
37*523fa7a6SAndroid Build Coastguard Worker
38*523fa7a6SAndroid Build Coastguard Worker  if(NOT GLSLC_PATH)
39*523fa7a6SAndroid Build Coastguard Worker    message(FATAL_ERROR "USE_VULKAN glslc not found")
40*523fa7a6SAndroid Build Coastguard Worker  endif()
41*523fa7a6SAndroid Build Coastguard Workerendif()
42*523fa7a6SAndroid Build Coastguard Worker
43*523fa7a6SAndroid Build Coastguard Worker# Required to enable linking with --whole-archive
44*523fa7a6SAndroid Build Coastguard Workerinclude(${EXECUTORCH_ROOT}/build/Utils.cmake)
45*523fa7a6SAndroid Build Coastguard Worker
46*523fa7a6SAndroid Build Coastguard Workerfunction(gen_vulkan_shader_lib_cpp shaders_path)
47*523fa7a6SAndroid Build Coastguard Worker  set(VULKAN_SHADERGEN_ENV "")
48*523fa7a6SAndroid Build Coastguard Worker  set(VULKAN_SHADERGEN_OUT_PATH ${CMAKE_BINARY_DIR}/${ARGV1})
49*523fa7a6SAndroid Build Coastguard Worker
50*523fa7a6SAndroid Build Coastguard Worker  execute_process(
51*523fa7a6SAndroid Build Coastguard Worker    COMMAND
52*523fa7a6SAndroid Build Coastguard Worker      "${PYTHON_EXECUTABLE}"
53*523fa7a6SAndroid Build Coastguard Worker      ${EXECUTORCH_ROOT}/backends/vulkan/runtime/gen_vulkan_spv.py --glsl-path
54*523fa7a6SAndroid Build Coastguard Worker      ${shaders_path} --output-path ${VULKAN_SHADERGEN_OUT_PATH}
55*523fa7a6SAndroid Build Coastguard Worker      --glslc-path=${GLSLC_PATH} --tmp-dir-path=${VULKAN_SHADERGEN_OUT_PATH}
56*523fa7a6SAndroid Build Coastguard Worker      --env ${VULKAN_GEN_ARG_ENV}
57*523fa7a6SAndroid Build Coastguard Worker    RESULT_VARIABLE error_code
58*523fa7a6SAndroid Build Coastguard Worker  )
59*523fa7a6SAndroid Build Coastguard Worker
60*523fa7a6SAndroid Build Coastguard Worker  set(generated_spv_cpp
61*523fa7a6SAndroid Build Coastguard Worker      ${VULKAN_SHADERGEN_OUT_PATH}/spv.cpp
62*523fa7a6SAndroid Build Coastguard Worker      PARENT_SCOPE
63*523fa7a6SAndroid Build Coastguard Worker  )
64*523fa7a6SAndroid Build Coastguard Workerendfunction()
65*523fa7a6SAndroid Build Coastguard Worker
66*523fa7a6SAndroid Build Coastguard Workerfunction(vulkan_shader_lib library_name generated_spv_cpp)
67*523fa7a6SAndroid Build Coastguard Worker  add_library(${library_name} STATIC ${generated_spv_cpp})
68*523fa7a6SAndroid Build Coastguard Worker  target_include_directories(
69*523fa7a6SAndroid Build Coastguard Worker    ${library_name}
70*523fa7a6SAndroid Build Coastguard Worker    PRIVATE
71*523fa7a6SAndroid Build Coastguard Worker      ${EXECUTORCH_ROOT}/..
72*523fa7a6SAndroid Build Coastguard Worker      ${EXECUTORCH_ROOT}/backends/vulkan/third-party/Vulkan-Headers/include
73*523fa7a6SAndroid Build Coastguard Worker      ${EXECUTORCH_ROOT}/backends/vulkan/third-party/volk
74*523fa7a6SAndroid Build Coastguard Worker  )
75*523fa7a6SAndroid Build Coastguard Worker  target_link_libraries(${library_name} vulkan_backend)
76*523fa7a6SAndroid Build Coastguard Worker  target_compile_options(${library_name} PRIVATE ${VULKAN_CXX_FLAGS})
77*523fa7a6SAndroid Build Coastguard Worker  # Link this library with --whole-archive due to dynamic shader registrations
78*523fa7a6SAndroid Build Coastguard Worker  target_link_options_shared_lib(${library_name})
79*523fa7a6SAndroid Build Coastguard Workerendfunction()
80*523fa7a6SAndroid Build Coastguard Worker
81*523fa7a6SAndroid Build Coastguard Worker# Convenience macro to generate a SPIR-V shader library target. Given the path
82*523fa7a6SAndroid Build Coastguard Worker# to the shaders to compile and the name of the library, it will create a static
83*523fa7a6SAndroid Build Coastguard Worker# library containing the generated SPIR-V shaders. The generated_spv_cpp
84*523fa7a6SAndroid Build Coastguard Worker# variable can be used to reference the generated CPP file outside the macro.
85*523fa7a6SAndroid Build Coastguard Workermacro(vulkan_shader_library shaders_path library_name)
86*523fa7a6SAndroid Build Coastguard Worker  set(VULKAN_SHADERGEN_ENV "")
87*523fa7a6SAndroid Build Coastguard Worker  set(VULKAN_SHADERGEN_OUT_PATH ${CMAKE_BINARY_DIR}/${library_name})
88*523fa7a6SAndroid Build Coastguard Worker
89*523fa7a6SAndroid Build Coastguard Worker  # execute_process( COMMAND "${PYTHON_EXECUTABLE}"
90*523fa7a6SAndroid Build Coastguard Worker  # ${EXECUTORCH_ROOT}/backends/vulkan/runtime/gen_vulkan_spv.py --glsl-path
91*523fa7a6SAndroid Build Coastguard Worker  # ${shaders_path} --output-path ${VULKAN_SHADERGEN_OUT_PATH}
92*523fa7a6SAndroid Build Coastguard Worker  # --glslc-path=${GLSLC_PATH} --tmp-dir-path=${VULKAN_SHADERGEN_OUT_PATH} --env
93*523fa7a6SAndroid Build Coastguard Worker  # ${VULKAN_GEN_ARG_ENV} RESULT_VARIABLE error_code ) set(ENV{PYTHONPATH}
94*523fa7a6SAndroid Build Coastguard Worker  # ${PYTHONPATH})
95*523fa7a6SAndroid Build Coastguard Worker
96*523fa7a6SAndroid Build Coastguard Worker  set(generated_spv_cpp ${VULKAN_SHADERGEN_OUT_PATH}/spv.cpp)
97*523fa7a6SAndroid Build Coastguard Worker
98*523fa7a6SAndroid Build Coastguard Worker  add_library(${library_name} STATIC ${generated_spv_cpp})
99*523fa7a6SAndroid Build Coastguard Worker  target_include_directories(
100*523fa7a6SAndroid Build Coastguard Worker    ${library_name}
101*523fa7a6SAndroid Build Coastguard Worker    PRIVATE
102*523fa7a6SAndroid Build Coastguard Worker      ${EXECUTORCH_ROOT}/..
103*523fa7a6SAndroid Build Coastguard Worker      ${EXECUTORCH_ROOT}/backends/vulkan/third-party/Vulkan-Headers/include
104*523fa7a6SAndroid Build Coastguard Worker      ${EXECUTORCH_ROOT}/backends/vulkan/third-party/volk
105*523fa7a6SAndroid Build Coastguard Worker  )
106*523fa7a6SAndroid Build Coastguard Worker  target_link_libraries(${library_name} vulkan_backend)
107*523fa7a6SAndroid Build Coastguard Worker  target_compile_options(${library_name} PRIVATE ${VULKAN_CXX_FLAGS})
108*523fa7a6SAndroid Build Coastguard Worker  # Link this library with --whole-archive due to dynamic shader registrations
109*523fa7a6SAndroid Build Coastguard Worker  target_link_options_shared_lib(${library_name})
110*523fa7a6SAndroid Build Coastguard Worker
111*523fa7a6SAndroid Build Coastguard Worker  unset(VULKAN_SHADERGEN_ENV)
112*523fa7a6SAndroid Build Coastguard Worker  unset(VULKAN_SHADERGEN_OUT_PATH)
113*523fa7a6SAndroid Build Coastguard Workerendmacro()
114