Forum Discussion

🚨 This forum is archived and read-only. To submit a forum post, please visit our new Developer Forum. 🚨
DrBeef's avatar
DrBeef
Honored Guest
3 years ago

OpenXR Native SDK halving Quest framerate despite ASW being disabled in a Native application

We are seeing an issue with the Team Beef ports that have been updated to use OpenXR. We don't make use of ASW, so the next member of the XrCompositionLayerProjectionView is always set to NULL:

memset(&projection_layer_elements[eye], 0, sizeof(XrCompositionLayerProjectionView));

 

However, in periods of high CPU usage that impacts the framerate briefly, we are seeing the framerate halving, so we might be maintaining 72 fps, until we hit an area where it is unable to maintain that fps, so it drops inexplicably to 36fps and then stays there. I've searched and can't find anything to explain why this might be happening.

The documentation for ASW states the following:

Developers can toggle between AppSW mode and full FPS mode on any frame by disconnecting and reconnecting XrCompositionLayerSpaceWarpInfoFB from the “next” pointer.

So our expectation is that since the next member is set to NULL for every frame, we are not using ASW and should therefore be operating at "full FPS mode".. but clearly the OpenXR runtime has other ideas and is imposing some sort of ASW frame rate halving on our applications.

Is there another OpenXR or Meta specific extension that we are unaware of that we should be setting to allow us to just keep rendering at the full fps (for better or worse)?, or do we just have to accept that Meta's OpenXR runtime will halve the framerate and hope that ATW fixes it up (spoiler: it doesn't, it looks bad).

If anyone has _any_ idea, or knows any more about this aspect, I would be incredibly grateful to hear from you!

1 Reply

  • I think the frame halving may be caused by the vsyncs (swap interval). If frame interpolation is not wanted this should be set to 1. 

    If this is the case, the question is how to set the swapinterval "debug.oculus.swapInterval 1" via OpenXR code or similar.