You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
OpenXR support is still early in development and it is early for talking about optimizations but I want to mention a few things to keep in mind while defining the pipelined rendering architecture.
Late latching is a technique for reducing the jitter of head and controllers by polling their poses as late as possible.
OpenXR expects very strict coupling between update and rendering logic. A naive single threaded OpenXR application loop looks like this:
Logic/physics updates are executed. Head and controller poses are polled here.
Rendering happens respecting head and controller poses.
Frames are presented.
xrWaitFrame() is called, which throttles the application to sync up with the XR runtime. The runtime dynamically adjusts the blocking duration of this call to minimize updates latency.
This is what I'm targeting while developing the OpenXR support.
A multithreaded application with update + rendering threads that implements late latching should look like this:
Update loop thread:
Get copy of head and controller poses polled from the render thread.
Do update logic.
sleep() for throttling.
Render loop thread:
Record command encoders (this can happen also in another thread).
Poll head and controllers poses (keep a copy for the update thread).
Submit command buffers with updated poses.
Present frames.
xrWaitFrame()
Late latching cannot be implemented without deep integration. In the current architecture, resources are polled in the RenderStage::Extract stage, but head and controller poses should be polled just before the Render stage or even inside it. I think the best way to achieve late latching is to add a flag to GlobalTransform with the type of pose source (or none). The engine should keep track of this flag for the entire rendering process and the render graph is shaped so that the pose data can be polled and submitted as late as possible (for example as push constants).
reacted with thumbs up emoji reacted with thumbs down emoji reacted with laugh emoji reacted with hooray emoji reacted with confused emoji reacted with heart emoji reacted with rocket emoji reacted with eyes emoji
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
-
OpenXR support is still early in development and it is early for talking about optimizations but I want to mention a few things to keep in mind while defining the pipelined rendering architecture.
Late latching is a technique for reducing the jitter of head and controllers by polling their poses as late as possible.
OpenXR expects very strict coupling between update and rendering logic. A naive single threaded OpenXR application loop looks like this:
xrWaitFrame()
is called, which throttles the application to sync up with the XR runtime. The runtime dynamically adjusts the blocking duration of this call to minimize updates latency.This is what I'm targeting while developing the OpenXR support.
A multithreaded application with update + rendering threads that implements late latching should look like this:
Update loop thread:
Render loop thread:
xrWaitFrame()
Late latching cannot be implemented without deep integration. In the current architecture, resources are polled in the
RenderStage::Extract
stage, but head and controller poses should be polled just before theRender
stage or even inside it. I think the best way to achieve late latching is to add a flag toGlobalTransform
with the type of pose source (or none). The engine should keep track of this flag for the entire rendering process and the render graph is shaped so that the pose data can be polled and submitted as late as possible (for example as push constants).Beta Was this translation helpful? Give feedback.
All reactions