render_widget_compositor.cc revision 4e180b6a0b4720a9b8e9e959a882386f690f08ff
13291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org// Copyright (c) 2013 The Chromium Authors. All rights reserved. 29a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// Use of this source code is governed by a BSD-style license that can be 39a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// found in the LICENSE file. 49a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 59a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com#include "content/renderer/gpu/render_widget_compositor.h" 69a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 79a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com#include <limits> 89a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com#include <string> 99a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 109a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com#if defined(OS_ANDROID) 119a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com#include "base/android/sys_utils.h" 129a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com#endif 139a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 149a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com#include "base/command_line.h" 159a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com#include "base/logging.h" 169a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com#include "base/strings/string_number_conversions.h" 179a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com#include "base/synchronization/lock.h" 189a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com#include "base/time/time.h" 199a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com#include "base/values.h" 209a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com#include "cc/base/switches.h" 219a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com#include "cc/debug/layer_tree_debug_state.h" 229a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com#include "cc/debug/micro_benchmark.h" 239a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com#include "cc/layers/layer.h" 249a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com#include "cc/trees/layer_tree_host.h" 259a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com#include "content/common/gpu/client/context_provider_command_buffer.h" 269a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com#include "content/public/common/content_switches.h" 279a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com#include "content/renderer/gpu/input_handler_manager.h" 283291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org#include "content/renderer/render_thread_impl.h" 293291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org#include "third_party/WebKit/public/platform/WebSize.h" 303291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org#include "third_party/WebKit/public/web/WebWidget.h" 313291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org#include "ui/gl/gl_switches.h" 323291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org#include "webkit/renderer/compositor_bindings/web_layer_impl.h" 339a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 343291210ab99f306b74430ebbc4b7d939629e699fager@chromium.orgnamespace base { 353291210ab99f306b74430ebbc4b7d939629e699fager@chromium.orgclass Value; 363291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org} 373291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org 383291210ab99f306b74430ebbc4b7d939629e699fager@chromium.orgnamespace cc { 393291210ab99f306b74430ebbc4b7d939629e699fager@chromium.orgclass Layer; 403291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org} 419a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 423291210ab99f306b74430ebbc4b7d939629e699fager@chromium.orgusing WebKit::WebFloatPoint; 43using WebKit::WebSize; 44using WebKit::WebRect; 45 46namespace content { 47namespace { 48 49bool GetSwitchValueAsInt( 50 const CommandLine& command_line, 51 const std::string& switch_string, 52 int min_value, 53 int max_value, 54 int* result) { 55 std::string string_value = command_line.GetSwitchValueASCII(switch_string); 56 int int_value; 57 if (base::StringToInt(string_value, &int_value) && 58 int_value >= min_value && int_value <= max_value) { 59 *result = int_value; 60 return true; 61 } else { 62 LOG(WARNING) << "Failed to parse switch " << switch_string << ": " << 63 string_value; 64 return false; 65 } 66} 67 68bool GetSwitchValueAsFloat( 69 const CommandLine& command_line, 70 const std::string& switch_string, 71 float min_value, 72 float max_value, 73 float* result) { 74 std::string string_value = command_line.GetSwitchValueASCII(switch_string); 75 double double_value; 76 if (base::StringToDouble(string_value, &double_value) && 77 double_value >= min_value && double_value <= max_value) { 78 *result = static_cast<float>(double_value); 79 return true; 80 } else { 81 LOG(WARNING) << "Failed to parse switch " << switch_string << ": " << 82 string_value; 83 return false; 84 } 85} 86 87 88} // namespace 89 90// static 91scoped_ptr<RenderWidgetCompositor> RenderWidgetCompositor::Create( 92 RenderWidget* widget, 93 bool threaded) { 94 scoped_ptr<RenderWidgetCompositor> compositor( 95 new RenderWidgetCompositor(widget, threaded)); 96 97 CommandLine* cmd = CommandLine::ForCurrentProcess(); 98 99 cc::LayerTreeSettings settings; 100 101 // For web contents, layer transforms should scale up the contents of layers 102 // to keep content always crisp when possible. 103 settings.layer_transforms_should_scale_layer_contents = true; 104 105 settings.throttle_frame_production = 106 !cmd->HasSwitch(switches::kDisableGpuVsync); 107 settings.begin_frame_scheduling_enabled = 108 cmd->HasSwitch(switches::kEnableBeginFrameScheduling); 109 settings.deadline_scheduling_enabled = 110 cmd->HasSwitch(switches::kEnableDeadlineScheduling) && 111 !cmd->HasSwitch(switches::kDisableDeadlineScheduling); 112 settings.using_synchronous_renderer_compositor = 113 widget->UsingSynchronousRendererCompositor(); 114 settings.per_tile_painting_enabled = 115 cmd->HasSwitch(cc::switches::kEnablePerTilePainting); 116 settings.accelerated_animation_enabled = 117 !cmd->HasSwitch(cc::switches::kDisableThreadedAnimation); 118 settings.force_direct_layer_drawing = 119 cmd->HasSwitch(cc::switches::kForceDirectLayerDrawing); 120 settings.touch_hit_testing = 121 !cmd->HasSwitch(cc::switches::kDisableCompositorTouchHitTesting); 122 123 int default_tile_width = settings.default_tile_size.width(); 124 if (cmd->HasSwitch(switches::kDefaultTileWidth)) { 125 GetSwitchValueAsInt(*cmd, switches::kDefaultTileWidth, 1, 126 std::numeric_limits<int>::max(), &default_tile_width); 127 } 128 int default_tile_height = settings.default_tile_size.height(); 129 if (cmd->HasSwitch(switches::kDefaultTileHeight)) { 130 GetSwitchValueAsInt(*cmd, switches::kDefaultTileHeight, 1, 131 std::numeric_limits<int>::max(), &default_tile_height); 132 } 133 settings.default_tile_size = gfx::Size(default_tile_width, 134 default_tile_height); 135 136 int max_untiled_layer_width = settings.max_untiled_layer_size.width(); 137 if (cmd->HasSwitch(switches::kMaxUntiledLayerWidth)) { 138 GetSwitchValueAsInt(*cmd, switches::kMaxUntiledLayerWidth, 1, 139 std::numeric_limits<int>::max(), 140 &max_untiled_layer_width); 141 } 142 int max_untiled_layer_height = settings.max_untiled_layer_size.height(); 143 if (cmd->HasSwitch(switches::kMaxUntiledLayerHeight)) { 144 GetSwitchValueAsInt(*cmd, switches::kMaxUntiledLayerHeight, 1, 145 std::numeric_limits<int>::max(), 146 &max_untiled_layer_height); 147 } 148 149 settings.max_untiled_layer_size = gfx::Size(max_untiled_layer_width, 150 max_untiled_layer_height); 151 152 settings.impl_side_painting = cc::switches::IsImplSidePaintingEnabled(); 153 154 settings.calculate_top_controls_position = 155 cmd->HasSwitch(cc::switches::kEnableTopControlsPositionCalculation); 156 if (cmd->HasSwitch(cc::switches::kTopControlsHeight)) { 157 std::string controls_height_str = 158 cmd->GetSwitchValueASCII(cc::switches::kTopControlsHeight); 159 double controls_height; 160 if (base::StringToDouble(controls_height_str, &controls_height) && 161 controls_height > 0) 162 settings.top_controls_height = controls_height; 163 } 164 165 if (settings.calculate_top_controls_position && 166 settings.top_controls_height <= 0) { 167 DCHECK(false) 168 << "Top controls repositioning enabled without valid height set."; 169 settings.calculate_top_controls_position = false; 170 } 171 172 if (cmd->HasSwitch(cc::switches::kTopControlsShowThreshold)) { 173 std::string top_threshold_str = 174 cmd->GetSwitchValueASCII(cc::switches::kTopControlsShowThreshold); 175 double show_threshold; 176 if (base::StringToDouble(top_threshold_str, &show_threshold) && 177 show_threshold >= 0.f && show_threshold <= 1.f) 178 settings.top_controls_show_threshold = show_threshold; 179 } 180 181 if (cmd->HasSwitch(cc::switches::kTopControlsHideThreshold)) { 182 std::string top_threshold_str = 183 cmd->GetSwitchValueASCII(cc::switches::kTopControlsHideThreshold); 184 double hide_threshold; 185 if (base::StringToDouble(top_threshold_str, &hide_threshold) && 186 hide_threshold >= 0.f && hide_threshold <= 1.f) 187 settings.top_controls_hide_threshold = hide_threshold; 188 } 189 190 settings.partial_swap_enabled = widget->AllowPartialSwap() && 191 cmd->HasSwitch(cc::switches::kEnablePartialSwap); 192 settings.background_color_instead_of_checkerboard = 193 cmd->HasSwitch(cc::switches::kBackgroundColorInsteadOfCheckerboard); 194 settings.show_overdraw_in_tracing = 195 cmd->HasSwitch(cc::switches::kTraceOverdraw); 196 settings.can_use_lcd_text = cc::switches::IsLCDTextEnabled(); 197 settings.use_pinch_virtual_viewport = 198 cmd->HasSwitch(cc::switches::kEnablePinchVirtualViewport); 199 settings.allow_antialiasing &= 200 !cmd->HasSwitch(cc::switches::kDisableCompositedAntialiasing); 201 202 // These flags should be mirrored by UI versions in ui/compositor/. 203 settings.initial_debug_state.show_debug_borders = 204 cmd->HasSwitch(cc::switches::kShowCompositedLayerBorders); 205 settings.initial_debug_state.show_fps_counter = 206 cmd->HasSwitch(cc::switches::kShowFPSCounter); 207 settings.initial_debug_state.show_paint_rects = 208 cmd->HasSwitch(switches::kShowPaintRects); 209 settings.initial_debug_state.show_property_changed_rects = 210 cmd->HasSwitch(cc::switches::kShowPropertyChangedRects); 211 settings.initial_debug_state.show_surface_damage_rects = 212 cmd->HasSwitch(cc::switches::kShowSurfaceDamageRects); 213 settings.initial_debug_state.show_screen_space_rects = 214 cmd->HasSwitch(cc::switches::kShowScreenSpaceRects); 215 settings.initial_debug_state.show_replica_screen_space_rects = 216 cmd->HasSwitch(cc::switches::kShowReplicaScreenSpaceRects); 217 settings.initial_debug_state.show_occluding_rects = 218 cmd->HasSwitch(cc::switches::kShowOccludingRects); 219 settings.initial_debug_state.show_non_occluding_rects = 220 cmd->HasSwitch(cc::switches::kShowNonOccludingRects); 221 222 settings.initial_debug_state.SetRecordRenderingStats( 223 cmd->HasSwitch(switches::kEnableGpuBenchmarking)); 224 225 if (cmd->HasSwitch(cc::switches::kSlowDownRasterScaleFactor)) { 226 const int kMinSlowDownScaleFactor = 0; 227 const int kMaxSlowDownScaleFactor = INT_MAX; 228 GetSwitchValueAsInt( 229 *cmd, 230 cc::switches::kSlowDownRasterScaleFactor, 231 kMinSlowDownScaleFactor, 232 kMaxSlowDownScaleFactor, 233 &settings.initial_debug_state.slow_down_raster_scale_factor); 234 } 235 236 if (cmd->HasSwitch(cc::switches::kNumRasterThreads)) { 237 const int kMinRasterThreads = 1; 238 const int kMaxRasterThreads = 64; 239 int num_raster_threads; 240 if (GetSwitchValueAsInt(*cmd, cc::switches::kNumRasterThreads, 241 kMinRasterThreads, kMaxRasterThreads, 242 &num_raster_threads)) 243 settings.num_raster_threads = num_raster_threads; 244 } 245 246 if (cmd->HasSwitch(cc::switches::kLowResolutionContentsScaleFactor)) { 247 const int kMinScaleFactor = settings.minimum_contents_scale; 248 const int kMaxScaleFactor = 1; 249 GetSwitchValueAsFloat(*cmd, 250 cc::switches::kLowResolutionContentsScaleFactor, 251 kMinScaleFactor, kMaxScaleFactor, 252 &settings.low_res_contents_scale_factor); 253 } 254 255 if (cmd->HasSwitch(cc::switches::kMaxTilesForInterestArea)) { 256 int max_tiles_for_interest_area; 257 if (GetSwitchValueAsInt(*cmd, 258 cc::switches::kMaxTilesForInterestArea, 259 1, std::numeric_limits<int>::max(), 260 &max_tiles_for_interest_area)) 261 settings.max_tiles_for_interest_area = max_tiles_for_interest_area; 262 } 263 264 if (cmd->HasSwitch(cc::switches::kMaxUnusedResourceMemoryUsagePercentage)) { 265 int max_unused_resource_memory_percentage; 266 if (GetSwitchValueAsInt( 267 *cmd, 268 cc::switches::kMaxUnusedResourceMemoryUsagePercentage, 269 0, 100, 270 &max_unused_resource_memory_percentage)) { 271 settings.max_unused_resource_memory_percentage = 272 max_unused_resource_memory_percentage; 273 } 274 } 275 276 settings.strict_layer_property_change_checking = 277 cmd->HasSwitch(cc::switches::kStrictLayerPropertyChangeChecking); 278 279 settings.use_map_image = cc::switches::IsMapImageEnabled(); 280 281#if defined(OS_ANDROID) 282 // TODO(danakj): Move these to the android code. 283 settings.max_partial_texture_updates = 0; 284 settings.scrollbar_animator = cc::LayerTreeSettings::LinearFade; 285 settings.solid_color_scrollbars = true; 286 settings.solid_color_scrollbar_color = 287 cmd->HasSwitch(switches::kHideScrollbars) 288 ? SK_ColorTRANSPARENT 289 : SkColorSetARGB(128, 128, 128, 128); 290 settings.highp_threshold_min = 2048; 291 // Android WebView handles root layer flings itself. 292 settings.ignore_root_layer_flings = 293 widget->UsingSynchronousRendererCompositor(); 294 settings.always_overscroll = widget->UsingSynchronousRendererCompositor(); 295 // RGBA_4444 textures are only enabled for low end devices 296 // and are disabled for Android WebView as it doesn't support the format. 297 settings.use_rgba_4444_textures = 298 base::android::SysUtils::IsLowEndDevice() && 299 !widget->UsingSynchronousRendererCompositor() && 300 !cmd->HasSwitch(cc::switches::kDisable4444Textures); 301#elif !defined(OS_MACOSX) 302 if (cmd->HasSwitch(switches::kEnableOverlayScrollbars)) { 303 settings.scrollbar_animator = cc::LayerTreeSettings::Thinning; 304 settings.solid_color_scrollbars = true; 305 } 306 if (cmd->HasSwitch(cc::switches::kEnablePinchVirtualViewport) || 307 cmd->HasSwitch(switches::kEnableOverlayScrollbars)) { 308 settings.solid_color_scrollbar_color = SkColorSetARGB(128, 128, 128, 128); 309 } 310#endif 311 312 if (!compositor->initialize(settings)) 313 return scoped_ptr<RenderWidgetCompositor>(); 314 315 return compositor.Pass(); 316} 317 318RenderWidgetCompositor::RenderWidgetCompositor(RenderWidget* widget, 319 bool threaded) 320 : threaded_(threaded), 321 suppress_schedule_composite_(false), 322 widget_(widget) { 323} 324 325RenderWidgetCompositor::~RenderWidgetCompositor() {} 326 327const base::WeakPtr<cc::InputHandler>& 328RenderWidgetCompositor::GetInputHandler() { 329 return layer_tree_host_->GetInputHandler(); 330} 331 332void RenderWidgetCompositor::SetSuppressScheduleComposite(bool suppress) { 333 if (suppress_schedule_composite_ == suppress) 334 return; 335 336 if (suppress) 337 TRACE_EVENT_ASYNC_BEGIN0("gpu", 338 "RenderWidgetCompositor::SetSuppressScheduleComposite", this); 339 else 340 TRACE_EVENT_ASYNC_END0("gpu", 341 "RenderWidgetCompositor::SetSuppressScheduleComposite", this); 342 suppress_schedule_composite_ = suppress; 343} 344 345void RenderWidgetCompositor::Animate(base::TimeTicks time) { 346 layer_tree_host_->UpdateClientAnimations(time); 347} 348 349void RenderWidgetCompositor::Composite(base::TimeTicks frame_begin_time) { 350 layer_tree_host_->Composite(frame_begin_time); 351} 352 353void RenderWidgetCompositor::SetNeedsDisplayOnAllLayers() { 354 layer_tree_host_->SetNeedsDisplayOnAllLayers(); 355} 356 357void RenderWidgetCompositor::SetRasterizeOnlyVisibleContent() { 358 cc::LayerTreeDebugState current = layer_tree_host_->debug_state(); 359 current.rasterize_only_visible_content = true; 360 layer_tree_host_->SetDebugState(current); 361} 362 363void RenderWidgetCompositor::GetRenderingStats(cc::RenderingStats* stats) { 364 layer_tree_host_->CollectRenderingStats(stats); 365} 366 367void RenderWidgetCompositor::UpdateTopControlsState( 368 cc::TopControlsState constraints, 369 cc::TopControlsState current, 370 bool animate) { 371 layer_tree_host_->UpdateTopControlsState(constraints, 372 current, 373 animate); 374} 375 376void RenderWidgetCompositor::SetOverdrawBottomHeight( 377 float overdraw_bottom_height) { 378 layer_tree_host_->SetOverdrawBottomHeight(overdraw_bottom_height); 379} 380 381void RenderWidgetCompositor::SetNeedsRedrawRect(gfx::Rect damage_rect) { 382 layer_tree_host_->SetNeedsRedrawRect(damage_rect); 383} 384 385void RenderWidgetCompositor::SetNeedsForcedRedraw() { 386 layer_tree_host_->SetNextCommitForcesRedraw(); 387 setNeedsRedraw(); 388} 389 390void RenderWidgetCompositor::SetLatencyInfo( 391 const ui::LatencyInfo& latency_info) { 392 layer_tree_host_->SetLatencyInfo(latency_info); 393} 394 395int RenderWidgetCompositor::GetLayerTreeId() const { 396 return layer_tree_host_->id(); 397} 398 399void RenderWidgetCompositor::NotifyInputThrottledUntilCommit() { 400 layer_tree_host_->NotifyInputThrottledUntilCommit(); 401} 402 403const cc::Layer* RenderWidgetCompositor::GetRootLayer() const { 404 return layer_tree_host_->root_layer(); 405} 406 407bool RenderWidgetCompositor::ScheduleMicroBenchmark( 408 const std::string& name, 409 const base::Callback<void(scoped_ptr<base::Value>)>& callback) { 410 return layer_tree_host_->ScheduleMicroBenchmark(name, callback); 411} 412 413bool RenderWidgetCompositor::initialize(cc::LayerTreeSettings settings) { 414 scoped_refptr<base::MessageLoopProxy> compositor_message_loop_proxy = 415 RenderThreadImpl::current()->compositor_message_loop_proxy(); 416 layer_tree_host_ = cc::LayerTreeHost::Create(this, 417 settings, 418 compositor_message_loop_proxy); 419 return layer_tree_host_; 420} 421 422void RenderWidgetCompositor::setSurfaceReady() { 423 layer_tree_host_->SetLayerTreeHostClientReady(); 424} 425 426void RenderWidgetCompositor::setRootLayer(const WebKit::WebLayer& layer) { 427 layer_tree_host_->SetRootLayer( 428 static_cast<const webkit::WebLayerImpl*>(&layer)->layer()); 429} 430 431void RenderWidgetCompositor::clearRootLayer() { 432 layer_tree_host_->SetRootLayer(scoped_refptr<cc::Layer>()); 433} 434 435void RenderWidgetCompositor::setViewportSize( 436 const WebSize&, 437 const WebSize& device_viewport_size) { 438 layer_tree_host_->SetViewportSize(device_viewport_size); 439} 440 441WebSize RenderWidgetCompositor::layoutViewportSize() const { 442 return layer_tree_host_->device_viewport_size(); 443} 444 445WebSize RenderWidgetCompositor::deviceViewportSize() const { 446 return layer_tree_host_->device_viewport_size(); 447} 448 449WebFloatPoint RenderWidgetCompositor::adjustEventPointForPinchZoom( 450 const WebFloatPoint& point) const { 451 return point; 452} 453 454void RenderWidgetCompositor::setDeviceScaleFactor(float device_scale) { 455 layer_tree_host_->SetDeviceScaleFactor(device_scale); 456} 457 458float RenderWidgetCompositor::deviceScaleFactor() const { 459 return layer_tree_host_->device_scale_factor(); 460} 461 462void RenderWidgetCompositor::setBackgroundColor(WebKit::WebColor color) { 463 layer_tree_host_->set_background_color(color); 464} 465 466void RenderWidgetCompositor::setHasTransparentBackground(bool transparent) { 467 layer_tree_host_->set_has_transparent_background(transparent); 468} 469 470void RenderWidgetCompositor::setOverhangBitmap(const SkBitmap& bitmap) { 471 layer_tree_host_->SetOverhangBitmap(bitmap); 472} 473 474void RenderWidgetCompositor::setVisible(bool visible) { 475 layer_tree_host_->SetVisible(visible); 476} 477 478void RenderWidgetCompositor::setPageScaleFactorAndLimits( 479 float page_scale_factor, float minimum, float maximum) { 480 layer_tree_host_->SetPageScaleFactorAndLimits( 481 page_scale_factor, minimum, maximum); 482} 483 484void RenderWidgetCompositor::startPageScaleAnimation( 485 const WebKit::WebPoint& destination, 486 bool use_anchor, 487 float new_page_scale, 488 double duration_sec) { 489 base::TimeDelta duration = base::TimeDelta::FromMicroseconds( 490 duration_sec * base::Time::kMicrosecondsPerSecond); 491 layer_tree_host_->StartPageScaleAnimation( 492 gfx::Vector2d(destination.x, destination.y), 493 use_anchor, 494 new_page_scale, 495 duration); 496} 497 498void RenderWidgetCompositor::setNeedsAnimate() { 499 layer_tree_host_->SetNeedsAnimate(); 500} 501 502void RenderWidgetCompositor::setNeedsRedraw() { 503 if (threaded_) 504 layer_tree_host_->SetNeedsAnimate(); 505 else 506 widget_->scheduleAnimation(); 507} 508 509bool RenderWidgetCompositor::commitRequested() const { 510 return layer_tree_host_->CommitRequested(); 511} 512 513void RenderWidgetCompositor::didStopFlinging() { 514 layer_tree_host_->DidStopFlinging(); 515} 516 517void RenderWidgetCompositor::registerForAnimations(WebKit::WebLayer* layer) { 518 cc::Layer* cc_layer = static_cast<webkit::WebLayerImpl*>(layer)->layer(); 519 cc_layer->layer_animation_controller()->SetAnimationRegistrar( 520 layer_tree_host_->animation_registrar()); 521} 522 523void RenderWidgetCompositor::registerViewportLayers( 524 const WebKit::WebLayer* pageScaleLayer, 525 const WebKit::WebLayer* innerViewportScrollLayer, 526 const WebKit::WebLayer* outerViewportScrollLayer) { 527 layer_tree_host_->RegisterViewportLayers( 528 static_cast<const webkit::WebLayerImpl*>(pageScaleLayer)->layer(), 529 static_cast<const webkit::WebLayerImpl*>(innerViewportScrollLayer) 530 ->layer(), 531 // The outer viewport layer will only exist when using pinch virtual 532 // viewports. 533 outerViewportScrollLayer ? static_cast<const webkit::WebLayerImpl*>( 534 outerViewportScrollLayer)->layer() 535 : NULL); 536} 537 538void RenderWidgetCompositor::clearViewportLayers() { 539 layer_tree_host_->RegisterViewportLayers(scoped_refptr<cc::Layer>(), 540 scoped_refptr<cc::Layer>(), 541 scoped_refptr<cc::Layer>()); 542} 543 544bool RenderWidgetCompositor::compositeAndReadback( 545 void *pixels, const WebRect& rect_in_device_viewport) { 546 return layer_tree_host_->CompositeAndReadback(pixels, 547 rect_in_device_viewport); 548} 549 550void RenderWidgetCompositor::finishAllRendering() { 551 layer_tree_host_->FinishAllRendering(); 552} 553 554void RenderWidgetCompositor::setDeferCommits(bool defer_commits) { 555 layer_tree_host_->SetDeferCommits(defer_commits); 556} 557 558void RenderWidgetCompositor::setShowFPSCounter(bool show) { 559 cc::LayerTreeDebugState debug_state = layer_tree_host_->debug_state(); 560 debug_state.show_fps_counter = show; 561 layer_tree_host_->SetDebugState(debug_state); 562} 563 564void RenderWidgetCompositor::setShowPaintRects(bool show) { 565 cc::LayerTreeDebugState debug_state = layer_tree_host_->debug_state(); 566 debug_state.show_paint_rects = show; 567 layer_tree_host_->SetDebugState(debug_state); 568} 569 570void RenderWidgetCompositor::setShowDebugBorders(bool show) { 571 cc::LayerTreeDebugState debug_state = layer_tree_host_->debug_state(); 572 debug_state.show_debug_borders = show; 573 layer_tree_host_->SetDebugState(debug_state); 574} 575 576void RenderWidgetCompositor::setContinuousPaintingEnabled(bool enabled) { 577 cc::LayerTreeDebugState debug_state = layer_tree_host_->debug_state(); 578 debug_state.continuous_painting = enabled; 579 layer_tree_host_->SetDebugState(debug_state); 580} 581 582void RenderWidgetCompositor::setShowScrollBottleneckRects(bool show) { 583 cc::LayerTreeDebugState debug_state = layer_tree_host_->debug_state(); 584 debug_state.show_touch_event_handler_rects = show; 585 debug_state.show_wheel_event_handler_rects = show; 586 debug_state.show_non_fast_scrollable_rects = show; 587 layer_tree_host_->SetDebugState(debug_state); 588} 589 590void RenderWidgetCompositor::WillBeginFrame() { 591 widget_->InstrumentWillBeginFrame(); 592 widget_->willBeginCompositorFrame(); 593} 594 595void RenderWidgetCompositor::DidBeginFrame() { 596 widget_->InstrumentDidBeginFrame(); 597} 598 599void RenderWidgetCompositor::Animate(double frame_begin_time) { 600 widget_->webwidget()->animate(frame_begin_time); 601} 602 603void RenderWidgetCompositor::Layout() { 604 widget_->webwidget()->layout(); 605} 606 607void RenderWidgetCompositor::ApplyScrollAndScale(gfx::Vector2d scroll_delta, 608 float page_scale) { 609 widget_->webwidget()->applyScrollAndScale(scroll_delta, page_scale); 610} 611 612scoped_ptr<cc::OutputSurface> RenderWidgetCompositor::CreateOutputSurface( 613 bool fallback) { 614 return widget_->CreateOutputSurface(fallback); 615} 616 617void RenderWidgetCompositor::DidInitializeOutputSurface(bool success) { 618 if (!success) 619 widget_->webwidget()->didExitCompositingMode(); 620} 621 622void RenderWidgetCompositor::WillCommit() { 623 widget_->InstrumentWillComposite(); 624} 625 626void RenderWidgetCompositor::DidCommit() { 627 widget_->DidCommitCompositorFrame(); 628 widget_->didBecomeReadyForAdditionalInput(); 629} 630 631void RenderWidgetCompositor::DidCommitAndDrawFrame() { 632 widget_->didCommitAndDrawCompositorFrame(); 633} 634 635void RenderWidgetCompositor::DidCompleteSwapBuffers() { 636 widget_->didCompleteSwapBuffers(); 637} 638 639void RenderWidgetCompositor::ScheduleComposite() { 640 if (!suppress_schedule_composite_) 641 widget_->scheduleComposite(); 642} 643 644scoped_refptr<cc::ContextProvider> 645RenderWidgetCompositor::OffscreenContextProvider() { 646 return RenderThreadImpl::current()->OffscreenCompositorContextProvider(); 647} 648 649} // namespace content 650