diff --git a/src/dxgi.cpp b/src/dxgi.cpp index eb9dd20a4..265c0da31 100644 --- a/src/dxgi.cpp +++ b/src/dxgi.cpp @@ -496,15 +496,20 @@ namespace bgfx hr = factory5->CheckFeatureSupport(DXGI_FEATURE_PRESENT_ALLOW_TEARING, &allowTearing, sizeof(allowTearing) ); BX_TRACE("Allow tearing is %ssupported.", allowTearing ? "" : "not "); - scd.Flags |= allowTearing ? DXGI_SWAP_CHAIN_FLAG_ALLOW_TEARING : 0; - scd.Flags |= (_scd.waitable - && (DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL == _scd.swapEffect - || DXGI_SWAP_EFFECT_FLIP_DISCARD == _scd.swapEffect) ) + // DXGI_SWAP_CHAIN_FLAG_ALLOW_TEARING and the waitable object are only + // valid on flip-model swap chains. + const bool flipModel = false + || DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL == _scd.swapEffect + || DXGI_SWAP_EFFECT_FLIP_DISCARD == _scd.swapEffect + ; + + scd.Flags |= allowTearing && flipModel ? DXGI_SWAP_CHAIN_FLAG_ALLOW_TEARING : 0; + scd.Flags |= _scd.waitable && flipModel ? DXGI_SWAP_CHAIN_FLAG_FRAME_LATENCY_WAITABLE_OBJECT : 0 ; - m_tearingSupported = allowTearing; + m_tearingSupported = allowTearing && flipModel; DX_RELEASE_I(factory5); } @@ -745,10 +750,15 @@ namespace bgfx hr = factory5->CheckFeatureSupport(DXGI_FEATURE_PRESENT_ALLOW_TEARING, &allowTearing, sizeof(allowTearing)); BX_TRACE("Allow tearing is %ssupported.", allowTearing ? "" : "not "); - scdFlags |= allowTearing ? DXGI_SWAP_CHAIN_FLAG_ALLOW_TEARING : 0; - scdFlags |= (_scd.waitable - && (DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL == _scd.swapEffect - || DXGI_SWAP_EFFECT_FLIP_DISCARD == _scd.swapEffect) ) + // Must match the flags the swap chain was created with: tearing and the + // waitable object are only valid on flip-model swap chains. + const bool flipModel = false + || DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL == _scd.swapEffect + || DXGI_SWAP_EFFECT_FLIP_DISCARD == _scd.swapEffect + ; + + scdFlags |= allowTearing && flipModel ? DXGI_SWAP_CHAIN_FLAG_ALLOW_TEARING : 0; + scdFlags |= _scd.waitable && flipModel ? DXGI_SWAP_CHAIN_FLAG_FRAME_LATENCY_WAITABLE_OBJECT : 0 ; diff --git a/src/renderer_d3d11.cpp b/src/renderer_d3d11.cpp index a50a52986..7b558f5b7 100644 --- a/src/renderer_d3d11.cpp +++ b/src/renderer_d3d11.cpp @@ -1208,6 +1208,8 @@ namespace bgfx { namespace d3d11 m_scd.bufferCount = m_swapBufferCount; m_scd.swapEffect = m_swapEffect; + // DXGI_SCALING_NONE is only valid for flip-model swap chains. + m_scd.scaling = DXGI_SCALING_STRETCH; hr = m_dxgi.createSwapChain(m_device , m_scd , &mainFrameBuffer().m_swapChain