Jump to content
  • Advertisement
Sign in to follow this  

DX11 Fullscreen Direct3D 11 multi device (gpu), multi swap chain per device rendering

This topic is 2073 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

In my application I seem unable to achieve more than one device (GPU) in fullscreen at the same time. After much testing and googling I still remain puzzled. Windowed mode is not an option for me, and multi device is essential. Using Windows 8.
I can get multiple swap chains on a single device to go fullscreen at the same time, but as soon as more than one device is going fullscreen, a maximum of one device remains in fullscreen mode.
I also found this blog stating the problem:
Is it possible to achieve fullscreen rendering on multiple devices using DirectX 11 on Windows 8? If yes, how would that be achieved? If not, what's the rationale behind it?
Found this post stating that DXGI 1.1 has issues with multi device fullscreen rendering, however I have not found information about DXGI 1.2 or 1.3 and if this issue has been fixed.
Looking for solutions for DirectX 11, I found a webpage stating that DirectX 9 could be used in fullscreen mode on multiple devices if some restrictions are met:
"... The practical implication is that a multiple monitor application can place several devices in full-screen mode, but only if all these devices are for different adapters, were created by the same Direct3D9 object, and all share the same focus window..."
Are there similar restrictions as with DX9 for DX11 on Windows 8 and how could they be met?
If fullscreen rendering on multiple devices is not possible using DirectX 11 (for some reason I would like to know), could it be possible to interop between DX9 and DX11 to get it working? 
I also read in a blog that Windows Vista might work with multiple fullscreen devices since it uses DXGI 1.0. Could this be correct? 
I would really appreciate some comments on this issue.
Best regards,
Jørn Skaarud Karlsen

Share this post

Link to post
Share on other sites

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

Share this post

Link to post
Share on other sites
One way you can handle is to called ChangeDisplayModeSettingEx to change the monitor screen resolution. Then create a bordeless window that is the same size that you have you display setting set to. This will simulate exactly what directx does when you go fullscreen. At my job we have to handle 4 monitors in full screen and that is how i did it.

Share this post

Link to post
Share on other sites

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.


As I see it, my options are:
1) Get properly vsync'ed and refresh rate synchronized images from windowed mode - which I have not been able to achieve as of this moment.
2) Try using DX11 DX9 interop since DX9 might (?) be able to achieve fullscreen mode on several GPUs.
3) Go back to Windows Vista - not really a solution since it is not future proof.
4) Try using GPUs in SLI - this is a suboptimal solution since modern graphics cards only support 4 outputs where I would like to use all 8 inputs on the 3D display, and it would involve moving data between GPUs at high refresh rates - reducing performance.
5) Use more computers with one GPU in each (very much not an ideal solution).
If you know how to get 1) working, that would be highly appreciated since the ideal solution of fullscreen mode does not seem to be achieveable (windowed mode used to work with Windows XP, so it has been achieved with an older version, but have not been able to get it working properly with Windows 7/8 maybe due to dwm or other reasons).
Number 2) is also an option if it works. I would consider this a valid solution to my problem - though it is a hack.
Any last comments on this issue?

Share this post

Link to post
Share on other sites

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.

Share this post

Link to post
Share on other sites

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

Share this post

Link to post
Share on other sites
Sign in to follow this  

  • Advertisement

Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

GameDev.net is your game development community. Create an account for your GameDev Portfolio and participate in the largest developer community in the games industry.

Sign me up!