-
Notifications
You must be signed in to change notification settings - Fork 1.1k
Expand file tree
/
Copy pathvulkan_utils.sh
More file actions
184 lines (153 loc) · 7.3 KB
/
Copy pathvulkan_utils.sh
File metadata and controls
184 lines (153 loc) · 7.3 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
#!/usr/bin/env bash
# Copyright 2025-2026 Arm Limited and/or its affiliates.
#
# This source code is licensed under the BSD-style license found in the
# LICENSE file in the root directory of this source tree.
# Important to check for unset variables since this script is always sourced from setup.sh
set -u
# Check if the script is being sourced
(return 0 2>/dev/null)
if [[ $? -ne 0 ]]; then
echo "Error: This script must be sourced."
exit 1
fi
script_dir=$(cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd)
source "${script_dir}/utils.sh"
vulkan_sdk_version=""
vulkan_sdk_base_dir="vulkan_sdk"
os_name="${OS:-$(uname -s)}"
vulkan_sdk_arch="${ARCH}"
# macOS and Linux x86_64 use the official LunarG SDK tarballs. Linux ARM64
# uses a separately repackaged mirror of the same SDK version.
if [[ "${os_name}" == "Darwin" ]]; then
vulkan_sdk_version="1.4.341.1"
vulkan_sdk_arch="macOS"
vulkan_sdk_url="https://sdk.lunarg.com/sdk/download/${vulkan_sdk_version}/mac/vulkansdk-macos-${vulkan_sdk_version}.zip"
vulkan_sdk_sha256="632cbe96c8ed6ed00c6ce25e3a7738c466134f76586e1c51f1419410d7f9042e"
elif [[ "${os_name}" == "Linux" ]] && [[ "${ARCH}" == "x86_64" ]]; then
vulkan_sdk_version="1.4.341.1"
vulkan_sdk_url="https://sdk.lunarg.com/sdk/download/${vulkan_sdk_version}/linux/vulkansdk-linux-x86_64-${vulkan_sdk_version}.tar.xz"
vulkan_sdk_sha256="3bf0f762afb6c79bc6a9d9fb5998745ccff928800a29619b501ed9de7fd9789b"
elif [[ "${os_name}" == "Linux" ]] && ([[ "${ARCH}" == "aarch64" ]] || [[ "${ARCH}" == "arm64" ]]); then
vulkan_sdk_version="1.4.341.1"
if [[ "${vulkan_sdk_arch}" == "arm64" ]]; then
vulkan_sdk_arch="aarch64"
fi
vulkan_sdk_url="https://github.com/jakoch/vulkan-sdk-arm/releases/download/${vulkan_sdk_version}/vulkansdk-ubuntu-22.04-arm-${vulkan_sdk_version}.tar.xz"
vulkan_sdk_sha256="345312aee2c835e128b30653278593f899a659a7ba287c571cafb22acb708b8f"
else
log_step "vulkan" "Error: only macOS and Linux are supported (detected ${os_name}); architecture must be x86-64 or aarch64/arm64"
exit 1
fi
vulkan_sdk_bin_dir="${vulkan_sdk_base_dir}/${vulkan_sdk_version}/${vulkan_sdk_arch}/bin"
function download_and_extract_vulkan_sdk_linux() {
local vulkan_sdk_tar_file="${vulkan_sdk_url##*/}"
if [[ ! -e "${vulkan_sdk_tar_file}" ]]; then
log_step "vulkan" "Downloading Vulkan SDK (${vulkan_sdk_version})"
curl -L --output "${vulkan_sdk_tar_file}" "${vulkan_sdk_url}"
echo "${vulkan_sdk_sha256} ${vulkan_sdk_tar_file}" | sha256sum -c - || exit 1
rm -fr ${vulkan_sdk_base_dir}
fi
mkdir -p ${vulkan_sdk_base_dir}
tar -C ${vulkan_sdk_base_dir} -xJf "${vulkan_sdk_tar_file}"
}
function install_vulkan_sdk_macos() {
local vulkan_sdk_zip_file="${vulkan_sdk_url##*/}"
if [[ ! -e "${vulkan_sdk_zip_file}" ]]; then
log_step "vulkan" "Downloading Vulkan SDK (${vulkan_sdk_version}) for macOS"
curl -L --output "${vulkan_sdk_zip_file}" "${vulkan_sdk_url}"
echo "${vulkan_sdk_sha256} ${vulkan_sdk_zip_file}" | shasum -a 256 -c - || exit 1
rm -fr ${vulkan_sdk_base_dir}
fi
log_step "vulkan" "Extracting Vulkan SDK installer"
rm -rf \
"vulkansdk-macOS-${vulkan_sdk_version}.app" \
"vulkansdk-macos-${vulkan_sdk_version}.app"
unzip -q -o "${vulkan_sdk_zip_file}"
local vulkan_sdk_app_path=""
vulkan_sdk_app_path="$(find . -maxdepth 3 -type d -name "vulkansdk-macOS-${vulkan_sdk_version}.app" -print -quit)"
if [[ -z "${vulkan_sdk_app_path}" ]]; then
vulkan_sdk_app_path="$(find . -maxdepth 3 -type d -name "vulkansdk-macos-${vulkan_sdk_version}.app" -print -quit)"
fi
if [[ -z "${vulkan_sdk_app_path}" ]]; then
log_step "vulkan" "Error: Vulkan SDK installer app not found after extracting ${vulkan_sdk_zip_file}"
exit 1
fi
local vulkan_sdk_installer="${vulkan_sdk_app_path}/Contents/MacOS/$(basename "${vulkan_sdk_app_path}" .app)"
if [[ ! -x "${vulkan_sdk_installer}" ]]; then
log_step "vulkan" "Error: Vulkan SDK installer binary not found at ${vulkan_sdk_installer}"
exit 1
fi
local install_root="$(cd "${root_dir}" && pwd)/${vulkan_sdk_base_dir}/${vulkan_sdk_version}"
mkdir -p "${install_root}"
log_step "vulkan" "Installing Vulkan SDK (${vulkan_sdk_version}) to ${install_root}"
"${vulkan_sdk_installer}" --root "${install_root}" --accept-licenses --default-answer --confirm-command install
}
function validate_vulkan_sdk_installation() {
if [[ ! -d "${root_dir}/${vulkan_sdk_bin_dir}" ]]; then
return 1
fi
vulkan_sdk_bin_path="$(cd "${root_dir}/${vulkan_sdk_bin_dir}" && pwd)"
if [[ ! -x "${vulkan_sdk_bin_path}/glslc" ]]; then
return 1
fi
"${vulkan_sdk_bin_path}/glslc" --version > /dev/null 2>&1
}
function setup_vulkan_sdk() {
cd "${root_dir}"
if validate_vulkan_sdk_installation; then
log_step "vulkan" "Reusing Vulkan SDK at ${root_dir}/${vulkan_sdk_base_dir}/${vulkan_sdk_version}"
log_step "vulkan" "Vulkan SDK validation (glslc) succeeded"
return
fi
if [[ "${os_name}" == "Darwin" ]]; then
install_vulkan_sdk_macos
else
download_and_extract_vulkan_sdk_linux
fi
if [[ ! -d "${root_dir}/${vulkan_sdk_bin_dir}" ]]; then
log_step "vulkan" "Error: Vulkan SDK bin directory not found at ${root_dir}/${vulkan_sdk_bin_dir}"
exit 1
fi
vulkan_sdk_bin_path="$(cd "${root_dir}/${vulkan_sdk_bin_dir}" && pwd)"
if [[ ! -x "${vulkan_sdk_bin_path}/glslc" ]]; then
log_step "vulkan" "Error: glslc not found at ${vulkan_sdk_bin_path}/glslc"
exit 1
fi
if "${vulkan_sdk_bin_path}/glslc" --version > /dev/null 2>&1; then
log_step "vulkan" "Vulkan SDK validation (glslc) succeeded"
else
log_step "vulkan" "Error: Vulkan SDK validation failed"
"${vulkan_sdk_bin_path}/glslc" --version
exit 1
fi
}
function setup_path_vulkan() {
cd "${root_dir}"
if [[ ! -d "${root_dir}/${vulkan_sdk_bin_dir}" ]]; then
log_step "vulkan" "Vulkan SDK not found; skipping PATH update"
return
fi
local vulkan_sdk_arch_root="${vulkan_sdk_base_dir}/${vulkan_sdk_version}/${vulkan_sdk_arch}"
if [[ ! -d "${vulkan_sdk_arch_root}" ]]; then
log_step "vulkan" "Vulkan SDK arch path not found; skipping PATH update"
return
fi
vulkan_sdk_arch_root="$(cd "${vulkan_sdk_arch_root}" && pwd)"
vulkan_sdk_bin_path="$(cd "${vulkan_sdk_bin_dir}" && pwd)"
# Prefer the SDK-provided compiler over any host-installed glslc.
prepend_env_in_setup_path PATH "${vulkan_sdk_bin_path}"
if [[ "${OS:-}" == "Darwin" ]]; then
prepend_env_in_setup_path DYLD_LIBRARY_PATH "${vulkan_sdk_arch_root}/lib"
local moltenvk_icd_path="${vulkan_sdk_arch_root}/share/vulkan/icd.d/MoltenVK_icd.json"
if [[ -f "${moltenvk_icd_path}" ]]; then
prepend_env_in_setup_path VK_DRIVER_FILES "${moltenvk_icd_path}"
log_step "vulkan" "Configured VK_DRIVER_FILES to include ${moltenvk_icd_path}"
else
log_step "vulkan" "MoltenVK ICD manifest not found at ${moltenvk_icd_path}; skipping VK_DRIVER_FILES update"
fi
else
prepend_env_in_setup_path LD_LIBRARY_PATH "${vulkan_sdk_arch_root}/lib"
fi
prepend_env_in_setup_path VULKAN_SDK "${vulkan_sdk_arch_root}"
}