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.

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.