Skip to content

Commit

Permalink
Use DXGI_SWAP_CHAIN_DESC1 if available for additional scaling options. (
Browse files Browse the repository at this point in the history
  • Loading branch information
mtytel authored Nov 1, 2024
1 parent f534946 commit cc789e8
Showing 1 changed file with 29 additions and 38 deletions.
67 changes: 29 additions & 38 deletions src/dxgi.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand All @@ -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
Expand All @@ -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<IDXGISwapChain**>(_swapChain)
);
, &scfd
, NULL
, reinterpret_cast<IDXGISwapChain1**>(_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(
Expand Down

0 comments on commit cc789e8

Please sign in to comment.