Chromium Code Reviews| Index: content/renderer/render_widget.cc |
| diff --git a/content/renderer/render_widget.cc b/content/renderer/render_widget.cc |
| index 22b63c366afd325e94beb1673a9a072c05fcf9e5..aed59941a604c00ea96b13ce1aeb5f368b351842 100644 |
| --- a/content/renderer/render_widget.cc |
| +++ b/content/renderer/render_widget.cc |
| @@ -14,9 +14,13 @@ |
| #include "base/stl_util.h" |
| #include "base/utf_string_conversions.h" |
| #include "build/build_config.h" |
| +#include "cc/layer_tree_host.h" |
| +#include "cc/thread.h" |
| +#include "cc/thread_impl.h" |
| #include "content/common/swapped_out_messages.h" |
| #include "content/common/view_messages.h" |
| #include "content/public/common/content_switches.h" |
| +#include "content/renderer/gpu/compositor_thread.h" |
| #include "content/renderer/render_process.h" |
| #include "content/renderer/render_thread_impl.h" |
| #include "content/renderer/renderer_webkitplatformsupport_impl.h" |
| @@ -201,10 +205,11 @@ void RenderWidget::CompleteInit() { |
| init_complete_ = true; |
| - if (webwidget_) { |
| - webwidget_->setCompositorSurfaceReady(); |
| - if (is_threaded_compositing_enabled_) |
| - webwidget_->enterForceCompositingMode(true); |
| + if (webwidget_ && is_threaded_compositing_enabled_) { |
| + webwidget_->enterForceCompositingMode(true); |
| + } |
| + if (web_layer_tree_view_) { |
| + web_layer_tree_view_->setSurfaceReady(); |
| } |
| DoDeferredUpdate(); |
| @@ -601,10 +606,15 @@ void RenderWidget::OnHandleInputEvent(const WebKit::WebInputEvent* input_event, |
| input_event->type == WebInputEvent::MouseMove || |
| input_event->type == WebInputEvent::MouseWheel || |
| WebInputEvent::isTouchEventType(input_event->type); |
| + |
| + bool frame_pending = paint_aggregator_.HasPendingUpdate(); |
| + if (is_accelerated_compositing_active_) { |
| + frame_pending = web_layer_tree_view_->commitRequested(); |
| + } |
| + |
| bool is_input_throttled = |
| throttle_input_events_ && |
| - ((webwidget_ ? webwidget_->isInputThrottled() : false) || |
| - paint_aggregator_.HasPendingUpdate()); |
| + frame_pending; |
| if (event_type_gets_rate_limited && is_input_throttled && !is_hidden_) { |
| // We want to rate limit the input events in this case, so we'll wait for |
| @@ -842,7 +852,12 @@ void RenderWidget::AnimateIfNeeded() { |
| animation_timer_.Start(FROM_HERE, animationInterval, this, |
| &RenderWidget::AnimationCallback); |
| animation_update_pending_ = false; |
| - webwidget_->animate(0.0); |
| + if (is_accelerated_compositing_active_) { |
| + web_layer_tree_view_->layer_tree_host()->updateAnimations( |
| + base::TimeTicks::Now()); |
| + } else { |
| + webwidget_->animate(0.0); |
| + } |
| return; |
| } |
| TRACE_EVENT0("renderer", "EarlyOut_AnimatedTooRecently"); |
| @@ -1069,7 +1084,7 @@ void RenderWidget::DoDeferredUpdate() { |
| // If it needs to (e.g. composited UI), the GPU process does its own ACK |
| // with the browser for the GPU surface. |
| pending_update_params_->needs_ack = false; |
| - webwidget_->composite(false); |
|
jamesr
2013/01/04 19:24:48
oh snap, this change might break render_widget_ful
|
| + web_layer_tree_view_->composite(); |
| } |
| // If we're holding a pending input event ACK, send the ACK before sending the |
| @@ -1229,6 +1244,33 @@ void RenderWidget::didDeactivateCompositor() { |
| webwidget_->enterForceCompositingMode(false); |
| } |
| +void RenderWidget::initializeLayerTreeView( |
| + WebKit::WebLayerTreeViewClient* client, |
| + const WebKit::WebLayer& root_layer, |
| + const WebKit::WebLayerTreeView::Settings& settings) { |
| + DCHECK(!web_layer_tree_view_); |
| + web_layer_tree_view_.reset(new WebKit::WebLayerTreeViewImpl(client)); |
| + |
| + scoped_ptr<cc::Thread> impl_thread; |
| + CompositorThread* compositor_thread = |
| + RenderThreadImpl::current()->compositor_thread(); |
| + if (compositor_thread) |
| + impl_thread = cc::ThreadImpl::createForDifferentThread( |
| + compositor_thread->message_loop()->message_loop_proxy()); |
| + if (!web_layer_tree_view_->initialize(settings, impl_thread.Pass())) { |
| + web_layer_tree_view_.reset(); |
| + return; |
| + } |
| + web_layer_tree_view_->setRootLayer(root_layer); |
| + if (init_complete_) { |
| + web_layer_tree_view_->setSurfaceReady(); |
| + } |
| +} |
| + |
| +WebKit::WebLayerTreeView* RenderWidget::layerTreeView() { |
| + return web_layer_tree_view_.get(); |
| +} |
| + |
| void RenderWidget::willBeginCompositorFrame() { |
| TRACE_EVENT0("gpu", "RenderWidget::willBeginCompositorFrame"); |
| @@ -1380,6 +1422,7 @@ void RenderWidget::closeWidgetSoon() { |
| void RenderWidget::Close() { |
| if (webwidget_) { |
| + web_layer_tree_view_.reset(); |
| webwidget_->close(); |
| webwidget_ = NULL; |
| } |
| @@ -1594,7 +1637,7 @@ void RenderWidget::OnMsgRepaint(const gfx::Size& size_to_paint) { |
| set_next_paint_is_repaint_ack(); |
| if (is_accelerated_compositing_active_) { |
| - webwidget_->setNeedsRedraw(); |
| + web_layer_tree_view_->setNeedsRedraw(); |
| scheduleComposite(); |
| } else { |
| gfx::Rect repaint_rect(size_to_paint.width(), size_to_paint.height()); |
| @@ -1928,7 +1971,8 @@ void RenderWidget::CleanupWindowInPluginMoves(gfx::PluginWindowHandle window) { |
| void RenderWidget::GetRenderingStats( |
| WebKit::WebRenderingStatsImpl& stats) const { |
| - webwidget()->renderingStats(stats); |
| + if (web_layer_tree_view_) |
| + web_layer_tree_view_->renderingStats(stats); |
| stats.rendering_stats.numAnimationFrames += |
| software_stats_.numAnimationFrames; |