Skip to content

Commit 62660a4

Browse files
committed
[update] diagnostic message when gpu adapter instantiation fails & update how mesa is installed and configured in our pipelines
1 parent de01074 commit 62660a4

4 files changed

Lines changed: 64 additions & 15 deletions

File tree

.github/workflows/compile_lambda_rs.yml

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -72,8 +72,22 @@ jobs:
7272
if: ${{ matrix.os == 'ubuntu-latest' }}
7373
run: |
7474
echo "WGPU_BACKEND=vulkan" >> "$GITHUB_ENV"
75-
# Prefer Mesa's software Vulkan (lavapipe) to ensure headless availability
76-
echo "VK_ICD_FILENAMES=/usr/share/vulkan/icd.d/lvp_icd.x86_64.json" >> "$GITHUB_ENV"
75+
# Prefer Mesa's software Vulkan (lavapipe) to ensure headless availability.
76+
# The exact ICD filename can differ across Ubuntu images, so discover it.
77+
LVP_ICD="$(
78+
if [[ -d /usr/share/vulkan/icd.d ]]; then
79+
find /usr/share/vulkan/icd.d -maxdepth 1 -type f \
80+
\( -name '*lvp_icd*.json' -o -name '*lavapipe*.json' \) \
81+
-print 2>/dev/null | head -n1
82+
fi
83+
)"
84+
if [[ -z "$LVP_ICD" ]]; then
85+
echo "lavapipe Vulkan ICD not found under /usr/share/vulkan/icd.d" >&2
86+
ls -la /usr/share/vulkan/icd.d || true
87+
else
88+
echo "Using lavapipe ICD: $LVP_ICD"
89+
echo "VK_ICD_FILENAMES=$LVP_ICD" >> "$GITHUB_ENV"
90+
fi
7791
echo "LAMBDA_REQUIRE_GPU_ADAPTER=1" >> "$GITHUB_ENV"
7892
vulkaninfo --summary || true
7993

.github/workflows/coverage.yml

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -62,8 +62,22 @@ jobs:
6262
- name: Configure Vulkan (Ubuntu)
6363
run: |
6464
echo "WGPU_BACKEND=vulkan" >> "$GITHUB_ENV"
65-
# Prefer Mesa's software Vulkan (lavapipe) for headless availability
66-
echo "VK_ICD_FILENAMES=/usr/share/vulkan/icd.d/lvp_icd.x86_64.json" >> "$GITHUB_ENV"
65+
# Prefer Mesa's software Vulkan (lavapipe) for headless availability.
66+
# The exact ICD filename can differ across Ubuntu images, so discover it.
67+
LVP_ICD="$(
68+
if [[ -d /usr/share/vulkan/icd.d ]]; then
69+
find /usr/share/vulkan/icd.d -maxdepth 1 -type f \
70+
\( -name '*lvp_icd*.json' -o -name '*lavapipe*.json' \) \
71+
-print 2>/dev/null | head -n1
72+
fi
73+
)"
74+
if [[ -z "$LVP_ICD" ]]; then
75+
echo "lavapipe Vulkan ICD not found under /usr/share/vulkan/icd.d" >&2
76+
ls -la /usr/share/vulkan/icd.d || true
77+
else
78+
echo "Using lavapipe ICD: $LVP_ICD"
79+
echo "VK_ICD_FILENAMES=$LVP_ICD" >> "$GITHUB_ENV"
80+
fi
6781
vulkaninfo --summary || true
6882
6983
- name: Generate full coverage JSON

.github/workflows/release.yml

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,22 @@ jobs:
5353
- name: Configure Vulkan for headless CI
5454
run: |
5555
echo "WGPU_BACKEND=vulkan" >> "$GITHUB_ENV"
56-
echo "VK_ICD_FILENAMES=/usr/share/vulkan/icd.d/lvp_icd.x86_64.json" >> "$GITHUB_ENV"
56+
# Prefer Mesa's software Vulkan (lavapipe) for headless availability.
57+
# The exact ICD filename can differ across Ubuntu images, so discover it.
58+
LVP_ICD="$(
59+
if [[ -d /usr/share/vulkan/icd.d ]]; then
60+
find /usr/share/vulkan/icd.d -maxdepth 1 -type f \
61+
\( -name '*lvp_icd*.json' -o -name '*lavapipe*.json' \) \
62+
-print 2>/dev/null | head -n1
63+
fi
64+
)"
65+
if [[ -z "$LVP_ICD" ]]; then
66+
echo "lavapipe Vulkan ICD not found under /usr/share/vulkan/icd.d" >&2
67+
ls -la /usr/share/vulkan/icd.d || true
68+
else
69+
echo "Using lavapipe ICD: $LVP_ICD"
70+
echo "VK_ICD_FILENAMES=$LVP_ICD" >> "$GITHUB_ENV"
71+
fi
5772
echo "LAMBDA_REQUIRE_GPU_ADAPTER=1" >> "$GITHUB_ENV"
5873
vulkaninfo --summary || true
5974

crates/lambda-rs/src/render/gpu.rs

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -275,27 +275,33 @@ pub(crate) fn create_test_gpu_with_instance(
275275
instance: &Instance,
276276
label_base: &str,
277277
) -> Option<Gpu> {
278-
let built = GpuBuilder::new()
278+
let primary_err = match GpuBuilder::new()
279279
.with_label(&format!("{}-gpu", label_base))
280280
.build(instance, None)
281-
.ok();
282-
if built.is_some() {
283-
return built;
284-
}
281+
{
282+
Ok(gpu) => return Some(gpu),
283+
Err(err) => err,
284+
};
285285

286-
let fallback = GpuBuilder::new()
286+
let fallback_err = match GpuBuilder::new()
287287
.with_label(&format!("{}-gpu-fallback", label_base))
288288
.force_fallback(true)
289289
.build(instance, None)
290-
.ok();
290+
{
291+
Ok(gpu) => return Some(gpu),
292+
Err(err) => err,
293+
};
291294

292-
if fallback.is_none() && require_gpu_adapter_for_tests() {
295+
if require_gpu_adapter_for_tests() {
293296
panic!(
294-
"No GPU adapter available for tests (set LAMBDA_REQUIRE_GPU_ADAPTER=0 to allow skipping)"
297+
"No GPU adapter available for tests (label_base={}).\nPrimary adapter attempt: {}\nFallback adapter attempt: {}\n(Set LAMBDA_REQUIRE_GPU_ADAPTER=0 to allow skipping)",
298+
label_base,
299+
primary_err,
300+
fallback_err,
295301
);
296302
}
297303

298-
return fallback;
304+
return None;
299305
}
300306

301307
// ---------------------------------------------------------------------------

0 commit comments

Comments
 (0)