Browse Source

Use DXGI_SWAP_CHAIN_DESC1 if available for additional scaling options. (#3370)

Matt Tytel 1 year ago
parent
commit
cc789e83a6
1 changed files with 29 additions and 38 deletions
  1. 29 38
      src/dxgi.cpp

+ 29 - 38
src/dxgi.cpp

@@ -469,8 +469,20 @@ namespace bgfx
 	{
 	{
 		HRESULT hr = S_OK;
 		HRESULT hr = S_OK;
 
 
-		uint32_t scdFlags = _scd.flags;
-
+		DXGI_SWAP_CHAIN_DESC1 scd;
+		scd.Width  = _scd.width;
+		scd.Height = _scd.height;
+		scd.Format = _scd.format;
+		scd.Stereo = _scd.stereo;
+		scd.SampleDesc.Count   = 1;
+		scd.SampleDesc.Quality = 0;
+		scd.BufferUsage = _scd.bufferUsage;
+		scd.BufferCount = _scd.bufferCount;
+		scd.Scaling     = _scd.scaling;
+		scd.SwapEffect  = _scd.swapEffect;
+		scd.AlphaMode   = _scd.alphaMode;
+		scd.Flags       = _scd.flags;
+		
 #if BX_PLATFORM_LINUX || BX_PLATFORM_WINDOWS
 #if BX_PLATFORM_LINUX || BX_PLATFORM_WINDOWS
 		IDXGIFactory5* factory5;
 		IDXGIFactory5* factory5;
 		hr = m_factory->QueryInterface(IID_IDXGIFactory5, (void**)&factory5);
 		hr = m_factory->QueryInterface(IID_IDXGIFactory5, (void**)&factory5);
@@ -483,8 +495,8 @@ namespace bgfx
 			hr = factory5->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 ");
 
 
-			scdFlags |= allowTearing ? DXGI_SWAP_CHAIN_FLAG_ALLOW_TEARING : 0;
-			scdFlags |= false
+			scd.Flags |= allowTearing ? DXGI_SWAP_CHAIN_FLAG_ALLOW_TEARING : 0;
+			scd.Flags |= false
 				|| _scd.swapEffect == DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL
 				|| _scd.swapEffect == DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL
 				|| _scd.swapEffect == DXGI_SWAP_EFFECT_FLIP_DISCARD
 				|| _scd.swapEffect == DXGI_SWAP_EFFECT_FLIP_DISCARD
 				? 0 // DXGI_SWAP_CHAIN_FLAG_FRAME_LATENCY_WAITABLE_OBJECT
 				? 0 // DXGI_SWAP_CHAIN_FLAG_FRAME_LATENCY_WAITABLE_OBJECT
@@ -496,43 +508,22 @@ namespace bgfx
 			DX_RELEASE_I(factory5);
 			DX_RELEASE_I(factory5);
 		}
 		}
 
 
-		DXGI_SWAP_CHAIN_DESC scd;
-		scd.BufferDesc.Width  = _scd.width;
-		scd.BufferDesc.Height = _scd.height;
-		scd.BufferDesc.RefreshRate.Numerator   = 1;
-		scd.BufferDesc.RefreshRate.Denominator = 60;
-		scd.BufferDesc.Format = _scd.format;
-		scd.BufferDesc.ScanlineOrdering = DXGI_MODE_SCANLINE_ORDER_UNSPECIFIED;
-		scd.BufferDesc.Scaling = DXGI_MODE_SCALING_UNSPECIFIED;
-		scd.SampleDesc.Count   = 1;
-		scd.SampleDesc.Quality = 0;
-		scd.BufferUsage  = _scd.bufferUsage;
-		scd.BufferCount  = _scd.bufferCount;
-		scd.OutputWindow = (HWND)_scd.nwh;
-		scd.Windowed     = _scd.windowed;
-		scd.SwapEffect   = _scd.swapEffect;
-		scd.Flags        = scdFlags;
-
-		hr = m_factory->CreateSwapChain(
+		DXGI_SWAP_CHAIN_FULLSCREEN_DESC scfd;
+		scfd.RefreshRate.Numerator   = 1;
+		scfd.RefreshRate.Denominator = 60;
+		scfd.ScanlineOrdering = DXGI_MODE_SCANLINE_ORDER_UNSPECIFIED;
+		scfd.Scaling  = DXGI_MODE_SCALING_UNSPECIFIED;
+		scfd.Windowed = _scd.windowed;
+
+		hr = m_factory->CreateSwapChainForHwnd(
 			  _device
 			  _device
+			, (HWND)_scd.nwh
 			, &scd
 			, &scd
-			, reinterpret_cast<IDXGISwapChain**>(_swapChain)
-			);
+			, &scfd
+			, NULL
+			, reinterpret_cast<IDXGISwapChain1**>(_swapChain)
+		);
 #else
 #else
-		DXGI_SWAP_CHAIN_DESC1 scd;
-		scd.Width  = _scd.width;
-		scd.Height = _scd.height;
-		scd.Format = _scd.format;
-		scd.Stereo = _scd.stereo;
-		scd.SampleDesc.Count   = 1;
-		scd.SampleDesc.Quality = 0;
-		scd.BufferUsage = _scd.bufferUsage;
-		scd.BufferCount = _scd.bufferCount;
-		scd.Scaling     = _scd.scaling;
-		scd.SwapEffect  = _scd.swapEffect;
-		scd.AlphaMode   = _scd.alphaMode;
-		scd.Flags       = scdFlags;
-
 		if (NULL == _scd.ndt)
 		if (NULL == _scd.ndt)
 		{
 		{
 			hr = m_factory->CreateSwapChainForCoreWindow(
 			hr = m_factory->CreateSwapChainForCoreWindow(