blob: 00d7015aed568526a060e825badd522e1b120d56 [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 "components/viz/service/frame_sinks/external_begin_frame_source_mojo.h"
namespace viz {
ExternalBeginFrameSourceMojo::ExternalBeginFrameSourceMojo(
mojom::ExternalBeginFrameControllerAssociatedRequest controller_request,
mojom::ExternalBeginFrameControllerClientPtr client,
uint32_t restart_id)
: ExternalBeginFrameSource(this, restart_id),
binding_(this, std::move(controller_request)),
client_(std::move(client)) {}
ExternalBeginFrameSourceMojo::~ExternalBeginFrameSourceMojo() {
DCHECK(!display_);
}
void ExternalBeginFrameSourceMojo::IssueExternalBeginFrame(
const BeginFrameArgs& args) {
OnBeginFrame(args);
// Ensure that Display will receive the BeginFrame (as a missed one), even
// if it doesn't currently need it. This way, we ensure that
// OnDisplayDidFinishFrame will be called for this BeginFrame.
DCHECK(display_);
display_->SetNeedsOneBeginFrame();
}
void ExternalBeginFrameSourceMojo::OnNeedsBeginFrames(bool needs_begin_frames) {
needs_begin_frames_ = needs_begin_frames;
client_->OnNeedsBeginFrames(needs_begin_frames_);
}
void ExternalBeginFrameSourceMojo::OnDisplayDidFinishFrame(
const BeginFrameAck& ack) {
client_->OnDisplayDidFinishFrame(ack);
}
void ExternalBeginFrameSourceMojo::OnDisplayDestroyed() {
// As part of destruction, we are automatically removed as a display
// observer. No need to call RemoveObserver.
display_ = nullptr;
}
void ExternalBeginFrameSourceMojo::SetDisplay(Display* display) {
if (display_)
display_->RemoveObserver(this);
display_ = display;
if (display_)
display_->AddObserver(this);
}
} // namespace viz