Skip to content

Commit 8643ed3

Browse files
mtytelalesambits
authored andcommitted
Use DXGI_SWAP_CHAIN_DESC1 if available for additional scaling options. (bkaradzic#3370)
1 parent b299405 commit 8643ed3

File tree

1 file changed

+29
-38
lines changed

1 file changed

+29
-38
lines changed

src/dxgi.cpp

Lines changed: 29 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -469,8 +469,20 @@ namespace bgfx
469469
{
470470
HRESULT hr = S_OK;
471471

472-
uint32_t scdFlags = _scd.flags;
473-
472+
DXGI_SWAP_CHAIN_DESC1 scd;
473+
scd.Width = _scd.width;
474+
scd.Height = _scd.height;
475+
scd.Format = _scd.format;
476+
scd.Stereo = _scd.stereo;
477+
scd.SampleDesc.Count = 1;
478+
scd.SampleDesc.Quality = 0;
479+
scd.BufferUsage = _scd.bufferUsage;
480+
scd.BufferCount = _scd.bufferCount;
481+
scd.Scaling = _scd.scaling;
482+
scd.SwapEffect = _scd.swapEffect;
483+
scd.AlphaMode = _scd.alphaMode;
484+
scd.Flags = _scd.flags;
485+
474486
#if BX_PLATFORM_LINUX || BX_PLATFORM_WINDOWS
475487
IDXGIFactory5* factory5;
476488
hr = m_factory->QueryInterface(IID_IDXGIFactory5, (void**)&factory5);
@@ -483,8 +495,8 @@ namespace bgfx
483495
hr = factory5->CheckFeatureSupport(DXGI_FEATURE_PRESENT_ALLOW_TEARING, &allowTearing, sizeof(allowTearing) );
484496
BX_TRACE("Allow tearing is %ssupported.", allowTearing ? "" : "not ");
485497

486-
scdFlags |= allowTearing ? DXGI_SWAP_CHAIN_FLAG_ALLOW_TEARING : 0;
487-
scdFlags |= false
498+
scd.Flags |= allowTearing ? DXGI_SWAP_CHAIN_FLAG_ALLOW_TEARING : 0;
499+
scd.Flags |= false
488500
|| _scd.swapEffect == DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL
489501
|| _scd.swapEffect == DXGI_SWAP_EFFECT_FLIP_DISCARD
490502
? 0 // DXGI_SWAP_CHAIN_FLAG_FRAME_LATENCY_WAITABLE_OBJECT
@@ -496,43 +508,22 @@ namespace bgfx
496508
DX_RELEASE_I(factory5);
497509
}
498510

499-
DXGI_SWAP_CHAIN_DESC scd;
500-
scd.BufferDesc.Width = _scd.width;
501-
scd.BufferDesc.Height = _scd.height;
502-
scd.BufferDesc.RefreshRate.Numerator = 1;
503-
scd.BufferDesc.RefreshRate.Denominator = 60;
504-
scd.BufferDesc.Format = _scd.format;
505-
scd.BufferDesc.ScanlineOrdering = DXGI_MODE_SCANLINE_ORDER_UNSPECIFIED;
506-
scd.BufferDesc.Scaling = DXGI_MODE_SCALING_UNSPECIFIED;
507-
scd.SampleDesc.Count = 1;
508-
scd.SampleDesc.Quality = 0;
509-
scd.BufferUsage = _scd.bufferUsage;
510-
scd.BufferCount = _scd.bufferCount;
511-
scd.OutputWindow = (HWND)_scd.nwh;
512-
scd.Windowed = _scd.windowed;
513-
scd.SwapEffect = _scd.swapEffect;
514-
scd.Flags = scdFlags;
515-
516-
hr = m_factory->CreateSwapChain(
511+
DXGI_SWAP_CHAIN_FULLSCREEN_DESC scfd;
512+
scfd.RefreshRate.Numerator = 1;
513+
scfd.RefreshRate.Denominator = 60;
514+
scfd.ScanlineOrdering = DXGI_MODE_SCANLINE_ORDER_UNSPECIFIED;
515+
scfd.Scaling = DXGI_MODE_SCALING_UNSPECIFIED;
516+
scfd.Windowed = _scd.windowed;
517+
518+
hr = m_factory->CreateSwapChainForHwnd(
517519
_device
520+
, (HWND)_scd.nwh
518521
, &scd
519-
, reinterpret_cast<IDXGISwapChain**>(_swapChain)
520-
);
522+
, &scfd
523+
, NULL
524+
, reinterpret_cast<IDXGISwapChain1**>(_swapChain)
525+
);
521526
#else
522-
DXGI_SWAP_CHAIN_DESC1 scd;
523-
scd.Width = _scd.width;
524-
scd.Height = _scd.height;
525-
scd.Format = _scd.format;
526-
scd.Stereo = _scd.stereo;
527-
scd.SampleDesc.Count = 1;
528-
scd.SampleDesc.Quality = 0;
529-
scd.BufferUsage = _scd.bufferUsage;
530-
scd.BufferCount = _scd.bufferCount;
531-
scd.Scaling = _scd.scaling;
532-
scd.SwapEffect = _scd.swapEffect;
533-
scd.AlphaMode = _scd.alphaMode;
534-
scd.Flags = scdFlags;
535-
536527
if (NULL == _scd.ndt)
537528
{
538529
hr = m_factory->CreateSwapChainForCoreWindow(

0 commit comments

Comments
 (0)