Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(166)

Unified Diff: content/browser/android/in_process/synchronous_compositor_impl.cc

Issue 817603002: cc: Make scheduling be driven by vsync for android webview. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Small fix after rebase. Created 5 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: content/browser/android/in_process/synchronous_compositor_impl.cc
diff --git a/content/browser/android/in_process/synchronous_compositor_impl.cc b/content/browser/android/in_process/synchronous_compositor_impl.cc
index 44d686cb96c9c3435cfb042136a096f9d932376e..fc920dfea5d4db742b4e3fc71db2d61f88d29244 100644
--- a/content/browser/android/in_process/synchronous_compositor_impl.cc
+++ b/content/browser/android/in_process/synchronous_compositor_impl.cc
@@ -74,6 +74,8 @@ SynchronousCompositorImpl::SynchronousCompositorImpl(WebContents* contents)
routing_id_(contents->GetRoutingID()),
input_handler_(NULL),
invoking_composite_(false),
+ is_active_(false),
+ renderer_needs_begin_frames_(false),
weak_ptr_factory_(this) {
DCHECK(contents);
DCHECK_NE(routing_id_, MSG_ROUTING_NONE);
@@ -120,11 +122,14 @@ void SynchronousCompositorImpl::DidInitializeRendererObjects(
begin_frame_source_ = begin_frame_source;
begin_frame_source_->SetCompositor(this);
- output_surface_->SetBeginFrameSource(begin_frame_source_);
+ output_surface_->SetCompositor(this);
+
output_surface_->SetTreeActivationCallback(
base::Bind(&SynchronousCompositorImpl::DidActivatePendingTree,
weak_ptr_factory_.GetWeakPtr()));
- NeedsBeginFramesChanged();
+
+ OnNeedsBeginFramesChange(begin_frame_source_->NeedsBeginFrames());
+
compositor_client_->DidInitializeCompositor(this);
}
@@ -133,7 +138,7 @@ void SynchronousCompositorImpl::DidDestroyRendererObjects() {
DCHECK(begin_frame_source_);
begin_frame_source_->SetCompositor(nullptr);
- output_surface_->SetBeginFrameSource(nullptr);
+ output_surface_->SetCompositor(nullptr);
if (compositor_client_)
compositor_client_->DidDestroyCompositor(this);
compositor_client_ = nullptr;
@@ -187,6 +192,7 @@ scoped_ptr<cc::CompositorFrame> SynchronousCompositorImpl::DemandDrawHw(
base::AutoReset<bool> invoking_composite_resetter(&invoking_composite_,
true);
+
scoped_ptr<cc::CompositorFrame> frame =
output_surface_->DemandDrawHw(surface_size,
transform,
@@ -194,12 +200,10 @@ scoped_ptr<cc::CompositorFrame> SynchronousCompositorImpl::DemandDrawHw(
clip,
viewport_rect_for_tile_priority,
transform_for_tile_priority);
+
if (frame.get())
UpdateFrameMetaData(frame->metadata);
- compositor_client_->SetContinuousInvalidate(
- begin_frame_source_->NeedsBeginFrames());
-
return frame.Pass();
}
@@ -218,14 +222,13 @@ bool SynchronousCompositorImpl::DemandDrawSw(SkCanvas* canvas) {
base::AutoReset<bool> invoking_composite_resetter(&invoking_composite_,
true);
+
scoped_ptr<cc::CompositorFrame> frame =
output_surface_->DemandDrawSw(canvas);
+
if (frame.get())
UpdateFrameMetaData(frame->metadata);
- compositor_client_->SetContinuousInvalidate(
- begin_frame_source_->NeedsBeginFrames());
-
return !!frame.get();
}
@@ -245,11 +248,42 @@ void SynchronousCompositorImpl::SetMemoryPolicy(size_t bytes_limit) {
output_surface_->SetMemoryPolicy(bytes_limit);
}
+void SynchronousCompositorImpl::PostInvalidate() {
+ DCHECK(CalledOnValidThread());
+ DCHECK(compositor_client_);
+ compositor_client_->PostInvalidate();
+}
+
void SynchronousCompositorImpl::DidChangeRootLayerScrollOffset() {
if (input_handler_)
input_handler_->OnRootLayerDelegatedScrollOffsetChanged();
}
+void SynchronousCompositorImpl::SetIsActive(bool is_active) {
+ TRACE_EVENT1("cc", "SynchronousCompositorImpl::SetIsActive", "is_active",
+ is_active);
+ is_active_ = is_active;
+ UpdateNeedsBeginFrames();
+}
+
+void SynchronousCompositorImpl::OnNeedsBeginFramesChange(
+ bool needs_begin_frames) {
+ renderer_needs_begin_frames_ = needs_begin_frames;
+ UpdateNeedsBeginFrames();
+}
+
+void SynchronousCompositorImpl::SendBeginFrame(const cc::BeginFrameArgs& args) {
+ if (begin_frame_source_)
+ begin_frame_source_->SendBeginFrame(args);
+}
+
+void SynchronousCompositorImpl::UpdateNeedsBeginFrames() {
+ RenderWidgetHostViewAndroid* rwhv = static_cast<RenderWidgetHostViewAndroid*>(
+ contents_->GetRenderWidgetHostView());
+ if (rwhv)
+ rwhv->OnSetNeedsBeginFrames(is_active_ && renderer_needs_begin_frames_);
+}
+
void SynchronousCompositorImpl::SetInputHandler(
cc::InputHandler* input_handler) {
DCHECK(CalledOnValidThread());
@@ -279,18 +313,6 @@ void SynchronousCompositorImpl::DidStopFlinging() {
rwhv->DidStopFlinging();
}
-void SynchronousCompositorImpl::NeedsBeginFramesChanged() const {
- DCHECK(CalledOnValidThread());
- DCHECK(begin_frame_source_);
- if (invoking_composite_)
- return;
-
- if (compositor_client_) {
- compositor_client_->SetContinuousInvalidate(
- begin_frame_source_->NeedsBeginFrames());
- }
-}
-
InputEventAckState SynchronousCompositorImpl::HandleInputEvent(
const blink::WebInputEvent& input_event) {
DCHECK(CalledOnValidThread());

Powered by Google App Engine
This is Rietveld 408576698