From 725438583e0d95092152b9a56dc2a934db27aff1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=91=D1=80=D0=B0=D0=BD=D0=B8=D0=BC=D0=B8=D1=80=20=D0=9A?= =?UTF-8?q?=D0=B0=D1=80=D0=B0=D1=9F=D0=B8=D1=9B?= Date: Mon, 27 Jul 2020 14:57:34 -0700 Subject: [PATCH] DXGI: Fixed allow tear. --- src/dxgi.cpp | 33 ++++++++++++++++++++++++++++----- 1 file changed, 28 insertions(+), 5 deletions(-) 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 ); }