- manifest.vrmanifest: binary_path_linux and binary_path_linux_arm. The Steam Frame's SteamVR reads only binary_path_linux_arm. - handleManifests(): connect as Utility app first (works without a running SteamVR, e.g. from the Windows installer); if SteamVR refuses Utility apps, as on the Steam Frame, connect as Background app. Fail right away on other errors instead of going through initializeOpenVR()'s retry loop. - main(): check --graphics-api before connecting to OpenVR, so a wrong value fails right away. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
6.2 KiB
6.2 KiB
Steam Frame port: progress
Iteration 1
Step 1: build fixes, bytecode-only QML (2026-10-07)
Changes:
CMakeLists.txt:Core5Compatremoved (unused, not on the Frame).GuiPrivaterequested explicitly. This is temporary, until step 3 replaces QRhi.QT_QMLCACHEGEN_ARGUMENTS --only-bytecode.- OpenVR library directory per architecture (
linux64/linuxarm64/win64), for linking and for the copy next to the binary. RPATH $ORIGIN.libXtstlinked.
overlaycontroller.cpp:d3d11.handcase QRhi::D3D11only under_WIN32.- Logging: 8 active easylogging
LOG(INFO)calls becameqInfo()(overlaycontroller.cpp6,ChaperoneTabController.cpp1,MoveCenterTabController.cpp1). Commented-outLOGlines are left unchanged. - Only changed lines are formatted (
git clang-format).
Results (x86_64, Arch, Qt 6.11.1, GCC):
- The build succeeds, with 1463 compiler warnings, as in
qt6. objdump -T: 7Qt_6_PRIVATE_APIsymbols, allQRhi…(step 3). TheQQmlPrivate::AOTCompiledContextsymbols are gone (bytecode-only QML).libopenvr_api.sois resolved from the binary's directory (ldd).- Not started: without a running SteamVR the start hangs in OpenVR init (expected; tested on the Frame in step 5).
Step 2: platform option, R7, tick (2026-10-07)
Changes:
- Platform option:
- CMake option
OVRAS_STEAM_FRAME(default OFF) sets the compile definitionOVRAS_STEAM_FRAME=1. - New
src/utils/platform_capabilities.hevaluates it as the only place. It holdsk_chaperoneCommitSupported,k_defaultVsyncDisabledandk_defaultCustomTickRateMs.
- CMake option
- Tick (R6):
- In "vsync disabled" mode,
m_pumpEventsTimerruns directly atcustomTickRateMs(applyTickInterval(),Qt::PreciseTimer); the 1 ms counting is gone. - Changing the setting restarts the timer.
- Setting defaults in
settings_controller.hcome from the constants: Frametrue/11 ms, otherwise unchangedfalse/20 ms.
- In "vsync disabled" mode,
- R7: with
!k_chaperoneCommitSupported:updateChaperoneResetData()andapplyChaperoneResetData()skipCommitWorkingCopy/RevertWorkingCopy. Each logs once per function.- The init autosave profile is skipped.
Results:
- Both variants (default and
-DOVRAS_STEAM_FRAME=ON) build on x86_64. The definition is only set in the Frame variant (compile_commands.json). - Not tested at runtime yet (Frame, step 5).
Notes:
- Another commit at start-up remains, but only on opt-in.
SetWidget()applies a chaperone profile and commits when "auto-apply chaperone" (autoApplyChaperoneToggle, defaultfalse) is on. That's a chaperone-profile feature, so it belongs to R5 (iteration 2). - clang-format reflows comment blocks next to new comments. Separate new comments from existing commented-out code with a blank line, otherwise the diff grows.
Step 3: rendering through public API, --graphics-api, mouse y, shutdown order (2026-10-07)
Changes:
src/render/(new):RenderBackend,OpenGLRenderBackend,VulkanRenderBackendfrom the template (4a5b090).- Changes to the template code:
VRDASH_*→OVRAS_*names, origin note in the file header, references toOverlayController. - Formatted completely in OVRAS style.
- One comment in
VulkanRenderBackend.hwas wrapped by hand, because the automatic wrapping had broken its column layout.
- Changes to the template code:
OverlayController:- QRhi block replaced by
configureWindow→renderControl.initialize→attachWindow→createRenderTarget. renderOverlay()wraps the frame inbeginFrame/finishFrame. It submitsvrTextureBounds+vrTexturewhile the context is current.SetOverlayFromQRhiTexture, the QRhi members andQVulkanInstanceare removed.- Render delay 5 → 16 ms (about 60 fps).
- QRhi block replaced by
- Shutdown:
Shutdown()runs only once. It callsVR_Shutdown(), then frees the backend's render target (releaseRenderTarget,detachWindow). - Mouse y: always flipped; the Linux un-flip and its TODO are removed.
openvr_init::renderInterop(): Vulkan extensions and HMD GPU from SteamVR.main.cpp: parses--graphics-api, thencreateRenderBackend→initialize→QQuickWindow::setGraphicsApi→OverlayController.setup.*:--graphics-api opengl|vulkan(defaultopengl). Unknown or not built in → error, exit codeGENERAL_FAILURE.- CMake:
GuiPrivateis gone.- The Vulkan backend is built when
QT_FEATURE_vulkanis set (OVRAS_HAS_VULKAN).
Results (x86_64, Qt 6.11.1):
- The build succeeds. The Vulkan backend is built in.
objdump -T: onlyQVulkanDeviceFunctions::*/QVulkanFunctions::*remain asQt_6_PRIVATE_API. Acceptance criterion R1 (symbols) is met.- Warnings 1463 → 1630. The new code itself has none; the additional ones come from
openvr.hin the three new translation units. - Not tested yet:
- running both backends, Vulkan validation, the snapshot test (step 5, with the containers)
- mouse direction (Frame)
Risk:
MyTextFieldopens the SteamVR keyboard onactiveFocus. The template had to send the offscreen window an explicitFocusIn, otherwiseactiveFocusItemstayed null. Theqt6branch doesn't send it. If text fields don't respond on the Frame, that is the cause (R4).
Step 4: manifest and installation (2026-10-07)
Changes:
manifest.vrmanifest:binary_path_linuxandbinary_path_linux_arm→AdvancedSettings_app.manifest::handleManifests:VR_Init(Utility); onVRInitError_Init_NotAvailableToUtilityApps,VR_Init(Background).- Other errors: message and exit code
OPENVR_INIT_ERROR, instead ofinitializeOpenVR's retry loop.
main.cpp:--graphics-apiis checked before connecting to OpenVR. A wrong value used to fail only afterinitializeOpenVR's retry loop.
Results (x86_64, without SteamVR):
--force-install-manifestexits right away withOPENVR_INIT_ERROR(−2).--graphics-api fooexits right away withGENERAL_FAILURE(−1).- The build tree contains the binary,
libopenvr_api.so, both manifests,default_action_manifests/andres/. - Not tested yet:
Backgroundon the Frame (step 5).