Search code examples
c++uwpdirect3d12

Switching D3D12 device in UWP app causes CreateSwapChainForCoreWindow to fail


I have a UWP app which may need to switch between D3D12 devices. For that, I would create a new swap chain by calling CreateSwapChainForCoreWindow. However, this operation fails with E_ACCESSDENIED if I do a switch (it works in the first call) and the debug layer prints the following message:

DXGI ERROR: IDXGIFactory::CreateSwapChain: Only one flip model swap chain can be associate with an HWND, IWindow, or composition surface at a time. ClearState() and Flush() may need to be called on the D3D11 device context to trigger deferred destruction of old swapchains. [ MISCELLANEOUS ERROR #297: ]

On D3D11, I can do exactly this, call ClearState and Flush on the device context before creating a new swap chain, but I have no idea what the equivalent would be in D3D12.


Solution

  • This error can be resolved by calling ID3D12GraphicsCommandList::ClearState and waiting for a fence before creating a new swap chain.