Procházet zdrojové kódy

Dxgi tearing support (#2601)

* present tearing support

* use existing syncInterval variable
James Fulop před 4 roky
rodič
revize
bbc2b76948
4 změnil soubory, kde provedl 31 přidání a 2 odebrání
  1. 8 0
      src/dxgi.cpp
  2. 4 0
      src/dxgi.h
  3. 6 1
      src/renderer_d3d11.cpp
  4. 13 1
      src/renderer_d3d12.cpp

+ 8 - 0
src/dxgi.cpp

@@ -122,6 +122,7 @@ namespace bgfx
 		, m_factory(NULL)
 		, m_factory(NULL)
 		, m_adapter(NULL)
 		, m_adapter(NULL)
 		, m_output(NULL)
 		, m_output(NULL)
+		, m_tearingSupported(false)
 	{
 	{
 	}
 	}
 
 
@@ -389,6 +390,8 @@ namespace bgfx
 				: 0
 				: 0
 				;
 				;
 
 
+			m_tearingSupported = allowTearing;
+
 			DX_RELEASE_I(factory5);
 			DX_RELEASE_I(factory5);
 		}
 		}
 
 
@@ -785,6 +788,11 @@ namespace bgfx
 #endif // BX_PLATFORM_WINDOWS || BX_PLATFORM_WINRT
 #endif // BX_PLATFORM_WINDOWS || BX_PLATFORM_WINRT
 	}
 	}
 
 
+	bool Dxgi::tearingSupported()
+	{
+		return m_tearingSupported;
+	}
+
 } // namespace bgfx
 } // namespace bgfx
 
 
 #endif // BGFX_CONFIG_RENDERER_DIRECT3D11 || BGFX_CONFIG_RENDERER_DIRECT3D12
 #endif // BGFX_CONFIG_RENDERER_DIRECT3D11 || BGFX_CONFIG_RENDERER_DIRECT3D12

+ 4 - 0
src/dxgi.h

@@ -99,6 +99,9 @@ namespace bgfx
 		///
 		///
 		void trim();
 		void trim();
 
 
+		///
+		bool tearingSupported();
+
 		///
 		///
 		void* m_dxgiDll;
 		void* m_dxgiDll;
 		void* m_dxgiDebugDll;
 		void* m_dxgiDebugDll;
@@ -108,6 +111,7 @@ namespace bgfx
 		FactoryI* m_factory;
 		FactoryI* m_factory;
 		AdapterI* m_adapter;
 		AdapterI* m_adapter;
 		OutputI*  m_output;
 		OutputI*  m_output;
+		bool m_tearingSupported;
 	};
 	};
 
 
 } // namespace bgfx
 } // namespace bgfx

+ 6 - 1
src/renderer_d3d11.cpp

@@ -2287,7 +2287,12 @@ namespace bgfx { namespace d3d11
 					if (NULL != m_swapChain
 					if (NULL != m_swapChain
 					&&  m_needPresent)
 					&&  m_needPresent)
 					{
 					{
-						hr = m_swapChain->Present(syncInterval, 0);
+						uint32_t presentFlags = 0;
+						if (!syncInterval && (m_dxgi.tearingSupported()))
+						{
+							presentFlags |= DXGI_PRESENT_ALLOW_TEARING;
+						}
+						hr = m_swapChain->Present(syncInterval, presentFlags);
 
 
 						m_needPresent = false;
 						m_needPresent = false;
 					}
 					}

+ 13 - 1
src/renderer_d3d12.cpp

@@ -1508,7 +1508,19 @@ namespace bgfx { namespace d3d12
 
 
 				HRESULT hr = S_OK;
 				HRESULT hr = S_OK;
 				uint32_t syncInterval = !!(m_resolution.reset & BGFX_RESET_VSYNC);
 				uint32_t syncInterval = !!(m_resolution.reset & BGFX_RESET_VSYNC);
-				uint32_t flags = 0 == syncInterval ? DXGI_PRESENT_RESTART : 0;
+				uint32_t flags = 0;
+				if (syncInterval)
+				{
+					flags |= DXGI_PRESENT_RESTART;
+				}
+				else
+				{
+					if (m_dxgi.tearingSupported())
+					{
+						flags |= DXGI_PRESENT_ALLOW_TEARING;
+					}
+				}
+
 				for (uint32_t ii = 1, num = m_numWindows; ii < num && SUCCEEDED(hr); ++ii)
 				for (uint32_t ii = 1, num = m_numWindows; ii < num && SUCCEEDED(hr); ++ii)
 				{
 				{
 					FrameBufferD3D12& frameBuffer = m_frameBuffers[m_windows[ii].idx];
 					FrameBufferD3D12& frameBuffer = m_frameBuffers[m_windows[ii].idx];