소스 검색

DXGI: Fixed allow tear.

Бранимир Караџић 5 년 전
부모
커밋
725438583e
1개의 변경된 파일28개의 추가작업 그리고 5개의 파일을 삭제
  1. 28 5
      src/dxgi.cpp

+ 28 - 5
src/dxgi.cpp

@@ -370,12 +370,17 @@ namespace bgfx
 		bool allowTearing = false;
 		bool allowTearing = false;
 
 
 #if BX_PLATFORM_WINDOWS
 #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
 			// BK - CheckFeatureSupport with DXGI_FEATURE_PRESENT_ALLOW_TEARING
 			//      will crash on pre Windows 8. Issue #1356.
 			//      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 ");
 			BX_TRACE("Allow tearing is %ssupported.", allowTearing ? "" : "not ");
+
+			DX_RELEASE_I(factory5);
 		}
 		}
 
 
 		DXGI_SWAP_CHAIN_DESC scd;
 		DXGI_SWAP_CHAIN_DESC scd;
@@ -395,7 +400,7 @@ namespace bgfx
 		scd.SwapEffect   = _scd.swapEffect;
 		scd.SwapEffect   = _scd.swapEffect;
 		scd.Flags        = 0
 		scd.Flags        = 0
 			| _scd.flags
 			| _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(
 		hr = m_factory->CreateSwapChain(
@@ -639,7 +644,25 @@ namespace bgfx
 	{
 	{
 		HRESULT hr;
 		HRESULT hr;
 
 
+		uint32_t scdFlags = _scd.flags;
+
 #if BX_PLATFORM_WINDOWS
 #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
 		if (NULL != _nodeMask
 		&&  NULL != _presentQueue)
 		&&  NULL != _presentQueue)
 		{
 		{
@@ -648,7 +671,7 @@ namespace bgfx
 				, _scd.width
 				, _scd.width
 				, _scd.height
 				, _scd.height
 				, _scd.format
 				, _scd.format
-				, _scd.flags
+				, scdFlags
 				, _nodeMask
 				, _nodeMask
 				, _presentQueue
 				, _presentQueue
 				);
 				);
@@ -663,7 +686,7 @@ namespace bgfx
 				, _scd.width
 				, _scd.width
 				, _scd.height
 				, _scd.height
 				, _scd.format
 				, _scd.format
-				, _scd.flags
+				, scdFlags
 				);
 				);
 		}
 		}