I'm a little confused about the proper way for a Windowed mode app, which must work nicely with multimonitor setups, to create its principal objects such as the device and swapchain.
Suppose I have a window (i.e. an HWND), which can be on any monitor (i.e. output), and I want to create a D3D11 device and swapchain for it. To keep things simple initially, I'll assume that the window doesn't span multiple monitors. How can I figure out which adapter and output the window lives on?
From reading the docs in the Jun 2010 DX SDK, it seems that the only available method for this type of query is IDXGISwapChain::GetContainingOutput. But this requires a swap chain to be created, which seems to require a device to be created, which seems to require me to guess which device / adapter contains my window, defeating the original object. I am assuming that adapters and devices are just different aspects of the same thing.
Do I really have to enumerate every adapter, creating a device and swapchain until I find the one that contains the majority of my window's client area? I guess I am probably missing something, or making some invalid assumptions.
All of the examples that I've looked at avoid this issue because either they use D3D11CreateDeviceAndSwapChain to create a device, or they operate in fullscreen mode, or they simply don't appear to care about working correctly on multimonitor setups.
IDXGISwapChain::GetContainingOutput only returns the output containing the majority of a window's client area, so I can't see how to support the more general case (find the complete set of adapters and outputs on which any part of the window's client area is visible).
I guess I could use D3D11CreateDeviceAndSwapChain, but I prefer to know what's really going on, and also to have the knowledge to make the application work in the most general case.
Thanks in advance for any wisdom.