blob: 2956ea8e5f4110ff06b39b2a095cd392b9986f49 [file]
// Copyright 2024 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "ui/gl/vsync_thread_win_dcomp.h"
#include "base/time/time.h"
#include "base/trace_event/trace_event.h"
#include "ui/gl/direct_composition_support.h"
namespace gl {
constexpr base::TimeDelta kMinimumFallbackTimeout = base::Milliseconds(100);
VSyncThreadWinDComp::VSyncThreadWinDComp()
: VSyncThreadWin(), vsync_provider_() {}
VSyncThreadWinDComp::~VSyncThreadWinDComp() = default;
base::TimeDelta VSyncThreadWinDComp::GetVsyncInterval() {
base::TimeTicks vsync_timebase;
base::TimeDelta vsync_interval;
// Use the compositor clock to determine vsync interval, disabled by default
const bool get_vsync_succeeded =
vsync_provider_.GetVSyncParametersIfAvailable(&vsync_timebase,
&vsync_interval);
DCHECK(get_vsync_succeeded);
return vsync_interval;
}
gfx::VSyncProvider* VSyncThreadWinDComp::vsync_provider() {
return &vsync_provider_;
}
bool VSyncThreadWinDComp::WaitForVSyncImpl(base::TimeDelta* vsync_interval) {
// DCompositionWaitForCompositorClock WILL hang if the adapter becomes
// disconnected. No monitor should be slower than 100ms. The API will return
// WAIT_TIMEOUT in the timeout case. When the new adapter comes online, new
// calls to DCompositionWaitForCompositorClock will latch to the new adapter
// and go back to tracking VBlank.   DCompositionWaitForCompositorClock
// returns an error on desktop occlusion and returns early.
DWORD wait_result = gl::DCompositionWaitForCompositorClock(
0, nullptr, kMinimumFallbackTimeout.InMilliseconds());
if (wait_result != WAIT_OBJECT_0) {
TRACE_EVENT("gpu", "WaitForVSyncImpl", "wait result", wait_result);
*vsync_interval = kMinimumFallbackTimeout;
return false;
}
*vsync_interval = GetVsyncInterval();
return true;
}
} // namespace gl