mirror of
https://github.com/bkaradzic/bgfx.git
synced 2026-10-25 02:10:51 +00:00
D3D11: Fixed the DXGI_SWAP_EFFECT_DISCARD fallback swap chain. (#3997)
The retry kept DXGI_SCALING_NONE, and createSwapChain/resizeBuffers added DXGI_SWAP_CHAIN_FLAG_ALLOW_TEARING for every swap effect; both are flip-model only, so the fallback failed with DXGI_ERROR_INVALID_CALL and a bitblt chain could not be resized.
This commit is contained in:
28
src/dxgi.cpp
28
src/dxgi.cpp
@@ -496,15 +496,20 @@ namespace bgfx
|
||||
hr = factory5->CheckFeatureSupport(DXGI_FEATURE_PRESENT_ALLOW_TEARING, &allowTearing, sizeof(allowTearing) );
|
||||
BX_TRACE("Allow tearing is %ssupported.", allowTearing ? "" : "not ");
|
||||
|
||||
scd.Flags |= allowTearing ? DXGI_SWAP_CHAIN_FLAG_ALLOW_TEARING : 0;
|
||||
scd.Flags |= (_scd.waitable
|
||||
&& (DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL == _scd.swapEffect
|
||||
|| DXGI_SWAP_EFFECT_FLIP_DISCARD == _scd.swapEffect) )
|
||||
// DXGI_SWAP_CHAIN_FLAG_ALLOW_TEARING and the waitable object are only
|
||||
// valid on flip-model swap chains.
|
||||
const bool flipModel = false
|
||||
|| DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL == _scd.swapEffect
|
||||
|| DXGI_SWAP_EFFECT_FLIP_DISCARD == _scd.swapEffect
|
||||
;
|
||||
|
||||
scd.Flags |= allowTearing && flipModel ? DXGI_SWAP_CHAIN_FLAG_ALLOW_TEARING : 0;
|
||||
scd.Flags |= _scd.waitable && flipModel
|
||||
? DXGI_SWAP_CHAIN_FLAG_FRAME_LATENCY_WAITABLE_OBJECT
|
||||
: 0
|
||||
;
|
||||
|
||||
m_tearingSupported = allowTearing;
|
||||
m_tearingSupported = allowTearing && flipModel;
|
||||
|
||||
DX_RELEASE_I(factory5);
|
||||
}
|
||||
@@ -745,10 +750,15 @@ 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 |= (_scd.waitable
|
||||
&& (DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL == _scd.swapEffect
|
||||
|| DXGI_SWAP_EFFECT_FLIP_DISCARD == _scd.swapEffect) )
|
||||
// Must match the flags the swap chain was created with: tearing and the
|
||||
// waitable object are only valid on flip-model swap chains.
|
||||
const bool flipModel = false
|
||||
|| DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL == _scd.swapEffect
|
||||
|| DXGI_SWAP_EFFECT_FLIP_DISCARD == _scd.swapEffect
|
||||
;
|
||||
|
||||
scdFlags |= allowTearing && flipModel ? DXGI_SWAP_CHAIN_FLAG_ALLOW_TEARING : 0;
|
||||
scdFlags |= _scd.waitable && flipModel
|
||||
? DXGI_SWAP_CHAIN_FLAG_FRAME_LATENCY_WAITABLE_OBJECT
|
||||
: 0
|
||||
;
|
||||
|
||||
@@ -1208,6 +1208,8 @@ namespace bgfx { namespace d3d11
|
||||
|
||||
m_scd.bufferCount = m_swapBufferCount;
|
||||
m_scd.swapEffect = m_swapEffect;
|
||||
// DXGI_SCALING_NONE is only valid for flip-model swap chains.
|
||||
m_scd.scaling = DXGI_SCALING_STRETCH;
|
||||
hr = m_dxgi.createSwapChain(m_device
|
||||
, m_scd
|
||||
, &mainFrameBuffer().m_swapChain
|
||||
|
||||
Reference in New Issue
Block a user