| OLD | NEW |
| 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "content/renderer/gpu/render_widget_compositor.h" | 5 #include "content/renderer/gpu/render_widget_compositor.h" |
| 6 | 6 |
| 7 #include <limits> | 7 #include <limits> |
| 8 | 8 |
| 9 #include "base/command_line.h" | 9 #include "base/command_line.h" |
| 10 #include "base/logging.h" | 10 #include "base/logging.h" |
| 11 #include "base/string_number_conversions.h" | 11 #include "base/string_number_conversions.h" |
| 12 #include "base/synchronization/lock.h" | 12 #include "base/synchronization/lock.h" |
| 13 #include "base/time.h" | 13 #include "base/time.h" |
| 14 #include "cc/context_provider.h" | 14 #include "cc/context_provider.h" |
| 15 #include "cc/layer.h" | 15 #include "cc/layer.h" |
| 16 #include "cc/layer_tree_debug_state.h" | 16 #include "cc/layer_tree_debug_state.h" |
| 17 #include "cc/layer_tree_host.h" | 17 #include "cc/layer_tree_host.h" |
| 18 #include "cc/switches.h" | 18 #include "cc/switches.h" |
| 19 #include "cc/thread_impl.h" | 19 #include "cc/thread_impl.h" |
| 20 #include "content/public/common/content_switches.h" | 20 #include "content/public/common/content_switches.h" |
| 21 #include "content/renderer/gpu/compositor_thread.h" | 21 #include "content/renderer/gpu/compositor_thread.h" |
| 22 #include "content/renderer/render_thread_impl.h" | 22 #include "content/renderer/render_thread_impl.h" |
| 23 #include "third_party/WebKit/Source/Platform/chromium/public/WebLayerTreeViewCli
ent.h" | |
| 24 #include "third_party/WebKit/Source/Platform/chromium/public/WebSize.h" | 23 #include "third_party/WebKit/Source/Platform/chromium/public/WebSize.h" |
| 25 #include "ui/gl/gl_switches.h" | 24 #include "ui/gl/gl_switches.h" |
| 26 #include "webkit/compositor_bindings/web_layer_impl.h" | 25 #include "webkit/compositor_bindings/web_layer_impl.h" |
| 27 #include "webkit/compositor_bindings/web_to_ccinput_handler_adapter.h" | 26 #include "webkit/compositor_bindings/web_to_ccinput_handler_adapter.h" |
| 28 | 27 |
| 29 namespace cc { | 28 namespace cc { |
| 30 class Layer; | 29 class Layer; |
| 31 } | 30 } |
| 32 | 31 |
| 33 using WebKit::WebFloatPoint; | 32 using WebKit::WebFloatPoint; |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 74 return false; | 73 return false; |
| 75 } | 74 } |
| 76 } | 75 } |
| 77 | 76 |
| 78 | 77 |
| 79 } // namespace | 78 } // namespace |
| 80 | 79 |
| 81 // static | 80 // static |
| 82 scoped_ptr<RenderWidgetCompositor> RenderWidgetCompositor::Create( | 81 scoped_ptr<RenderWidgetCompositor> RenderWidgetCompositor::Create( |
| 83 RenderWidget* widget, | 82 RenderWidget* widget, |
| 84 WebKit::WebLayerTreeViewClient* client, | |
| 85 WebKit::WebLayerTreeView::Settings web_settings) { | 83 WebKit::WebLayerTreeView::Settings web_settings) { |
| 86 scoped_ptr<RenderWidgetCompositor> comp( | 84 scoped_ptr<RenderWidgetCompositor> compositor( |
| 87 new RenderWidgetCompositor(widget, client)); | 85 new RenderWidgetCompositor(widget)); |
| 88 | 86 |
| 89 CommandLine* cmd = CommandLine::ForCurrentProcess(); | 87 CommandLine* cmd = CommandLine::ForCurrentProcess(); |
| 90 | 88 |
| 91 cc::LayerTreeSettings settings; | 89 cc::LayerTreeSettings settings; |
| 92 settings.acceleratePainting = | 90 settings.acceleratePainting = |
| 93 cmd->HasSwitch(switches::kEnableAcceleratedPainting); | 91 cmd->HasSwitch(switches::kEnableAcceleratedPainting); |
| 94 settings.renderVSyncEnabled = !cmd->HasSwitch(switches::kDisableGpuVsync); | 92 settings.renderVSyncEnabled = !cmd->HasSwitch(switches::kDisableGpuVsync); |
| 95 settings.perTilePaintingEnabled = | 93 settings.perTilePaintingEnabled = |
| 96 cmd->HasSwitch(cc::switches::kEnablePerTilePainting); | 94 cmd->HasSwitch(cc::switches::kEnablePerTilePainting); |
| 97 settings.acceleratedAnimationEnabled = | 95 settings.acceleratedAnimationEnabled = |
| (...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 233 #if defined(OS_ANDROID) | 231 #if defined(OS_ANDROID) |
| 234 // TODO(danakj): Move these to the android code. | 232 // TODO(danakj): Move these to the android code. |
| 235 settings.canUseLCDText = false; | 233 settings.canUseLCDText = false; |
| 236 settings.maxPartialTextureUpdates = 0; | 234 settings.maxPartialTextureUpdates = 0; |
| 237 settings.useLinearFadeScrollbarAnimator = true; | 235 settings.useLinearFadeScrollbarAnimator = true; |
| 238 settings.solidColorScrollbars = true; | 236 settings.solidColorScrollbars = true; |
| 239 settings.solidColorScrollbarColor = SkColorSetARGB(128, 128, 128, 128); | 237 settings.solidColorScrollbarColor = SkColorSetARGB(128, 128, 128, 128); |
| 240 settings.solidColorScrollbarThicknessDIP = 3; | 238 settings.solidColorScrollbarThicknessDIP = 3; |
| 241 #endif | 239 #endif |
| 242 | 240 |
| 243 if (!comp->initialize(settings)) | 241 if (!compositor->initialize(settings)) |
| 244 return scoped_ptr<RenderWidgetCompositor>(); | 242 return scoped_ptr<RenderWidgetCompositor>(); |
| 245 | 243 |
| 246 return comp.Pass(); | 244 return compositor.Pass(); |
| 247 } | 245 } |
| 248 | 246 |
| 249 RenderWidgetCompositor::RenderWidgetCompositor( | 247 RenderWidgetCompositor::RenderWidgetCompositor(RenderWidget* widget) |
| 250 RenderWidget* widget, WebKit::WebLayerTreeViewClient* client) | |
| 251 : suppress_schedule_composite_(false), | 248 : suppress_schedule_composite_(false), |
| 252 widget_(widget), | 249 widget_(widget) { |
| 253 client_(client) { | |
| 254 } | 250 } |
| 255 | 251 |
| 256 RenderWidgetCompositor::~RenderWidgetCompositor() {} | 252 RenderWidgetCompositor::~RenderWidgetCompositor() {} |
| 257 | 253 |
| 258 void RenderWidgetCompositor::SetSuppressScheduleComposite(bool suppress) { | 254 void RenderWidgetCompositor::SetSuppressScheduleComposite(bool suppress) { |
| 259 if (suppress_schedule_composite_ == suppress) | 255 if (suppress_schedule_composite_ == suppress) |
| 260 return; | 256 return; |
| 261 | 257 |
| 262 if (suppress) | 258 if (suppress) |
| 263 TRACE_EVENT_ASYNC_BEGIN0("gpu", | 259 TRACE_EVENT_ASYNC_BEGIN0("gpu", |
| 264 "RenderWidgetCompositor::SetSuppressScheduleComposite", this); | 260 "RenderWidgetCompositor::SetSuppressScheduleComposite", this); |
| 265 else | 261 else |
| 266 TRACE_EVENT_ASYNC_END0("gpu", | 262 TRACE_EVENT_ASYNC_END0("gpu", |
| 267 "RenderWidgetCompositor::SetSuppressScheduleComposite", this); | 263 "RenderWidgetCompositor::SetSuppressScheduleComposite", this); |
| 268 suppress_schedule_composite_ = suppress; | 264 suppress_schedule_composite_ = suppress; |
| 269 } | 265 } |
| 270 | 266 |
| 267 void RenderWidgetCompositor::Animate(base::TimeTicks time) { |
| 268 layer_tree_host_->updateAnimations(time); |
| 269 } |
| 270 |
| 271 void RenderWidgetCompositor::Composite() { |
| 272 layer_tree_host_->composite(); |
| 273 } |
| 274 |
| 275 void RenderWidgetCompositor::GetRenderingStats(cc::RenderingStats* stats) { |
| 276 layer_tree_host_->renderingStats(stats); |
| 277 } |
| 278 |
| 279 skia::RefPtr<SkPicture> RenderWidgetCompositor::CapturePicture() { |
| 280 return layer_tree_host_->capturePicture(); |
| 281 } |
| 282 |
| 283 void RenderWidgetCompositor::EnableHidingTopControls(bool enable) { |
| 284 layer_tree_host_->enableHidingTopControls(enable); |
| 285 } |
| 286 |
| 271 bool RenderWidgetCompositor::initialize(cc::LayerTreeSettings settings) { | 287 bool RenderWidgetCompositor::initialize(cc::LayerTreeSettings settings) { |
| 272 scoped_ptr<cc::Thread> impl_thread; | 288 scoped_ptr<cc::Thread> impl_thread; |
| 273 CompositorThread* compositor_thread = | 289 CompositorThread* compositor_thread = |
| 274 RenderThreadImpl::current()->compositor_thread(); | 290 RenderThreadImpl::current()->compositor_thread(); |
| 275 threaded_ = !!compositor_thread; | 291 threaded_ = !!compositor_thread; |
| 276 if (compositor_thread) | 292 if (compositor_thread) |
| 277 impl_thread = cc::ThreadImpl::createForDifferentThread( | 293 impl_thread = cc::ThreadImpl::createForDifferentThread( |
| 278 compositor_thread->message_loop()->message_loop_proxy()); | 294 compositor_thread->message_loop()->message_loop_proxy()); |
| 279 layer_tree_host_ = cc::LayerTreeHost::create(this, | 295 layer_tree_host_ = cc::LayerTreeHost::create(this, |
| 280 settings, | 296 settings, |
| (...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 362 if (threaded_) | 378 if (threaded_) |
| 363 layer_tree_host_->setNeedsAnimate(); | 379 layer_tree_host_->setNeedsAnimate(); |
| 364 else | 380 else |
| 365 widget_->scheduleAnimation(); | 381 widget_->scheduleAnimation(); |
| 366 } | 382 } |
| 367 | 383 |
| 368 bool RenderWidgetCompositor::commitRequested() const { | 384 bool RenderWidgetCompositor::commitRequested() const { |
| 369 return layer_tree_host_->commitRequested(); | 385 return layer_tree_host_->commitRequested(); |
| 370 } | 386 } |
| 371 | 387 |
| 372 void RenderWidgetCompositor::composite() { | |
| 373 layer_tree_host_->composite(); | |
| 374 } | |
| 375 | |
| 376 void RenderWidgetCompositor::updateAnimations(double frame_begin_time_sec) { | |
| 377 base::TimeTicks frame_begin_time = | |
| 378 base::TimeTicks::FromInternalValue(frame_begin_time_sec * | |
| 379 base::Time::kMicrosecondsPerSecond); | |
| 380 layer_tree_host_->updateAnimations(frame_begin_time); | |
| 381 } | |
| 382 | |
| 383 void RenderWidgetCompositor::didStopFlinging() { | 388 void RenderWidgetCompositor::didStopFlinging() { |
| 384 layer_tree_host_->didStopFlinging(); | 389 layer_tree_host_->didStopFlinging(); |
| 385 } | 390 } |
| 386 | 391 |
| 387 bool RenderWidgetCompositor::compositeAndReadback(void *pixels, | 392 bool RenderWidgetCompositor::compositeAndReadback(void *pixels, |
| 388 const WebRect& rect) { | 393 const WebRect& rect) { |
| 389 return layer_tree_host_->compositeAndReadback(pixels, rect); | 394 return layer_tree_host_->compositeAndReadback(pixels, rect); |
| 390 } | 395 } |
| 391 | 396 |
| 392 void RenderWidgetCompositor::finishAllRendering() { | 397 void RenderWidgetCompositor::finishAllRendering() { |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 427 } | 432 } |
| 428 | 433 |
| 429 void RenderWidgetCompositor::didBeginFrame() { | 434 void RenderWidgetCompositor::didBeginFrame() { |
| 430 widget_->InstrumentDidBeginFrame(); | 435 widget_->InstrumentDidBeginFrame(); |
| 431 } | 436 } |
| 432 | 437 |
| 433 void RenderWidgetCompositor::animate(double monotonic_frame_begin_time) { | 438 void RenderWidgetCompositor::animate(double monotonic_frame_begin_time) { |
| 434 widget_->webwidget()->animate(monotonic_frame_begin_time); | 439 widget_->webwidget()->animate(monotonic_frame_begin_time); |
| 435 } | 440 } |
| 436 | 441 |
| 437 // Can delete from WebLayerTreeViewClient | |
| 438 void RenderWidgetCompositor::layout() { | 442 void RenderWidgetCompositor::layout() { |
| 439 widget_->webwidget()->layout(); | 443 widget_->webwidget()->layout(); |
| 440 } | 444 } |
| 441 | 445 |
| 442 // TODO(jamesr): This should go through WebWidget | |
| 443 void RenderWidgetCompositor::applyScrollAndScale(gfx::Vector2d scroll_delta, | 446 void RenderWidgetCompositor::applyScrollAndScale(gfx::Vector2d scroll_delta, |
| 444 float page_scale) { | 447 float page_scale) { |
| 445 client_->applyScrollAndScale(scroll_delta, page_scale); | 448 widget_->webwidget()->applyScrollAndScale(scroll_delta, page_scale); |
| 446 } | 449 } |
| 447 | 450 |
| 448 scoped_ptr<cc::OutputSurface> RenderWidgetCompositor::createOutputSurface() { | 451 scoped_ptr<cc::OutputSurface> RenderWidgetCompositor::createOutputSurface() { |
| 449 return widget_->CreateOutputSurface(); | 452 return widget_->CreateOutputSurface(); |
| 450 } | 453 } |
| 451 | 454 |
| 452 // TODO(jamesr): This should go through WebWidget | |
| 453 void RenderWidgetCompositor::didRecreateOutputSurface(bool success) { | 455 void RenderWidgetCompositor::didRecreateOutputSurface(bool success) { |
| 454 client_->didRecreateOutputSurface(success); | 456 if (!success) |
| 457 widget_->webwidget()->didExitCompositingMode(); |
| 455 } | 458 } |
| 456 | 459 |
| 457 // TODO(jamesr): This should go through WebWidget | |
| 458 scoped_ptr<cc::InputHandler> RenderWidgetCompositor::createInputHandler() { | 460 scoped_ptr<cc::InputHandler> RenderWidgetCompositor::createInputHandler() { |
| 459 scoped_ptr<cc::InputHandler> ret; | 461 scoped_ptr<cc::InputHandler> ret; |
| 460 scoped_ptr<WebKit::WebInputHandler> web_handler( | 462 scoped_ptr<WebKit::WebInputHandler> web_handler( |
| 461 client_->createInputHandler()); | 463 widget_->webwidget()->createInputHandler()); |
| 462 if (web_handler) | 464 if (web_handler) |
| 463 ret = WebKit::WebToCCInputHandlerAdapter::create(web_handler.Pass()); | 465 ret = WebKit::WebToCCInputHandlerAdapter::create(web_handler.Pass()); |
| 464 return ret.Pass(); | 466 return ret.Pass(); |
| 465 } | 467 } |
| 466 | 468 |
| 467 void RenderWidgetCompositor::willCommit() { | 469 void RenderWidgetCompositor::willCommit() { |
| 468 widget_->InstrumentWillComposite(); | 470 widget_->InstrumentWillComposite(); |
| 469 } | 471 } |
| 470 | 472 |
| 471 void RenderWidgetCompositor::didCommit() { | 473 void RenderWidgetCompositor::didCommit() { |
| (...skipping 19 matching lines...) Expand all Loading... |
| 491 return RenderThreadImpl::current()->OffscreenContextProviderForMainThread(); | 493 return RenderThreadImpl::current()->OffscreenContextProviderForMainThread(); |
| 492 } | 494 } |
| 493 | 495 |
| 494 scoped_refptr<cc::ContextProvider> | 496 scoped_refptr<cc::ContextProvider> |
| 495 RenderWidgetCompositor::OffscreenContextProviderForCompositorThread() { | 497 RenderWidgetCompositor::OffscreenContextProviderForCompositorThread() { |
| 496 return RenderThreadImpl::current()-> | 498 return RenderThreadImpl::current()-> |
| 497 OffscreenContextProviderForCompositorThread(); | 499 OffscreenContextProviderForCompositorThread(); |
| 498 } | 500 } |
| 499 | 501 |
| 500 } // namespace content | 502 } // namespace content |
| OLD | NEW |