| Index: content/renderer/render_widget.cc
|
| diff --git a/content/renderer/render_widget.cc b/content/renderer/render_widget.cc
|
| index 0447d97c16c8514f9abfa7689bf236e5aa122bbd..ce8b45d56d7e1f9dd867b503214be6066ca5a988 100644
|
| --- a/content/renderer/render_widget.cc
|
| +++ b/content/renderer/render_widget.cc
|
| @@ -368,6 +368,35 @@ bool RenderWidget::UsingSynchronousRendererCompositor() const {
|
| #endif
|
| }
|
|
|
| +void RenderWidget::ScheduleCompositeWithForcedRedraw() {
|
| + ScheduleCompositeImpl(true);
|
| +}
|
| +
|
| +void RenderWidget::ScheduleCompositeImpl(bool force_redraw) {
|
| + if (compositor_ && force_redraw) {
|
| + // Regardless of whether threaded compositing is enabled, always
|
| + // use this mechanism to force the compositor to redraw. However,
|
| + // the invalidation code path below is still needed for the
|
| + // non-threaded case.
|
| + compositor_->SetNeedsForcedRedraw();
|
| + }
|
| +
|
| + if (RenderThreadImpl::current()->compositor_message_loop_proxy().get() &&
|
| + compositor_) {
|
| + if (!force_redraw) {
|
| + compositor_->setNeedsRedraw();
|
| + }
|
| + } else {
|
| + // TODO(nduca): replace with something a little less hacky. The reason this
|
| + // hack is still used is because the Invalidate-DoDeferredUpdate loop
|
| + // contains a lot of host-renderer synchronization logic that is still
|
| + // important for the accelerated compositing case. The option of simply
|
| + // duplicating all that code is less desirable than "faking out" the
|
| + // invalidation path using a magical damage rect.
|
| + didInvalidateRect(WebRect(0, 0, 1, 1));
|
| + }
|
| +}
|
| +
|
| bool RenderWidget::OnMessageReceived(const IPC::Message& message) {
|
| bool handled = true;
|
| IPC_BEGIN_MESSAGE_MAP(RenderWidget, message)
|
| @@ -616,6 +645,7 @@ void RenderWidget::OnUpdateRectAck() {
|
| // If swapbuffers is still pending, then defer the update until the
|
| // swapbuffers occurs.
|
| if (num_swapbuffers_complete_pending_ >= kMaxSwapBuffersPending) {
|
| + LOG(INFO) << "EarlyOut_SwapStillPending";
|
| TRACE_EVENT0("renderer", "EarlyOut_SwapStillPending");
|
| return;
|
| }
|
| @@ -768,6 +798,7 @@ void RenderWidget::OnViewContextSwapBuffersComplete() {
|
| // When compositing deactivates, we reset the swapbuffers pending count. The
|
| // swapbuffers acks may still arrive, however.
|
| if (num_swapbuffers_complete_pending_ == 0) {
|
| + LOG(INFO) << "EarlyOut_ZeroSwapbuffersPending";
|
| TRACE_EVENT0("renderer", "EarlyOut_ZeroSwapbuffersPending");
|
| return;
|
| }
|
| @@ -783,6 +814,7 @@ void RenderWidget::OnViewContextSwapBuffersComplete() {
|
| // If update reply is still pending, then defer the update until that reply
|
| // occurs.
|
| if (update_reply_pending_) {
|
| + LOG(INFO) << "EarlyOut_UpdateReplyPending";
|
| TRACE_EVENT0("renderer", "EarlyOut_UpdateReplyPending");
|
| return;
|
| }
|
| @@ -792,6 +824,7 @@ void RenderWidget::OnViewContextSwapBuffersComplete() {
|
| // posted, there may be software rendering work pending. In that case, don't
|
| // early out.
|
| if (!is_accelerated_compositing_active_ && invalidation_task_posted_) {
|
| + LOG(INFO) << "EarlyOut_AcceleratedCompositingOff";
|
| TRACE_EVENT0("renderer", "EarlyOut_AcceleratedCompositingOff");
|
| return;
|
| }
|
| @@ -801,6 +834,7 @@ void RenderWidget::OnViewContextSwapBuffersComplete() {
|
| // callback coming back after we've navigated away from the page that
|
| // generated it.
|
| if (!animation_update_pending_ && !paint_aggregator_.HasPendingUpdate()) {
|
| + LOG(INFO) << "EarlyOut_NoPendingUpdate";
|
| TRACE_EVENT0("renderer", "EarlyOut_NoPendingUpdate");
|
| return;
|
| }
|
| @@ -1085,6 +1119,7 @@ void RenderWidget::PaintDebugBorder(const gfx::Rect& rect,
|
| void RenderWidget::AnimationCallback() {
|
| TRACE_EVENT0("renderer", "RenderWidget::AnimationCallback");
|
| if (!animation_update_pending_) {
|
| + LOG(INFO) << "EarlyOut_NoAnimationUpdatePending";
|
| TRACE_EVENT0("renderer", "EarlyOut_NoAnimationUpdatePending");
|
| return;
|
| }
|
| @@ -1135,6 +1170,7 @@ void RenderWidget::AnimateIfNeeded() {
|
| }
|
| return;
|
| }
|
| + LOG(INFO) << "EarlyOut_AnimatedTooRecently";
|
| TRACE_EVENT0("renderer", "EarlyOut_AnimatedTooRecently");
|
| if (!animation_timer_.IsRunning()) {
|
| // This code uses base::Time::Now() to calculate the floor and next fire
|
| @@ -1180,15 +1216,18 @@ void RenderWidget::DoDeferredUpdate() {
|
| return;
|
|
|
| if (!init_complete_) {
|
| + LOG(INFO) << "EarlyOut_InitNotComplete";
|
| TRACE_EVENT0("renderer", "EarlyOut_InitNotComplete");
|
| return;
|
| }
|
| if (update_reply_pending_) {
|
| + LOG(INFO) << "EarlyOut_UpdateReplyPending";
|
| TRACE_EVENT0("renderer", "EarlyOut_UpdateReplyPending");
|
| return;
|
| }
|
| if (is_accelerated_compositing_active_ &&
|
| num_swapbuffers_complete_pending_ >= kMaxSwapBuffersPending) {
|
| + LOG(INFO) << "EarlyOut_MaxSwapBuffersPending";
|
| TRACE_EVENT0("renderer", "EarlyOut_MaxSwapBuffersPending");
|
| return;
|
| }
|
| @@ -1197,6 +1236,7 @@ void RenderWidget::DoDeferredUpdate() {
|
| if (is_hidden_ || size_.IsEmpty() || is_swapped_out_) {
|
| paint_aggregator_.ClearPendingUpdate();
|
| needs_repainting_on_restore_ = true;
|
| + LOG(INFO) << "EarlyOut_NotVisible";
|
| TRACE_EVENT0("renderer", "EarlyOut_NotVisible");
|
| return;
|
| }
|
| @@ -1225,6 +1265,7 @@ void RenderWidget::DoDeferredUpdate() {
|
| // Suppress painting if nothing is dirty. This has to be done after updating
|
| // animations running layout as these may generate further invalidations.
|
| if (!paint_aggregator_.HasPendingUpdate()) {
|
| + LOG(INFO) << "EarlyOut_NoPendingUpdate";
|
| TRACE_EVENT0("renderer", "EarlyOut_NoPendingUpdate");
|
| InstrumentDidCancelFrame();
|
| return;
|
| @@ -1656,18 +1697,7 @@ void RenderWidget::didCompleteSwapBuffers() {
|
| }
|
|
|
| void RenderWidget::scheduleComposite() {
|
| - if (RenderThreadImpl::current()->compositor_message_loop_proxy().get() &&
|
| - compositor_) {
|
| - compositor_->setNeedsRedraw();
|
| - } else {
|
| - // TODO(nduca): replace with something a little less hacky. The reason this
|
| - // hack is still used is because the Invalidate-DoDeferredUpdate loop
|
| - // contains a lot of host-renderer synchronization logic that is still
|
| - // important for the accelerated compositing case. The option of simply
|
| - // duplicating all that code is less desirable than "faking out" the
|
| - // invalidation path using a magical damage rect.
|
| - didInvalidateRect(WebRect(0, 0, 1, 1));
|
| - }
|
| + ScheduleCompositeImpl(false);
|
| }
|
|
|
| void RenderWidget::scheduleAnimation() {
|
|
|