After reading some articles about the DXGI flip model:
I decided to switch my DXGI_SWAP_EFFECT_DISCARD to DXGI_SWAP_EFFECT_FLIP_DISCARD.
I do not use multiple swap chains per HWND and neither do I mix GDI/D3D (only D3D writes to the swap chain). Based on the articles, it seems that I just need to change my swap chain descriptor from
DXGI_SWAP_CHAIN_DESC1 swap_chain_desc = {};
swap_chain_desc.Width = m_display_configuration.GetDisplayWidth();
swap_chain_desc.Height = m_display_configuration.GetDisplayHeight();
swap_chain_desc.Format = m_display_configuration.GetDisplayFormat(); // DXGI_FORMAT_R8G8B8A8_UNORM
swap_chain_desc.SampleDesc.Count = 1u; // thus no MSAA
swap_chain_desc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
swap_chain_desc.BufferCount = 1u;
//swap_chain_desc.SwapEffect = DXGI_SWAP_EFFECT_DISCARD;
swap_chain_desc.Flags = DXGI_SWAP_CHAIN_FLAG_ALLOW_MODE_SWITCH;
to
DXGI_SWAP_CHAIN_DESC1 swap_chain_desc = {};
swap_chain_desc.Width = m_display_configuration.GetDisplayWidth();
swap_chain_desc.Height = m_display_configuration.GetDisplayHeight();
swap_chain_desc.Format = m_display_configuration.GetDisplayFormat(); // DXGI_FORMAT_R8G8B8A8_UNORM
swap_chain_desc.SampleDesc.Count = 1u; // thus no MSAA
swap_chain_desc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
swap_chain_desc.BufferCount = 2u;
swap_chain_desc.SwapEffect = DXGI_SWAP_EFFECT_FLIP_DISCARD;
swap_chain_desc.Flags = DXGI_SWAP_CHAIN_FLAG_ALLOW_MODE_SWITCH;
Since my use case seems pretty basic, only two changes seem/are required (i.e. buffer count and swap effect). I wonder if I am missing something (though, my program compiles and runs fine)? (I still use CreateSwapChainForHwnd.)
According to the last article, I can even use a R10G10B10A2_UNORM which won't get clamped depending on the desktop?