blob: bc762f8bec19fc2fd815fa9a64238e6db3d8963a [file] [log] [blame]
// Copyright 2020 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 "third_party/blink/renderer/platform/widget/compositing/queue_report_time_swap_promise.h"
#if defined(OS_ANDROID)
#include "third_party/blink/public/platform/platform.h"
#endif
namespace blink {
QueueReportTimeSwapPromise::QueueReportTimeSwapPromise(
int source_frame_number,
DrainCallback drain_callback,
base::OnceClosure swap_callback,
scoped_refptr<base::SingleThreadTaskRunner> compositor_task_runner)
: source_frame_number_(source_frame_number),
drain_callback_(std::move(drain_callback)),
swap_callback_(std::move(swap_callback)),
#if defined(OS_ANDROID)
call_swap_on_activate_(
Platform::Current()
->IsSynchronousCompositingEnabledForAndroidWebView()),
#endif
compositor_task_runner_(std::move(compositor_task_runner)) {
}
QueueReportTimeSwapPromise::~QueueReportTimeSwapPromise() {
if (compositor_task_runner_ && (drain_callback_ || swap_callback_)) {
DCHECK(!compositor_task_runner_->BelongsToCurrentThread());
compositor_task_runner_->PostTask(
FROM_HERE,
base::BindOnce([](DrainCallback, base::OnceClosure) {},
std::move(drain_callback_), std::move(swap_callback_)));
}
}
void QueueReportTimeSwapPromise::WillSwap(
viz::CompositorFrameMetadata* metadata) {
DCHECK_GT(metadata->frame_token, 0u);
}
void QueueReportTimeSwapPromise::DidSwap() {
if (swap_callback_)
std::move(swap_callback_).Run();
}
cc::SwapPromise::DidNotSwapAction QueueReportTimeSwapPromise::DidNotSwap(
DidNotSwapReason reason) {
if (reason == cc::SwapPromise::SWAP_FAILS ||
reason == cc::SwapPromise::COMMIT_NO_UPDATE) {
if (drain_callback_)
std::move(drain_callback_).Run(source_frame_number_);
if (swap_callback_)
std::move(swap_callback_).Run();
} else if (reason == cc::SwapPromise::COMMIT_FAILS) {
return DidNotSwapAction::KEEP_ACTIVE;
}
return DidNotSwapAction::BREAK_PROMISE;
}
void QueueReportTimeSwapPromise::DidActivate() {
if (drain_callback_)
std::move(drain_callback_).Run(source_frame_number_);
#if defined(OS_ANDROID)
if (call_swap_on_activate_ && swap_callback_)
std::move(swap_callback_).Run();
#endif
}
} // namespace blink