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

This commit is contained in:
Matt Tytel 2024-10-31 22:37:30 -04:00 committed by GitHub
parent f534946822
commit cc789e83a6
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -469,7 +469,19 @@ 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;
@ -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; scd.Flags |= allowTearing ? DXGI_SWAP_CHAIN_FLAG_ALLOW_TEARING : 0;
scdFlags |= false 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; DXGI_SWAP_CHAIN_FULLSCREEN_DESC scfd;
scd.BufferDesc.Width = _scd.width; scfd.RefreshRate.Numerator = 1;
scd.BufferDesc.Height = _scd.height; scfd.RefreshRate.Denominator = 60;
scd.BufferDesc.RefreshRate.Numerator = 1; scfd.ScanlineOrdering = DXGI_MODE_SCANLINE_ORDER_UNSPECIFIED;
scd.BufferDesc.RefreshRate.Denominator = 60; scfd.Scaling = DXGI_MODE_SCALING_UNSPECIFIED;
scd.BufferDesc.Format = _scd.format; scfd.Windowed = _scd.windowed;
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( 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(