Skip to main content
Up and Coming
June 18, 2013

Oculus Rift automatic down-sampling and Duplicated displays

This came up in the Half-Life thread, but it isn't specifically a Half-Life question, so I wanted to start a new thread for this issue.

The Rift exposes a bunch of different valid resolutions to Windows even the panel itself is 1280x800 and only 1280x800. It goes up to 1920x1200 (which is also 16:10). Not sure how far it goes down.

After some research (and measuring) it seems to us that the down-sampling occurs in the Rift converter box and that it doesn't introduce significant latency. The way we measure latency (with a high speed camera and some blinky LEDs) we have a minimum resolution of about 3ms, so a 0ms measurement means something less than 3ms. This is all just display latency and doesn't include any measurable rendering time or tracking. This was all under DX11, in case that's significant. (The Source games actually run under DX9.)

Full screen with the display extended to the Rift (not duplicated):
1280x800: 0ms
1920x1200: 0ms

Windowed without Aero and the display extended to the Rift:
1280x800: 10ms

When you switch to duplicating the desktop monitor and the Rift things get strange. The tester runs at something like 1000Hz, and it appears that Windows is actually dropping most of the frames and never sending them to the display at all. This happens in both Full-screen and Windowed, but the final swap in windowed is slow enough that fewer frames get dropped. It dropped so many frames that measuring the latency was actually hard to do.

So the verdict is:
1) Letting the Rift scale down the frames is more or less fine
2) I need to switch the Source games to use full screen instead of windowed to save 10ms
3) Cloning your main display is bad and is probably causing extra latency.

    32 replies

    Inspiring
    June 19, 2013
    "drash" wrote:
    "mrgreen72" wrote:
    Very interesting results. Glad to know that downscaling through the Rift doesn't introduce latency as it does look much better. I could have sworn the head tracking didn't feel as smooth though. I'm crazy apparently. :oops:


    Maybe you're not crazy -- maybe in your case, the app you were running was fast at 1280x800, but at 1920x1080 broke below 60fps (or whatever fps you start to feel it not being smooth)?

    Makes sense but that's not it.
    Up and Coming
    June 19, 2013
    "joe" wrote:

    When you switch to duplicating the desktop monitor and the Rift things get strange. The tester runs at something like 1000Hz, and it appears that Windows is actually dropping most of the frames and never sending them to the display at all. This happens in both Full-screen and Windowed, but the final swap in windowed is slow enough that fewer frames get dropped. It dropped so many frames that measuring the latency was actually hard to do.

    This sounds really strange to me, are you sure you are setting the Rift as the Source of cloning? Because the strange behaviour you describe is exactly what I was perceiving the first time I tried the Rift, there was a really bad (and unusual) stuttering to the image; then I discovered I had to select the Rift as Source of the clone. After that I didn't notice any difference between cloning and extending.
    Up and Coming
    June 19, 2013
    "joe" wrote:
    1) Letting the Rift scale down the frames is more or less fine


    That's great! I've specially noticed how much better it is in Titans of Space, the text is way easier to read with the Rift downscaling from 1080p.

    "joe" wrote:
    3) Cloning your main display is bad and is probably causing extra latency.


    What about cloning using the graphic card driver instead of Windows desktop properties? I'm using a Catalyst Control Center option that creates an "Eyefinity group" of cloned displays, I've tried up to 3. Setting the Rift as preferred display gets rid of the tearing on it, but can see the main monitor tearing. I haven't noticed any latency, but I have no way to measure it.
    Comunidad española de RV / Spanish VR Community
    Participant
    June 19, 2013
    "joe" wrote:
    "mrgreen72" wrote:

    Having a mirrored screen is pretty frickin convenient though. Anyone has recommendations on a splitter?


    We use these: http://www.amazon.com/Aluratek-ADS02F-2-Port-Video-Splitter/dp/B001IYFZA2/ref=sr_1_2?ie=UTF8&qid=1371595282&sr=8-2


    I see that the splitter supports 1900 x 1200. 1920x1200 is not mentioned, is that going to be a problem when running full res ?
    Participant
    June 19, 2013
    "joe" wrote:
    "mrgreen72" wrote:

    Wasn't there other issues when you extended your desktop to your Rift? Some said to put the Rift as the primary display but how the hell am I supposed to use Windows that way?

    I've had my desktop extended to a Rift for about six months and haven't noticed any issue with either the the desktop or the games running on the Rift. I don't know if it has implications with different setups, though.

    The one bizarre issue I had was that one of the P4V screens (File Diff?) would insist on popping up on the secondary monitor (i.e. the Rift). No other program did this. I got used to hitting the magic key combo to retrieve my window: Alt+Space, M, Down cursor, then move the mouse.

    The other solution to this is using a DVI or HMDI splitter to duplicate the Rift screen on a monitor. Also makes for a simpler debugging cycle.

    Remember the Rift SDK does tell you which monitor the Rift is on, so if you're writing apps, please do query it and create the screen on the correct monitor. That way people don't have to set the Rift as the primary.
    Tom Forsyth - OculusVR coder
    Participant
    June 19, 2013
    "PostHuman" wrote:
    I see that the splitter supports 1900 x 1200. 1920x1200 is not mentioned, is that going to be a problem when running full res ?

    Almost certainly a typo - "1900" is not any resolution I know of.
    Tom Forsyth - OculusVR coder
    Participant
    June 19, 2013
    "joe" wrote:
    Full screen with the display extended to the Rift (not duplicated):
    1280x800: 0ms
    1920x1200: 0ms

    Windowed without Aero and the display extended to the Rift:
    1280x800: 10ms

    When you switch to duplicating the desktop monitor and the Rift things get strange. The tester runs at something like 1000Hz, and it appears that Windows is actually dropping most of the frames and never sending them to the display at all. This happens in both Full-screen and Windowed, but the final swap in windowed is slow enough that fewer frames get dropped. It dropped so many frames that measuring the latency was actually hard to do.

    So the verdict is:
    1) Letting the Rift scale down the frames is more or less fine
    2) I need to switch the Source games to use full screen instead of windowed to save 10ms
    3) Cloning your main display is bad and is probably causing extra latency.

    Random theories:

    #1: makes sense. The scaling chip is tiny and has only a few scanlines of memory, so it couldn't buffer even if it wanted to. Good to know it's working.

    #2: I think this is still the Windows Presentation Manager (or whatever it's called these days) - the window has to be blitted to the screen, and it only does that at VBLANK. But if you have two monitors connected, *which* VBLANK is the WPM synced to? It might be the first one (your primary), not the second one (the Rift). So maybe "10ms" is actually an average of half of 16.7ms (because the two are not in sync) plus 2ms for the blit? Did you check if the Aero timings were any different?

    #3: The GPUs have lots of different ways of doing the cloning under the hood. Sometimes it's just a blit triggered by the driver (e.g. it's an elegant way of doing rescaling for modes the RAMDAC/scaler doesn't natively support). So maybe that blit is only happening at VBLANK as well, which is why you're seeing dropped frames. IIRC there's some options you can play with in some AMD control panels which might affect this ("Enable GPU scaling")
    Tom Forsyth - OculusVR coder
    joeAuthor
    Up and Coming
    June 19, 2013
    "PostHuman" wrote:
    I see that the splitter supports 1900 x 1200. 1920x1200 is not mentioned, is that going to be a problem when running full res ?


    From the Amazon listing: Supports DVI monitor resolutions up to 1900 x 1200

    Mine is set to 1920x1200. I think they just mentioned "widescreen up to 1920x1080" because people don't understand the difference between 16:9 and 16:10 aspect ratios.
    joeAuthor
    Up and Coming
    June 19, 2013
    "joe" wrote:
    "PostHuman" wrote:
    I see that the splitter supports 1900 x 1200. 1920x1200 is not mentioned, is that going to be a problem when running full res ?


    From the Amazon listing: Supports DVI monitor resolutions up to 1900 x 1200

    Mine is set to 1920x1200. I think they just mentioned "widescreen up to 1920x1080" because people don't understand the difference between 16:9 and 16:10 aspect ratios.


    Turns out I can't read. Yes, it supports 1920x1200. The Amazon listing has a typo.
    joeAuthor
    Up and Coming
    June 19, 2013
    "LordJuanlo" wrote:

    What about cloning using the graphic card driver instead of Windows desktop properties? I'm using a Catalyst Control Center option that creates an "Eyefinity group" of cloned displays, I've tried up to 3. Setting the Rift as preferred display gets rid of the tearing on it, but can see the main monitor tearing. I haven't noticed any latency, but I have no way to measure it.


    We cloned it using the NVIDIA control panel. I believe both control panels set the same settings under the hood.

    If the display cloning is getting rid of tearing that means it's buffering full frames and definitely adding latency. That's about the same thing as running vsync.

    Getting rid of tearing isn't necessarily a good thing. When you tear you're trading off the tear for lower latency. If you run vsync you are guaranteeing that the last scanline is 16ms old when it finally gets drawn. Usually we get a tear (or two?) which means we cut our average latency for any given scanline to half or a third of what it would be with vsync.

    Vsync can cause other problems if you're not careful. The OS and driver often buffer up a few frames to let the CPU run a bit ahead of the GPU and display. Every frame it runs ahead is another frame of latency between your headtracking data and your displayed frames. This was bad enough on OSX that we forcibly turn off vsync in VR mode. On Windows we haven't been running full screen so vsync wasn't an option, but when we ship we'll probably need to turn it off there too.