diff --git a/src/dxgi.cpp b/src/dxgi.cpp index a551e468c..fec06a02d 100644 --- a/src/dxgi.cpp +++ b/src/dxgi.cpp @@ -370,12 +370,17 @@ namespace bgfx bool allowTearing = false; #if BX_PLATFORM_WINDOWS - if (windowsVersionIs(Condition::GreaterEqual, 0x0604) ) + IDXGIFactory5* factory5; + hr = m_factory->QueryInterface(IID_IDXGIFactory5, (void**)&factory5); + + if (SUCCEEDED(hr) ) { // BK - CheckFeatureSupport with DXGI_FEATURE_PRESENT_ALLOW_TEARING // will crash on pre Windows 8. Issue #1356. - hr = m_factory->CheckFeatureSupport(DXGI_FEATURE_PRESENT_ALLOW_TEARING, &allowTearing, sizeof(allowTearing) ); + hr = factory5->CheckFeatureSupport(DXGI_FEATURE_PRESENT_ALLOW_TEARING, &allowTearing, sizeof(allowTearing) ); BX_TRACE("Allow tearing is %ssupported.", allowTearing ? "" : "not "); + + DX_RELEASE_I(factory5); } DXGI_SWAP_CHAIN_DESC scd; @@ -395,7 +400,7 @@ namespace bgfx scd.SwapEffect = _scd.swapEffect; scd.Flags = 0 | _scd.flags - | (allowTearing ? DXGI_SWAP_CHAIN_FLAG_ALLOW_TEARING : 0) + | (allowTearing ? DXGI_SWAP_CHAIN_FLAG_ALLOW_TEARING | DXGI_SWAP_CHAIN_FLAG_FRAME_LATENCY_WAITABLE_OBJECT : 0) ; hr = m_factory->CreateSwapChain( @@ -639,7 +644,25 @@ namespace bgfx { HRESULT hr; + uint32_t scdFlags = _scd.flags; + #if BX_PLATFORM_WINDOWS + IDXGIFactory5* factory5; + hr = m_factory->QueryInterface(IID_IDXGIFactory5, (void **)&factory5); + + if (SUCCEEDED(hr)) + { + bool allowTearing = false; + // BK - CheckFeatureSupport with DXGI_FEATURE_PRESENT_ALLOW_TEARING + // will crash on pre Windows 8. Issue #1356. + 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 | DXGI_SWAP_CHAIN_FLAG_FRAME_LATENCY_WAITABLE_OBJECT : 0; + + DX_RELEASE_I(factory5); + } + if (NULL != _nodeMask && NULL != _presentQueue) { @@ -648,7 +671,7 @@ namespace bgfx , _scd.width , _scd.height , _scd.format - , _scd.flags + , scdFlags , _nodeMask , _presentQueue ); @@ -663,7 +686,7 @@ namespace bgfx , _scd.width , _scd.height , _scd.format - , _scd.flags + , scdFlags ); }