Jump to content
Posted 10 November 2013 - 07:49 AM
Posted 10 November 2013 - 11:21 AM
Fake it with fullscreen borderless windows.
From your links it seems to have been this way for a few years so I doubt it will work again soon.
Vista does work, I remember the DX multimonitor sample working correctly back then.
Edited by Erik Rufelt, 10 November 2013 - 11:22 AM.
Posted 10 November 2013 - 11:41 PM
Posted 11 November 2013 - 03:30 PM
Hi guys, thank you for the info!
A long story short, I am working with a special display that requires properly vsync'ed images running at 184Hz per output, and to achieve good update speed I need to use up to 8 outputs to feed information to the display. Using windowed mode I have not been able to achieve properly vsync'ed images at 184Hz using multiple outputs. The display is very sensitive to vsync, and fullscreen seems to work, but not windowed mode.
Posted 11 November 2013 - 04:37 PM
Try calling Flush() before Presenting. Also try using SetMaximumFrameLatency and check the other available flags for swap chains and devices. It is difficult to get proper vsync in window mode, and I believe part of the reason is because frame buffering is disabled, though desktop composition could be a worse factor. Also try using one device per graphics card but multiple swap-chains, or the other way around.
2) can probably work, should be fairly easy to test DX9 and if it works render to a shared texture in DX11. I know OpenGL can have multiple fullscreen windows (on a single graphics card with multiple monitor outputs).
Actually this might just be a case of bad docs.. I didn't run any proper tests, but based on the focus-window docs for DX9Ex I ran a quick experiment with MakeWindowAssociation on the DXGI factory and it seems there can be two different fullscreen windows simultaneously.
Posted 11 November 2013 - 05:23 PM
This is a bit of a long shot, but you might be able to get option 1 working in windows 8 (and possibly not 8.1). It depends on a couple of things:
1. Is the problem with windowed mode that your application image is tearing, that is, not actually vsync'd?
2. At the same time the desktop itself is vsync'd fine, say if you drag a file explorer window around it displays normally without vsync problems?
If that is the case, the windowed mode problem may be caused by your application backbuffer presents being out of sync with the DWM presentation to the display. By default a windowed app backbuffer is blitted to the DWM surface (see: http://msdn.microsoft.com/en-us/library/windows/hardware/ff557525(v=vs.85).aspx ) and that blit isn't perfectly sync'd to the desktop's output to the display.
With DXGI 1.2 in windows 8 they added a newer backbuffer presentation mode, the flip mode, that shares the application backbuffer with DWM, rather than copy (blit) the backbuffer to DWM. You can find information on how to use it here - http://msdn.microsoft.com/en-us/library/windows/desktop/hh706346(v=vs.85).aspx .
Essentially you have to:
- Create a DXGI 1.2 factory.
- Create the device and swapchain seperately rather than with a single function (use D3D11CreateDevice() and factory->CreateSwapChainForHwnd() with a newer DXGI_SWAP_CHAIN_DESC1 struct).
- Use a minimum of 2 buffers in the swapchain desc, along with SwapEffect = DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL.
- Don't use an MSAA backbuffer surface directly (if you need MSAA use a seperate render target for the resolve).
- Don't use more than one flip mode swapchain per hwnd.
That last requirement might be a problem for you, assuming you're currently using a single window and splitting it's client area amongst the many swapchains. I'd assume you could get around this by giving each swapchain it's own hwnd, then setting each window to
maximised the size of it's swapchain's display area, and borderless. Basically tiling multiple borderless hwnd's to create the same appearance as a single large maximised borderless window.
Flip mode should solve any windowed vsync presentation issues, but DWM might still cause an issue by itself not refreshing at the full display rate (i.e. the desktop surface only refreshing every second frame or 92Hz). It might not be a problem in the first place, but if it is, apparently you can override the DWM refresh rate with a function called DwmSetPresentParameters ( http://msdn.microsoft.com/en-us/library/windows/desktop/aa969523(v=vs.85).aspx )
That function is only available in windows 8 and not windows 8.1, so depending whether you need to use it or not, limits your choice of those two OS's that support the flip mode backbuffer presentation method.
Edited by backstep, 11 November 2013 - 05:55 PM.