My observations so far are that there is something seriously wrong about how
pi_server is handling the frame throttling for motion smoothing, and unless your app is running in SteamVR, you are always getting into 1/3rd rate any time your frame time is over 10ms… This is not correct.
I’ve looked at calls to the PVR client API for begin/end of frame (
pi_server is inexplicably making me wait > 20ms/frame when the app frame time is 10ms, effectively taking me down to 30 FPS when at 90 Hz.
Interestingly, running the same app (which was DCS) through OpenVR in SteamVR, the calls to begin/end of frame are never blocking. It never gets throttled. Instead, it appears that the SteamVR driver itself is managing frame timing, and throttling down to the appropriate frame rate for motion smoothing. I want to be able to do that too!
I initially assumed that I misused the PVR API, but then I took Pimax’s very own sample code (
SimpleVRDemoDX11) and I bumped up the amount of rendering in the app to ~16ms, I get 60 FPS as expected without motion smoothing, but then immediately 30 FPS with motion smoothing… So the issue is reproducible with Pimax’s very own sample code.
I spent the day searching what SteamVR is doing differently when using the PVR API, logging every simple PVR call, disassembling and searching both the PVR client library and
pi_server, but in vain… until I finally had the idea to rename
vrserver.exe (which is the name of the SteamVR compositor process). And there it was, all frame throttling is gone!
I inspected the initialization sequence in the PVR client library, and it is indeed looking if the running process’ name is
vrserver, and if it is, it toggles an additional bit when establishing the session with
pi_server. This magic bit seems to give total frame timing control to the application.
EDIT: I also just found a magic
openvr_client_render_ms PVR property that the SteamVR driver must set every frame and that seems to control the activation of Smart Smoothing. Anyway, none of this stuff seems documented anywhere!
I’ve sent an email to my contact at Pimax to shed some lights on what’s going on here. Meanwhile, I am writing a hack in my Pimax OpenXR runtime to impersonate the
vrserver process and implement my own timing management, and hopefully be able to force apps to use 1/2 when possible.