Custom engines are welcome to build for a wide range of platforms with the large variety of compatibility tools Steam now has available but we recommend either targeting Android 10 or Linux Arm64.
First, make sure you have turned on Developer Mode as described in the
Setting up your Steam Frame for development this will let you deploy to the headset.
We recommend using OpenXR for development, but if you instead want to use OpenVR you can get the header and appropriate libopenvr_api.so from
our SDK here.
Android development is pretty straight forward with the exception of needing to launch Lepton Development and connect via adb before deploying to the headset.
For Linux ARM64 development we recommend using the SteamOS Devkit Client. You can find more information about this in the on the
How to load and run games on Steam Frame page.
Steam Frame Controllers
By default the controllers will show up to your games as emulating Oculus Touch, so you can bind to those controls and it will work. If you would like to bind to Frame Controller specific buttons or have Frame Controller specific offsets you can use the Steam Frame Controller OpenXR Interaction Profile or use the Frame Controller OpenVR Controller type:
frame_controller.
OpenXR
To enable the interaction profile you must request to use the extension:
XR_VALVE_frame_controller_interaction
Then you can suggest bindings for the interaction profile path:
/interaction_profiles/valve/frame_controller
You can use the following paths:
"/user/hand/right/input/a/touch", XR_ACTION_TYPE_BOOLEAN_INPUT
"/user/hand/right/input/a/click", XR_ACTION_TYPE_BOOLEAN_INPUT
"/user/hand/right/input/b/touch", XR_ACTION_TYPE_BOOLEAN_INPUT
"/user/hand/right/input/b/click", XR_ACTION_TYPE_BOOLEAN_INPUT
"/user/hand/right/input/x/touch", XR_ACTION_TYPE_BOOLEAN_INPUT
"/user/hand/right/input/x/click", XR_ACTION_TYPE_BOOLEAN_INPUT
"/user/hand/right/input/y/touch", XR_ACTION_TYPE_BOOLEAN_INPUT
"/user/hand/right/input/y/click", XR_ACTION_TYPE_BOOLEAN_INPUT
"/user/hand/right/input/menu/touch", XR_ACTION_TYPE_BOOLEAN_INPUT
"/user/hand/right/input/menu/click", XR_ACTION_TYPE_BOOLEAN_INPUT
"/user/hand/right/input/system/touch", XR_ACTION_TYPE_BOOLEAN_INPUT
"/user/hand/right/input/system/click", XR_ACTION_TYPE_BOOLEAN_INPUT
"/user/hand/right/input/bumper/touch", XR_ACTION_TYPE_BOOLEAN_INPUT
"/user/hand/right/input/bumper/click", XR_ACTION_TYPE_BOOLEAN_INPUT
"/user/hand/right/input/squeeze/touch", XR_ACTION_TYPE_BOOLEAN_INPUT
"/user/hand/right/input/squeeze/click", XR_ACTION_TYPE_BOOLEAN_INPUT
"/user/hand/right/input/squeeze/value", XR_ACTION_TYPE_FLOAT_INPUT
"/user/hand/right/input/trigger/touch", XR_ACTION_TYPE_BOOLEAN_INPUT
"/user/hand/right/input/trigger/click", XR_ACTION_TYPE_BOOLEAN_INPUT
"/user/hand/right/input/trigger/value", XR_ACTION_TYPE_FLOAT_INPUT
"/user/hand/right/input/thumbstick/touch", XR_ACTION_TYPE_BOOLEAN_INPUT
"/user/hand/right/input/thumbstick/click", XR_ACTION_TYPE_BOOLEAN_INPUT
"/user/hand/right/input/thumbstick/x", XR_ACTION_TYPE_FLOAT_INPUT
"/user/hand/right/input/thumbstick/y", XR_ACTION_TYPE_FLOAT_INPUT
"/user/hand/right/input/thumbstick", XR_ACTION_TYPE_VECTOR2F_INPUT
"/user/hand/right/input/grip/pose", XR_ACTION_TYPE_POSE_INPUT
"/user/hand/right/input/aim/pose", XR_ACTION_TYPE_POSE_INPUT
"/user/hand/right/output/haptic", XR_ACTION_TYPE_VIBRATION_OUTPUT
"/user/hand/left/input/dpad_up/touch", XR_ACTION_TYPE_BOOLEAN_INPUT
"/user/hand/left/input/dpad_up/click", XR_ACTION_TYPE_BOOLEAN_INPUT
"/user/hand/left/input/dpad_left/touch", XR_ACTION_TYPE_BOOLEAN_INPUT
"/user/hand/left/input/dpad_left/click", XR_ACTION_TYPE_BOOLEAN_INPUT
"/user/hand/left/input/dpad_down/touch", XR_ACTION_TYPE_BOOLEAN_INPUT
"/user/hand/left/input/dpad_down/click", XR_ACTION_TYPE_BOOLEAN_INPUT
"/user/hand/left/input/dpad_right/touch", XR_ACTION_TYPE_BOOLEAN_INPUT
"/user/hand/left/input/dpad_right/click", XR_ACTION_TYPE_BOOLEAN_INPUT
"/user/hand/left/input/view/touch", XR_ACTION_TYPE_BOOLEAN_INPUT
"/user/hand/left/input/view/click", XR_ACTION_TYPE_BOOLEAN_INPUT
"/user/hand/left/input/system/touch", XR_ACTION_TYPE_BOOLEAN_INPUT
"/user/hand/left/input/system/click", XR_ACTION_TYPE_BOOLEAN_INPUT
"/user/hand/left/input/bumper/touch", XR_ACTION_TYPE_BOOLEAN_INPUT
"/user/hand/left/input/bumper/click", XR_ACTION_TYPE_BOOLEAN_INPUT
"/user/hand/left/input/squeeze/touch", XR_ACTION_TYPE_BOOLEAN_INPUT
"/user/hand/left/input/squeeze/click", XR_ACTION_TYPE_BOOLEAN_INPUT
"/user/hand/left/input/squeeze/value", XR_ACTION_TYPE_FLOAT_INPUT
"/user/hand/left/input/trigger/touch", XR_ACTION_TYPE_BOOLEAN_INPUT
"/user/hand/left/input/trigger/click", XR_ACTION_TYPE_BOOLEAN_INPUT
"/user/hand/left/input/trigger/value", XR_ACTION_TYPE_FLOAT_INPUT
"/user/hand/left/input/thumbstick/touch", XR_ACTION_TYPE_BOOLEAN_INPUT
"/user/hand/left/input/thumbstick/click", XR_ACTION_TYPE_BOOLEAN_INPUT
"/user/hand/left/input/thumbstick/x", XR_ACTION_TYPE_FLOAT_INPUT
"/user/hand/left/input/thumbstick/y", XR_ACTION_TYPE_FLOAT_INPUT
"/user/hand/left/input/thumbstick", XR_ACTION_TYPE_VECTOR2F_INPUT
"/user/hand/left/input/grip/pose", XR_ACTION_TYPE_POSE_INPUT
"/user/hand/left/input/aim/pose", XR_ACTION_TYPE_POSE_INPUT
"/user/hand/left/output/haptic", XR_ACTION_TYPE_VIBRATION_OUTPUT
Foveated Rendering
SteamVR supports the following recommended OpenXR extensions:
Eye Tracking
Our current support for eye tracking uses the
XR_EXT_eye_gaze_interaction OpenXR extension. You can find details about that on the
OpenXR spec site here.
Steamworks SDK
Releases of the
Steamworks SDK starting with version 1.63 have included libraries that will let it work on Android ARM64 and Linux ARM64.
Deploying binaries
The
SteamOS Devkit Client provides an easy interface to repeatedly deploy APKs, Linux binaries, and Windows binaries.
Deploying APKs manually
Building to Steam Frame is similar to building to other standalone headsets or mobile devices using adb. Refer to this article to get started:
Connecting adb to LeptonOnce connected:
- adb install YourPackage.apk
- Click on your application in the Android interface displayed in headset.
Notes