Looking at both the on screen fps in debug mode and the info screen from the AVR it is still 4K60. I'll try and take some screenshots.
2022-02-03 09:53:57.653 T:4592 INFO <general>: [WHITELIST] Searching the whitelist for: width: 3840, height: 2160, fps: 23.976, 3D: false
2022-02-03 09:53:57.653 T:4592 DEBUG <general>: [WHITELIST] Searching for an exact resolution with an exact refresh rate
2022-02-03 09:53:57.653 T:4592 DEBUG <general>: [WHITELIST] Matched an exact resolution with an exact refresh rate Generic PnP Monitor #1: 3840x2160 @ 23.98Hz (105)
2022-02-03 09:53:57.654 T:4592 INFO <general>: Display resolution ADJUST : Generic PnP Monitor #1: 3840x2160 @ 23.98Hz (105) (weight: 0.000)
2022-02-03 09:53:57.668 T:12252 DEBUG <general>: CWinSystemWin32::SetFullScreen: (true fullscreen) with size 3840x2160, refresh 23.976023
2022-02-03 09:53:57.668 T:12252 DEBUG <general>: DX:
eviceResources::ReleaseBackBuffer: release buffers.
2022-02-03 09:53:57.668 T:12252 DEBUG <general>: CWinSystemWin32::AdjustWindow: adjusting window if required.
2022-02-03 09:53:57.669 T:12252 DEBUG <general>: DX:
eviceResources::SetFullScreen: switching from (3840 x 2160) to fullscreen (3840 x 2160)
2022-02-03 09:53:57.669 T:12252 DEBUG <general>: DX:
eviceResources::SetFullScreen: changing display mode to
[email protected]
2022-02-03 09:53:57.669 T:12252 DEBUG <general>: DX:
eviceResources::SetFullScreen: fixup fullscreen mode before switching resolution
2022-02-03 09:53:57.669 T:12252 DEBUG <general>: DX:
eviceResources::SetFullScreen: switching to fullscreen
2022-02-03 09:53:57.669 T:12252 DEBUG <general>: DX:
eviceResources::ResizeBuffers: resize buffers.
2022-02-03 09:53:57.669 T:12252 DEBUG <general>: CWinSystemWin32DX::FixRefreshRateIfNecessary: refreshRate: 60.0000, desired: 23.9760, deviation: 0.60040, fixRequired: no, 1
The fixRequired line seems to correspond with this code:
void CWinSystemWin32DX::FixRefreshRateIfNecessary(const D3D10DDIARG_CREATERESOURCE* pResource) const
{
if (pResource && pResource->pPrimaryDesc)
{
float refreshRate = RATIONAL_TO_FLOAT(pResource->pPrimaryDesc->ModeDesc.RefreshRate);
if (refreshRate > 10.0f && refreshRate < 300.0f)
{
// interlaced
if (pResource->pPrimaryDesc->ModeDesc.ScanlineOrdering > DXGI_DDI_MODE_SCANLINE_ORDER_PROGRESSIVE)
refreshRate /= 2;
uint32_t refreshNum, refreshDen;
DX::GetRefreshRatio(static_cast<uint32_t>(floor(m_fRefreshRate)), &refreshNum, &refreshDen);
float diff = fabs(refreshRate - static_cast<float>(refreshNum) / static_cast<float>(refreshDen)) / refreshRate;
CLog::LogF(LOGDEBUG,
"refreshRate: {:0.4f}, desired: {:0.4f}, deviation: {:.5f}, fixRequired: {}, {}",
refreshRate, m_fRefreshRate, diff, (diff > 0.0005 && diff < 0.1) ? "yes" : "no",
pResource->pPrimaryDesc->Flags);
if (diff > 0.0005 && diff < 0.1)
{
pResource->pPrimaryDesc->ModeDesc.RefreshRate.Numerator = refreshNum;
pResource->pPrimaryDesc->ModeDesc.RefreshRate.Denominator = refreshDen;
if (pResource->pPrimaryDesc->ModeDesc.ScanlineOrdering > DXGI_DDI_MODE_SCANLINE_ORDER_PROGRESSIVE)
pResource->pPrimaryDesc->ModeDesc.RefreshRate.Numerator *= 2;
CLog::LogF(LOGDEBUG, "refreshRate fix applied -> {:0.3f}",
RATIONAL_TO_FLOAT(pResource->pPrimaryDesc->ModeDesc.RefreshRate));
}
}
}
}
I think I understand what it does - find the refresh rate as a fraction and compare to the existing one (ignoring a small difference as sometimes 60Hz is reported as say 60.06Hz) - but I can't see why there is an upper limit and the diff here prevents the code running.
BUT when I change diff < 0.1 to diff <1 the code runs but the refresh rate on the screen still does not change!
Thanks for looking
Andy