diff options
Diffstat (limited to 'chromium/ui/gl/vsync_thread_win.cc')
-rw-r--r-- | chromium/ui/gl/vsync_thread_win.cc | 43 |
1 files changed, 18 insertions, 25 deletions
diff --git a/chromium/ui/gl/vsync_thread_win.cc b/chromium/ui/gl/vsync_thread_win.cc index 9502606f05d..ec027e3339d 100644 --- a/chromium/ui/gl/vsync_thread_win.cc +++ b/chromium/ui/gl/vsync_thread_win.cc @@ -5,6 +5,7 @@ #include "ui/gl/vsync_thread_win.h" #include "base/bind.h" +#include "base/logging.h" #include "base/memory/singleton.h" #include "base/stl_util.h" #include "ui/gl/gl_angle_util_win.h" @@ -54,6 +55,7 @@ VSyncThreadWin* VSyncThreadWin::GetInstance() { VSyncThreadWin::VSyncThreadWin() : vsync_thread_("GpuVSyncThread"), + vsync_provider_(gfx::kNullAcceleratedWidget), d3d11_device_(QueryD3D11DeviceObjectFromANGLE()) { DCHECK(d3d11_device_); base::Thread::Options options; @@ -86,32 +88,23 @@ void VSyncThreadWin::RemoveObserver(VSyncObserver* obs) { } void VSyncThreadWin::WaitForVSync() { + base::TimeTicks vsync_phase; + base::TimeDelta vsync_interval; + const bool get_vsync_params_succeeded = + vsync_provider_.GetVSyncParametersIfAvailable(&vsync_phase, + &vsync_interval); + DCHECK(get_vsync_params_succeeded); + // From Raymond Chen's blog "How do I get a handle to the primary monitor?" // https://devblogs.microsoft.com/oldnewthing/20141106-00/?p=43683 - HMONITOR monitor = MonitorFromWindow(nullptr, MONITOR_DEFAULTTOPRIMARY); + const HMONITOR monitor = MonitorFromWindow(nullptr, MONITOR_DEFAULTTOPRIMARY); if (primary_monitor_ != monitor) { primary_monitor_ = monitor; primary_output_ = DXGIOutputFromMonitor(monitor, d3d11_device_); } - base::TimeDelta interval = base::TimeDelta::FromSecondsD(1.0 / 60); - - MONITORINFOEX monitor_info = {}; - monitor_info.cbSize = sizeof(MONITORINFOEX); - if (monitor && GetMonitorInfo(monitor, &monitor_info)) { - DEVMODE display_info = {}; - display_info.dmSize = sizeof(DEVMODE); - display_info.dmDriverExtra = 0; - if (EnumDisplaySettings(monitor_info.szDevice, ENUM_CURRENT_SETTINGS, - &display_info) && - display_info.dmDisplayFrequency > 1) { - interval = - base::TimeDelta::FromSecondsD(1.0 / display_info.dmDisplayFrequency); - } - } - - base::TimeTicks wait_for_vblank_start_time = base::TimeTicks::Now(); - bool wait_for_vblank_succeeded = + const base::TimeTicks wait_for_vblank_start_time = base::TimeTicks::Now(); + const bool wait_for_vblank_succeeded = primary_output_ && SUCCEEDED(primary_output_->WaitForVBlank()); // WaitForVBlank returns very early instead of waiting until vblank when the @@ -119,13 +112,13 @@ void VSyncThreadWin::WaitForVSync() { // WaitForVBlank and fallback to Sleep() if it returns before that. This // could happen during normal operation for the first call after the vsync // thread becomes non-idle, but it shouldn't happen often. - const auto kVBlankIntervalThreshold = base::TimeDelta::FromMilliseconds(1); - base::TimeDelta wait_for_vblank_elapsed_time = + constexpr auto kVBlankIntervalThreshold = + base::TimeDelta::FromMilliseconds(1); + const base::TimeDelta wait_for_vblank_elapsed_time = base::TimeTicks::Now() - wait_for_vblank_start_time; - if (!wait_for_vblank_succeeded || wait_for_vblank_elapsed_time < kVBlankIntervalThreshold) { - Sleep(static_cast<DWORD>(interval.InMillisecondsRoundedUp())); + Sleep(static_cast<DWORD>(vsync_interval.InMillisecondsRoundedUp())); } base::AutoLock auto_lock(lock_); @@ -133,9 +126,9 @@ void VSyncThreadWin::WaitForVSync() { vsync_thread_.task_runner()->PostTask( FROM_HERE, base::BindOnce(&VSyncThreadWin::WaitForVSync, base::Unretained(this))); - base::TimeTicks vsync_time = base::TimeTicks::Now(); + const base::TimeTicks vsync_time = base::TimeTicks::Now(); for (auto* obs : observers_) - obs->OnVSync(vsync_time, interval); + obs->OnVSync(vsync_time, vsync_interval); } else { is_idle_ = true; } |