Steamworks Documentation
Custom Engines
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 Lepton

Once connected:
  1. adb install YourPackage.apk
  2. Click on your application in the Android interface displayed in headset.

Notes

  • Multiple adb versions - If you get the error message:
    Unable to reconnect device. error: protocol fault (couldn't read status length): connection reset
    That probably means you have something else trying to use adb. Make sure things like Android Studio are closed.