Describe the Bug
When connecting a Meta Quest 2 through Steam Link VR on Linux, SteamVR begins
initializing Valve's vrlink Vulkan video encoder, then vrserver segfaults
and the headset disconnects. The desktop displays:
SteamVR Graphics Error
You may need to update your computers graphics
(405)
I traced the crash in Valve's unmodified driver_vrlink.so to an indirect call
from videovulkan::SetupEncoder() through
vkGetPhysicalDeviceVideoEncodeQualityLevelPropertiesKHR. In the failing run,
that call dispatches through a null pointer.
A one-branch diagnostic bypass of the NVIDIA quality-level query path lets the
same system initialize Steam Link VR and reach SteamVR Home, including with
10-bit video enabled.
To Reproduce
- Use Valve's unmodified SteamVR
driver_vrlink.so.
- Start SteamVR on the Linux host.
- Start Steam Link VR on the Quest 2 and connect to the host.
- Wait for headset/encoder initialization.
Expected Behavior
Steam Link VR should connect and enter SteamVR Home or another VR scene.
Actual Behavior
SteamVR displays error (405), the headset session disconnects, and vrserver
segfaults during driver_vrlink.so video encoder setup.
System Information
- Distribution: Ubuntu 22.04.5 LTS
- Kernel:
6.8.0-111-generic (#111~22.04.1-Ubuntu)
- GPU: NVIDIA GeForce RTX 3060
- NVIDIA driver:
595.71.05
- SteamVR version:
2.15.6
- SteamVR beta also tested: build shown by Steam as
23084509; same startup failure
- Steam client version: [fill in from Steam > Help > About Steam before submitting]
- Headset/client: Meta Quest 2, Steam Link VR (
qvlclient;hollywood;2.0.22.2080)
- Connection type: wireless Steam Link VR
- Vulkan encode extensions reported by
vulkaninfo:
VK_KHR_video_encode_h264
VK_KHR_video_encode_h265
VK_KHR_video_encode_intra_refresh
VK_KHR_video_encode_quantization_map
VK_KHR_video_encode_queue
Log Sequence Immediately Before the Crash
driver_vrlink.txt from the unmodified-driver run ends its encoder
initialization sequence with:
SVLRoot::SVLRoot() sReqEncMode = mid
SVLDataLink::InitCrypt() m_TransportMode = 1 // 1017
[HMDVulkan] Created VkDevice with Compute Queue Family: 2 and Video Encode Queue Family: 4.
[VideoVulkan] Init()
[VideoVulkan] Is 10 bit SUPPORTED? Yes
[VideoVulkan] Is Ultra Low Latency SUPPORTED? Yes
m_eChosenRateControlMode: 4
[VideoVulkan] Setting video capabilties: 10bit: No, ull: Yes
The resulting primary crash is:
CrashID=bp-be86bd8c-687a-4084-8043-606bd2260523
vrserver[53368]: segfault at 0 ip 0000000000000000
Exception=EXCEPTION_SIGSEGV
Module=driver_vrlink.so
Symbol=videovulkan::SetupEncoder()
Return address=driver_vrlink.so+0xba1b9
Disassembly at the Crash Site
The unmodified SteamVR 2.15.6 binary contains the following instruction
sequence at the failing call:
ba14f: lea 0xc7c6a2(%rip),%rax # d367f8 <vkGetPhysicalDeviceVideoEncodeQualityLevelPropertiesKHR>
ba1b0: mov 0x8(%rdx),%rdi
ba1b4: mov %r8,%rdx
ba1b7: call *(%rax)
ba1b9: test %eax,%eax
The crash instruction pointer is 0x0, indicating that
call *(%rax) attempted to invoke a null
vkGetPhysicalDeviceVideoEncodeQualityLevelPropertiesKHR pointer.
I also repeated the startup test with Steam's Fossilize layer disabled. It
failed at the same driver_vrlink.so+0xba1b9 return address, so Fossilize is
not the cause of this initialization failure.
Diagnostic Binary Diff
I only have the shipped binary, not VRLink source. The following one-branch
binary change was used only to test whether the quality-level path is the
blocking failure:
File offset: 0x000b9ba2
Original SHA256: 1191bb8f8f63e5572888ee0dab5f4586b6394189ce5a26ee508521fd1875ea86
-0f 84 68 05 00 00 je videovulkan::SetupEncoder()+0x670 ; enter NVIDIA quality-level query path
+90 90 90 90 90 90 nop; nop; nop; nop; nop; nop ; continue through normal video-session path
Patched SHA256: b3aaf53e91c6d6a1d2a714d72c88df61d89bd14b4f07c3c0fd4d572ea815c177
Result After the Diagnostic Bypass
With only that branch bypass applied, Steam Link VR passes its prior startup
crash and initializes successfully:
[VideoVulkan] Created vkCreateVideoSessionKHR! chosen m_MaxSVLVideoExtent: 3200x8192
[VideoVulkan] Init Success!
[HMDVulkan] Activate: Done!
I could then reach SteamVR Home on the Quest 2. With the SteamVR setting below,
10-bit initialization also succeeded:
"driver_vrlink": {
"10bit": true
}
[VideoVulkan] Is 10 bit SUPPORTED? Yes
[VideoVulkan] format: 1000156013
[VideoVulkan] Init Success!
[HMDVulkan] Activate: Done!
Suggested Code-Level Fix
driver_vrlink should verify that
vkGetPhysicalDeviceVideoEncodeQualityLevelPropertiesKHR has been loaded
before calling it. If the function is unavailable, setup appears capable of
continuing using its non-quality-level/default selection path.
Conceptually:
-result = vkGetPhysicalDeviceVideoEncodeQualityLevelPropertiesKHR(physical_device, &query, &properties);
-if (result == VK_SUCCESS) {
- apply_quality_level_properties(properties);
-}
+if (vkGetPhysicalDeviceVideoEncodeQualityLevelPropertiesKHR != nullptr) {
+ result = vkGetPhysicalDeviceVideoEncodeQualityLevelPropertiesKHR(physical_device, &query, &properties);
+ if (result == VK_SUCCESS) {
+ apply_quality_level_properties(properties);
+ }
+} else {
+ use_default_encode_configuration();
+}
The actual source structure may differ; the important observable behavior is
that the quality-level query is entered with an invalid function pointer and
skipping that query allows encoder initialization to complete.
Related Public Tracker Context
ValveSoftware/SteamVR-for-Linux#837 reported a broad Steam Link connection
crash on Quest hardware and was closed on 2026-03-27 after its original
reporter stated that it no longer reproduced. It may be related by symptom,
but it does not identify this videovulkan::SetupEncoder() call site.
- I could not find public VRLink implementation source in
ValveSoftware/SteamVR-for-Linux; the repository currently contains issue
templates and diagnostics/documentation files rather than
driver_vrlink.so source.
Attachments Available
- The unmodified-driver
vrserver minidump associated with the CrashID above
driver_vrlink.txt and vrserver.txt from the unmodified failing run
driver_vrlink.txt and vrserver.txt from the successful diagnostic-bypass run
- Steam runtime diagnostics and SteamVR system report: [generate immediately before submitting]
Separate Follow-Up Observation
After the diagnostic bypass allowed SteamVR Home to run, launching a VR
application exposed a separate crash during SteamVR Home texture teardown in
SVLHMDDriverVulkan::GetTextureSize() from the submit thread. I am not
treating that as this issue's primary bug because it was observed only after
applying the diagnostic bypass and is distinct from the reproducible
unmodified-driver startup failure described above.
Forgive me for having the AI write this bug report but I'm sure your AI can fix the code if it listens to my AI ;)
Describe the Bug
When connecting a Meta Quest 2 through Steam Link VR on Linux, SteamVR begins
initializing Valve's
vrlinkVulkan video encoder, thenvrserversegfaultsand the headset disconnects. The desktop displays:
I traced the crash in Valve's unmodified
driver_vrlink.soto an indirect callfrom
videovulkan::SetupEncoder()throughvkGetPhysicalDeviceVideoEncodeQualityLevelPropertiesKHR. In the failing run,that call dispatches through a null pointer.
A one-branch diagnostic bypass of the NVIDIA quality-level query path lets the
same system initialize Steam Link VR and reach SteamVR Home, including with
10-bit video enabled.
To Reproduce
driver_vrlink.so.Expected Behavior
Steam Link VR should connect and enter SteamVR Home or another VR scene.
Actual Behavior
SteamVR displays error
(405), the headset session disconnects, andvrserversegfaults during
driver_vrlink.sovideo encoder setup.System Information
6.8.0-111-generic(#111~22.04.1-Ubuntu)595.71.052.15.623084509; same startup failureqvlclient;hollywood;2.0.22.2080)vulkaninfo:Log Sequence Immediately Before the Crash
driver_vrlink.txtfrom the unmodified-driver run ends its encoderinitialization sequence with:
The resulting primary crash is:
Disassembly at the Crash Site
The unmodified SteamVR
2.15.6binary contains the following instructionsequence at the failing call:
The crash instruction pointer is
0x0, indicating thatcall *(%rax)attempted to invoke a nullvkGetPhysicalDeviceVideoEncodeQualityLevelPropertiesKHRpointer.I also repeated the startup test with Steam's Fossilize layer disabled. It
failed at the same
driver_vrlink.so+0xba1b9return address, so Fossilize isnot the cause of this initialization failure.
Diagnostic Binary Diff
I only have the shipped binary, not VRLink source. The following one-branch
binary change was used only to test whether the quality-level path is the
blocking failure:
Result After the Diagnostic Bypass
With only that branch bypass applied, Steam Link VR passes its prior startup
crash and initializes successfully:
I could then reach SteamVR Home on the Quest 2. With the SteamVR setting below,
10-bit initialization also succeeded:
Suggested Code-Level Fix
driver_vrlinkshould verify thatvkGetPhysicalDeviceVideoEncodeQualityLevelPropertiesKHRhas been loadedbefore calling it. If the function is unavailable, setup appears capable of
continuing using its non-quality-level/default selection path.
Conceptually:
The actual source structure may differ; the important observable behavior is
that the quality-level query is entered with an invalid function pointer and
skipping that query allows encoder initialization to complete.
Related Public Tracker Context
ValveSoftware/SteamVR-for-Linux#837reported a broad Steam Link connectioncrash on Quest hardware and was closed on 2026-03-27 after its original
reporter stated that it no longer reproduced. It may be related by symptom,
but it does not identify this
videovulkan::SetupEncoder()call site.ValveSoftware/SteamVR-for-Linux; the repository currently contains issuetemplates and diagnostics/documentation files rather than
driver_vrlink.sosource.Attachments Available
vrserverminidump associated with the CrashID abovedriver_vrlink.txtandvrserver.txtfrom the unmodified failing rundriver_vrlink.txtandvrserver.txtfrom the successful diagnostic-bypass runSeparate Follow-Up Observation
After the diagnostic bypass allowed SteamVR Home to run, launching a VR
application exposed a separate crash during SteamVR Home texture teardown in
SVLHMDDriverVulkan::GetTextureSize()from the submit thread. I am nottreating that as this issue's primary bug because it was observed only after
applying the diagnostic bypass and is distinct from the reproducible
unmodified-driver startup failure described above.
Forgive me for having the AI write this bug report but I'm sure your AI can fix the code if it listens to my AI ;)