SU14 and Reprojection Mode: What's really going on?

This is how displays work. They have a scheduled scan-out at regular interval programmed in the hardware, there is no way around it.

This isn’t how it works no. You can only display at 11.111, 22.222, 33.333. So your frame at 20.0 is “latched” for later display. Then at 22.222 the frame is spatially reprojected with the latest headset pose to reduce the juddering.

Yes, this is more like it. Except that the latency typically won’t accumulate as you’re saying. This is because the VR stack will possibly make you “sleep”/wait in order to reduce the latency and avoid accumulation.

Unfortunately the strategies to avoid this accumulation may be more or less well implemented,., you are on WMR so you might be familiar with the “Turbo mode” or the “Prefer framerate over latency”. What these options do is literally avoid any sleep/wait and request to pump frame as quickly as possible.

With what I told you above, you can now go and compare with/without Turbo mode. Tell me which one you prefer. Turbo on WMR has historically helped increasing framerates dramatically, sometimes 2 digits, at the cost of this added/accumulated latency. IMO it works a lot better when not worrying about that accumulation.

You got it. This is why locking at 45 FPS feels better than running at 50-55 FPS. You are making the frame pace and the amount of spatial reprojection happening consistent for every frames.

EDIT: Here is another diagram I made a while ago about spatial reprojection (LSR):

  • The application is not able to keep up with the headset’s panel frame rate
  • For each missed frame latching, the late-stage reprojection (LSR) reuses the last submitted frame
  • The LSR queries the most recent tracking information
  • The LSR performs a simple depth reprojection (when the application submits depth information) or auto-planar reprojection (when the application does not provide depth information)
    • Almost no PCVR application provides depth information to the runtime
  • The reprojected frame is used for scan-out
  • When the application is finally able to submit a new frame, it has to wait for the next latching opportunity, therefore adding latency
3 Likes