Commit 40cd2afe authored by Shawn Gallea's avatar Shawn Gallea Committed by Commit Bot

Add CastExternalBeginFrameClient

Add CastExternalBeginFrameClient to eventually allow 4hz refresh rate on
audio-only cast devices

Bug: b/139299756
Test: Compile and run cast_shell
Change-Id: Ia2e1531a1035ed92ee61cee69dc24c491d6ca109
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1763435
Commit-Queue: Shawn Gallea <sagallea@google.com>
Reviewed-by: default avatarMichael Spang <spang@chromium.org>
Cr-Commit-Position: refs/heads/master@{#690098}
parent 5107b8b2
...@@ -45,6 +45,8 @@ cast_source_set("graphics") { ...@@ -45,6 +45,8 @@ cast_source_set("graphics") {
"accessibility/partial_magnification_controller.h", "accessibility/partial_magnification_controller.h",
"cast_display_util.cc", "cast_display_util.cc",
"cast_display_util.h", "cast_display_util.h",
"cast_external_begin_frame_client.cc",
"cast_external_begin_frame_client.h",
"cast_focus_client_aura.cc", "cast_focus_client_aura.cc",
"cast_focus_client_aura.h", "cast_focus_client_aura.h",
"cast_touch_event_gate.cc", "cast_touch_event_gate.cc",
...@@ -62,6 +64,7 @@ cast_source_set("graphics") { ...@@ -62,6 +64,7 @@ cast_source_set("graphics") {
] ]
deps += [ deps += [
"//components/viz/common",
"//ui/base/ime/init", "//ui/base/ime/init",
"//ui/events:gesture_detection", "//ui/events:gesture_detection",
"//ui/views", "//ui/views",
......
// Copyright 2019 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 "chromecast/graphics/cast_external_begin_frame_client.h"
#include "base/time/time.h"
#include "chromecast/graphics/cast_window_manager_aura.h"
namespace chromecast {
CastExternalBeginFrameClient::CastExternalBeginFrameClient(
CastWindowManagerAura* cast_window_manager_aura)
: cast_window_manager_aura_(cast_window_manager_aura),
sequence_number_(viz::BeginFrameArgs::kStartingFrameNumber),
source_id_(viz::BeginFrameArgs::kManualSourceId),
interval_(base::TimeDelta::FromMilliseconds(250)),
frame_in_flight_(false) {}
CastExternalBeginFrameClient::~CastExternalBeginFrameClient() {}
void CastExternalBeginFrameClient::OnDisplayDidFinishFrame(
const viz::BeginFrameAck& ack) {
if (ack.source_id == source_id_)
frame_in_flight_ = false;
}
void CastExternalBeginFrameClient::OnNeedsExternalBeginFrames(
bool needs_begin_frames) {
if (needs_begin_frames)
timer_.Start(FROM_HERE, interval_, this,
&CastExternalBeginFrameClient::IssueExternalBeginFrame);
else
timer_.Stop();
}
void CastExternalBeginFrameClient::IssueExternalBeginFrame() {
if (!frame_in_flight_) {
viz::BeginFrameArgs args = viz::BeginFrameArgs::Create(
BEGINFRAME_FROM_HERE, source_id_, sequence_number_,
base::TimeTicks::Now(), base::TimeTicks::Now() + interval_, interval_,
viz::BeginFrameArgs::NORMAL);
ui::Compositor* compositor =
cast_window_manager_aura_->window_tree_host()->compositor();
compositor->context_factory_private()->IssueExternalBeginFrame(compositor,
args);
sequence_number_++;
frame_in_flight_ = true;
}
}
} // namespace chromecast
// Copyright 2019 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.
#ifndef CHROMECAST_GRAPHICS_CAST_EXTERNAL_BEGIN_FRAME_CLIENT_H_
#define CHROMECAST_GRAPHICS_CAST_EXTERNAL_BEGIN_FRAME_CLIENT_H_
#include "ui/compositor/external_begin_frame_client.h"
#include "base/time/time.h"
#include "base/timer/timer.h"
namespace chromecast {
class CastWindowManagerAura;
class CastExternalBeginFrameClient : public ui::ExternalBeginFrameClient {
public:
CastExternalBeginFrameClient(CastWindowManagerAura* cast_window_manager_aura);
~CastExternalBeginFrameClient() override;
// ui::ExternalBeginFrameClient implementation:
void OnDisplayDidFinishFrame(const viz::BeginFrameAck& ack) override;
void OnNeedsExternalBeginFrames(bool needs_begin_frames) override;
private:
void IssueExternalBeginFrame();
CastWindowManagerAura* cast_window_manager_aura_;
uint64_t sequence_number_;
const uint64_t source_id_;
const base::TimeDelta interval_;
bool frame_in_flight_;
base::RepeatingTimer timer_;
DISALLOW_COPY_AND_ASSIGN(CastExternalBeginFrameClient);
};
} // namespace chromecast
#endif // CHROMECAST_GRAPHICS_CAST_EXTERNAL_BEGIN_FRAME_CLIENT_H_
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment