summaryrefslogtreecommitdiff
path: root/chromium/ui/gl/vsync_thread_win.cc
diff options
context:
space:
mode:
authorAllan Sandfeld Jensen <allan.jensen@qt.io>2020-10-12 14:27:29 +0200
committerAllan Sandfeld Jensen <allan.jensen@qt.io>2020-10-13 09:35:20 +0000
commitc30a6232df03e1efbd9f3b226777b07e087a1122 (patch)
treee992f45784689f373bcc38d1b79a239ebe17ee23 /chromium/ui/gl/vsync_thread_win.cc
parent7b5b123ac58f58ffde0f4f6e488bcd09aa4decd3 (diff)
downloadqtwebengine-chromium-85-based.tar.gz
BASELINE: Update Chromium to 85.0.4183.14085-based
Change-Id: Iaa42f4680837c57725b1344f108c0196741f6057 Reviewed-by: Allan Sandfeld Jensen <allan.jensen@qt.io>
Diffstat (limited to 'chromium/ui/gl/vsync_thread_win.cc')
-rw-r--r--chromium/ui/gl/vsync_thread_win.cc43
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;
}