diff --git a/src/dxgi.cpp b/src/dxgi.cpp index 4eae796d31..c93c6c2055 100644 --- a/src/dxgi.cpp +++ b/src/dxgi.cpp @@ -469,8 +469,20 @@ namespace bgfx { 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 IDXGIFactory5* 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) ); 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_DISCARD ? 0 // DXGI_SWAP_CHAIN_FLAG_FRAME_LATENCY_WAITABLE_OBJECT @@ -496,43 +508,22 @@ namespace bgfx 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 + , (HWND)_scd.nwh , &scd - , reinterpret_cast(_swapChain) - ); + , &scfd + , NULL + , reinterpret_cast(_swapChain) + ); #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) { hr = m_factory->CreateSwapChainForCoreWindow(