Showing results for 
Search instead for 
Did you mean: 

Trying to implement OpenXR on Quest

Level 4


I am currently implementing OpenXR for Quest into my custom game engine and am running into some issues:

  • An action bound to "/user/hand/left/input/menu/click" gets triggered by the "Y" button AND the "menu" button. I'd expect it to only be triggered by the "menu" button.
  • There is no "local floor" reference space in OpenXR, is the "stage" reference space supposed to be the new normal for standing experiences? Meaning no more resetting? Is it ok to still catch the reset event and move the UI in front of the player? Would be great if there was some documentation somewhere on what the expected behavior is now that the old default is apparently not a thing anymore.
  • Performance levels are different, there is power saving, low, high and boost. Setting it to power saving does seem to do nothing, while LOW corresponds to a level of 1, HIGH is 2 and BOOST is 3 (Only checked on Quest 2). But BOOST is meant to not be thermally sustainable, while level 3 usually seems to be perfectly fine and is what a lot of games run at?
  • Looks like "Phase Sync" is the new default and "Extra Latency Mode" is not a thing anymore with OpenXR?
  • Some description or diagram on how to implement fixed foveated rendering with OpenXR would be nice. To use with vulkan it requires 4 different extensions and they are not that easy to follow.
  • Is there no way to set a foveation profile when creating the swapchain?
  • I didn't find what the default foveation profile is supposed to be if none is set (Is this not defined by the spec or did I just not find it?)
  • I think the vkImage for the foveation has R8G8 as format, but besides some article on implementing foveation on Quest from some time ago I could not find any information on that. Is this somehow defined by the fragment density map extension? Is there a way to query it from the vkImage?

Level 4

Another problem I encountered is that when adding a suggested binding for the "simple controller" interaction profile, it will be used even though I am using touch controllers and have a suggested binding for them. (On Quest 2)


Edit: This actually depends on the order of the xrSuggestInteractionProfileBindings calls. If it is done for the simple controller binding first everything works as expected, if it is after the touch controller binding it breaks.


Level 4

Another problem I now encountered is that if I request the microphone permission, xrWaitSwapchainImage will always time out after the popup is closed. If the timeout is high it will just freeze until the timeout is over. After it times out everything in the game starts lagging behind (rotating my head and it feels a bit head locked for example) and it only recovers when restarting the game.

Have you tried uploading to Oculus? If so, how did you get entitlement to work with OpenXR?

With OculusVR plugin disabled I no longer seem to have the verify entitlement node.


*UPDATE, enable the Oculus Subsystem Plugin and the node is available again 😉

I have and it works just fine.

You need the Oculus Platform SDK for the entitlement check. I don't know if there is a standalone plugin for it that you can use or if you need to stock to the OculusVR plugin (but I think you can enable OpenXR with it somewhere?). I am not using Unity (nor Unreal), so I don't know the details.

Level 4

Thanks for the response Slin, I didn't see you were using a custom game engine. I'm reaching out to Unreal and Oculus support on this as well and hope they can give more detailed feedback.

Not applicable

You have to use Oculus Online Services and do it manually in C++; if you search in the old Oculus plugin you can see how they did it. If you can't figure it out let me know and I can make a video or something showing how to do it.


The relevant file is:


Hi Samalo0, yeah you're right about the Oculus Subsystem being needed for that node. It took me a while to figure that out, I continued setting up the project and then saw the node appear again and was able to deduce what I had missed 🙂 its funny / frustrating how the smallest oversights can cause so much hassle, though it won't be a mistake I make again. I should have Edited by question but I moved onto other things, thank you for making sure there's clarity for future people who come upon this, I know I appreciate it when I'm searching for answers.

Not applicable


Not to hijack the thread, but I'm having a LOT of issues with Oculus and OpenXR:

1. The Y button triggers the menu button (as you all found); I added a 2 second hold to trigger the menu so pressing Y doesn't cause it as easily. Lame work around for now.

2. The HMD events for detecting when you put it on your head/take it off/reset orientation don't fire. I can find where they are called in the Oculus plugin pre-OpenXR, but I can't find them in the OpenXR plugin. Therefore I assume there's no way to know when someone resets the view on the headset? I rotate my pawn with the stick, and I need to reset to forward when you reset orientation but now I cannot.

3. I tried going back to using the Oculus Plugin pre-open XR, and it crashes if I try Vulkan. It will run in ES3.1, but I need Vulkan for wireframes. 

4. I can't go back to Ue4.27.0 because the Epic launcher won't let you install it.


Any ideas, let me know!