blob: 5daa87a0c6156e95e77171d97be5934766074216 [file] [log] [blame]
// Copyright 2018 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/vr/base_scheduler_delegate.h"
#include "chrome/browser/vr/scheduler_ui_interface.h"
namespace vr {
BaseSchedulerDelegate::BaseSchedulerDelegate(SchedulerUiInterface* ui,
bool start_in_webxr_mode,
int webxr_spinner_timeout,
int webxr_initial_frame_timeout)
: ui_(ui),
webxr_mode_(start_in_webxr_mode),
webxr_spinner_timeout_seconds_(webxr_spinner_timeout),
webxr_initial_frame_timeout_seconds_(webxr_initial_frame_timeout),
task_runner_(base::ThreadTaskRunnerHandle::Get()) {}
BaseSchedulerDelegate::~BaseSchedulerDelegate() = default;
void BaseSchedulerDelegate::OnExitPresent() {
CancelWebXrFrameTimeout();
}
void BaseSchedulerDelegate::SetWebXrMode(bool enabled) {
if (webxr_mode_ == enabled)
return;
webxr_mode_ = enabled;
if (webxr_mode_)
ResetWebXrFramesReceived();
else
CancelWebXrFrameTimeout();
}
void BaseSchedulerDelegate::ScheduleWebXrFrameTimeout() {
DCHECK(ui_);
webxr_spinner_timeout_closure_.Reset(base::BindOnce(
&SchedulerUiInterface::OnWebXrTimeoutImminent, base::Unretained(ui_)));
task_runner_->PostDelayedTask(
FROM_HERE, webxr_spinner_timeout_closure_.callback(),
base::TimeDelta::FromSeconds(webxr_spinner_timeout_seconds_));
webxr_frame_timeout_closure_.Reset(base::BindOnce(
&SchedulerUiInterface::OnWebXrTimedOut, base::Unretained(ui_)));
task_runner_->PostDelayedTask(
FROM_HERE, webxr_frame_timeout_closure_.callback(),
base::TimeDelta::FromSeconds(webxr_initial_frame_timeout_seconds_));
}
void BaseSchedulerDelegate::CancelWebXrFrameTimeout() {
if (!webxr_spinner_timeout_closure_.IsCancelled())
webxr_spinner_timeout_closure_.Cancel();
if (!webxr_frame_timeout_closure_.IsCancelled())
webxr_frame_timeout_closure_.Cancel();
}
void BaseSchedulerDelegate::OnNewWebXrFrame() {
ui_->OnWebXrFrameAvailable();
if (webxr_mode_) {
TickWebXrFramesReceived();
webxr_fps_meter_.AddFrame(base::TimeTicks::Now());
TRACE_COUNTER1("gpu", "WebVR FPS", webxr_fps_meter_.GetFPS());
}
CancelWebXrFrameTimeout();
}
} // namespace vr