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

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: Fix rebase compile errors. 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..67a04ed97ebc66044adfb093a744a56a0358b95a 100644
--- a/content/browser/android/in_process/synchronous_compositor_impl.cc
+++ b/content/browser/android/in_process/synchronous_compositor_impl.cc
@@ -73,7 +73,8 @@ SynchronousCompositorImpl::SynchronousCompositorImpl(WebContents* contents)
contents_(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 +121,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 +137,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;
@@ -181,12 +185,9 @@ scoped_ptr<cc::CompositorFrame> SynchronousCompositorImpl::DemandDrawHw(
const gfx::Transform& transform_for_tile_priority) {
DCHECK(CalledOnValidThread());
DCHECK(output_surface_);
- DCHECK(!invoking_composite_);
DCHECK(compositor_client_);
DCHECK(begin_frame_source_);
- base::AutoReset<bool> invoking_composite_resetter(&invoking_composite_,
- true);
scoped_ptr<cc::CompositorFrame> frame =
output_surface_->DemandDrawHw(surface_size,
transform,
@@ -194,12 +195,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();
}
@@ -212,20 +211,15 @@ void SynchronousCompositorImpl::ReturnResources(
bool SynchronousCompositorImpl::DemandDrawSw(SkCanvas* canvas) {
DCHECK(CalledOnValidThread());
DCHECK(output_surface_);
- DCHECK(!invoking_composite_);
DCHECK(compositor_client_);
DCHECK(begin_frame_source_);
- 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 +239,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::BeginFrame(const cc::BeginFrameArgs& args) {
+ if (begin_frame_source_)
+ begin_frame_source_->BeginFrame(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 +304,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