Index: ui/gl/vsync_provider_win.cc |
diff --git a/ui/gl/vsync_provider_win.cc b/ui/gl/vsync_provider_win.cc |
index 7a400e2c2407b4a9680107f7af8aa55496041f54..8025ca9059a8fcdffe3f305442b6d35b9c28da26 100644 |
--- a/ui/gl/vsync_provider_win.cc |
+++ b/ui/gl/vsync_provider_win.cc |
@@ -8,15 +8,10 @@ |
#include "base/logging.h" |
#include "base/trace_event/trace_event.h" |
-#include "base/win/windows_version.h" |
#include "ui/gfx/native_widget_types.h" |
namespace gl { |
-namespace { |
-bool g_use_dwm_vsync; |
-} // namespace |
- |
VSyncProviderWin::VSyncProviderWin(gfx::AcceleratedWidget window) |
: window_(window) { |
} |
@@ -29,12 +24,9 @@ void VSyncProviderWin::InitializeOneOff() { |
if (initialized) |
return; |
initialized = true; |
- g_use_dwm_vsync = (base::win::GetVersion() >= base::win::VERSION_WIN7); |
- if (g_use_dwm_vsync) { |
- // Prewarm sandbox |
- ::LoadLibrary(L"dwmapi.dll"); |
- } |
+ // Prewarm sandbox |
+ ::LoadLibrary(L"dwmapi.dll"); |
} |
void VSyncProviderWin::GetVSyncParameters(const UpdateVSyncCallback& callback) { |
@@ -42,61 +34,54 @@ void VSyncProviderWin::GetVSyncParameters(const UpdateVSyncCallback& callback) { |
base::TimeTicks timebase; |
base::TimeDelta interval; |
- bool dwm_active = false; |
// Query the DWM timing info first if available. This will provide the most |
// precise values. |
- if (g_use_dwm_vsync) { |
- DWM_TIMING_INFO timing_info; |
- timing_info.cbSize = sizeof(timing_info); |
- HRESULT result = DwmGetCompositionTimingInfo(NULL, &timing_info); |
- if (result == S_OK) { |
- dwm_active = true; |
+ DWM_TIMING_INFO timing_info; |
+ timing_info.cbSize = sizeof(timing_info); |
+ HRESULT result = DwmGetCompositionTimingInfo(NULL, &timing_info); |
+ if (result == S_OK) { |
+ // Calculate an interval value using the rateRefresh numerator and |
+ // denominator. |
+ base::TimeDelta rate_interval; |
+ if (timing_info.rateRefresh.uiDenominator > 0 && |
+ timing_info.rateRefresh.uiNumerator > 0) { |
+ // Swap the numerator/denominator to convert frequency to period. |
+ rate_interval = base::TimeDelta::FromMicroseconds( |
+ timing_info.rateRefresh.uiDenominator * |
+ base::Time::kMicrosecondsPerSecond / |
+ timing_info.rateRefresh.uiNumerator); |
+ } |
- // Calculate an interval value using the rateRefresh numerator and |
- // denominator. |
- base::TimeDelta rate_interval; |
- if (timing_info.rateRefresh.uiDenominator > 0 && |
- timing_info.rateRefresh.uiNumerator > 0) { |
- // Swap the numerator/denominator to convert frequency to period. |
- rate_interval = base::TimeDelta::FromMicroseconds( |
- timing_info.rateRefresh.uiDenominator * |
- base::Time::kMicrosecondsPerSecond / |
- timing_info.rateRefresh.uiNumerator); |
+ if (base::TimeTicks::IsHighResolution()) { |
+ // qpcRefreshPeriod is very accurate but noisy, and must be used with |
+ // a high resolution timebase to avoid frequently missing Vsync. |
+ timebase = base::TimeTicks::FromQPCValue( |
+ static_cast<LONGLONG>(timing_info.qpcVBlank)); |
+ interval = base::TimeDelta::FromQPCValue( |
+ static_cast<LONGLONG>(timing_info.qpcRefreshPeriod)); |
+ // Check for interval values that are impossibly low. A 29 microsecond |
+ // interval was seen (from a qpcRefreshPeriod of 60). |
+ if (interval < base::TimeDelta::FromMilliseconds(1)) { |
+ interval = rate_interval; |
} |
- |
- if (base::TimeTicks::IsHighResolution()) { |
- // qpcRefreshPeriod is very accurate but noisy, and must be used with |
- // a high resolution timebase to avoid frequently missing Vsync. |
- timebase = base::TimeTicks::FromQPCValue( |
- static_cast<LONGLONG>(timing_info.qpcVBlank)); |
- interval = base::TimeDelta::FromQPCValue( |
- static_cast<LONGLONG>(timing_info.qpcRefreshPeriod)); |
- // Check for interval values that are impossibly low. A 29 microsecond |
- // interval was seen (from a qpcRefreshPeriod of 60). |
- if (interval < base::TimeDelta::FromMilliseconds(1)) { |
- interval = rate_interval; |
- } |
- // Check for the qpcRefreshPeriod interval being improbably small |
- // compared to the rateRefresh calculated interval, as another |
- // attempt at detecting driver bugs. |
- if (!rate_interval.is_zero() && interval < rate_interval / 2) { |
- interval = rate_interval; |
- } |
- } else { |
- // If FrameTime is not high resolution, we do not want to translate |
- // the QPC value provided by DWM into the low-resolution timebase, |
- // which would be error prone and jittery. As a fallback, we assume |
- // the timebase is zero and use rateRefresh, which may be rounded but |
- // isn't noisy like qpcRefreshPeriod, instead. The fact that we don't |
- // have a timebase here may lead to brief periods of jank when our |
- // scheduling becomes offset from the hardware vsync. |
+ // Check for the qpcRefreshPeriod interval being improbably small |
+ // compared to the rateRefresh calculated interval, as another |
+ // attempt at detecting driver bugs. |
+ if (!rate_interval.is_zero() && interval < rate_interval / 2) { |
interval = rate_interval; |
} |
+ } else { |
+ // If FrameTime is not high resolution, we do not want to translate |
+ // the QPC value provided by DWM into the low-resolution timebase, |
+ // which would be error prone and jittery. As a fallback, we assume |
+ // the timebase is zero and use rateRefresh, which may be rounded but |
+ // isn't noisy like qpcRefreshPeriod, instead. The fact that we don't |
+ // have a timebase here may lead to brief periods of jank when our |
+ // scheduling becomes offset from the hardware vsync. |
+ interval = rate_interval; |
} |
- } |
- |
- if (!dwm_active) { |
+ } else { |
// When DWM compositing is active all displays are normalized to the |
// refresh rate of the primary display, and won't composite any faster. |
// If DWM compositing is disabled, though, we can use the refresh rates |