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
3 // found in the LICENSE file.
5 #include "content/renderer/gpu/render_widget_compositor.h"
10 #if defined(OS_ANDROID)
11 #include "base/android/sys_utils.h"
14 #include "base/command_line.h"
15 #include "base/logging.h"
16 #include "base/strings/string_number_conversions.h"
17 #include "base/synchronization/lock.h"
18 #include "base/time/time.h"
19 #include "base/values.h"
20 #include "cc/base/latency_info_swap_promise.h"
21 #include "cc/base/latency_info_swap_promise_monitor.h"
22 #include "cc/base/switches.h"
23 #include "cc/debug/layer_tree_debug_state.h"
24 #include "cc/debug/micro_benchmark.h"
25 #include "cc/layers/layer.h"
26 #include "cc/trees/layer_tree_host.h"
27 #include "content/common/content_switches_internal.h"
28 #include "content/common/gpu/client/context_provider_command_buffer.h"
29 #include "content/public/common/content_switches.h"
30 #include "content/renderer/input/input_handler_manager.h"
31 #include "content/renderer/render_thread_impl.h"
32 #include "gpu/command_buffer/client/gles2_interface.h"
33 #include "third_party/WebKit/public/platform/WebSize.h"
34 #include "third_party/WebKit/public/web/WebWidget.h"
35 #include "ui/gl/gl_switches.h"
36 #include "webkit/renderer/compositor_bindings/web_layer_impl.h"
46 using blink::WebFloatPoint;
53 bool GetSwitchValueAsInt(
54 const CommandLine& command_line,
55 const std::string& switch_string,
59 std::string string_value = command_line.GetSwitchValueASCII(switch_string);
61 if (base::StringToInt(string_value, &int_value) &&
62 int_value >= min_value && int_value <= max_value) {
66 LOG(WARNING) << "Failed to parse switch " << switch_string << ": " <<
75 scoped_ptr<RenderWidgetCompositor> RenderWidgetCompositor::Create(
78 scoped_ptr<RenderWidgetCompositor> compositor(
79 new RenderWidgetCompositor(widget, threaded));
81 CommandLine* cmd = CommandLine::ForCurrentProcess();
83 cc::LayerTreeSettings settings;
85 // For web contents, layer transforms should scale up the contents of layers
86 // to keep content always crisp when possible.
87 settings.layer_transforms_should_scale_layer_contents = true;
89 settings.throttle_frame_production =
90 !cmd->HasSwitch(switches::kDisableGpuVsync);
91 settings.begin_impl_frame_scheduling_enabled =
92 cmd->HasSwitch(switches::kEnableBeginFrameScheduling);
93 settings.deadline_scheduling_enabled =
94 cmd->HasSwitch(switches::kEnableDeadlineScheduling) &&
95 !cmd->HasSwitch(switches::kDisableDeadlineScheduling);
96 settings.using_synchronous_renderer_compositor =
97 widget->UsingSynchronousRendererCompositor();
98 settings.per_tile_painting_enabled =
99 cmd->HasSwitch(cc::switches::kEnablePerTilePainting);
100 settings.accelerated_animation_enabled =
101 !cmd->HasSwitch(cc::switches::kDisableThreadedAnimation);
102 settings.touch_hit_testing =
103 !cmd->HasSwitch(cc::switches::kDisableCompositorTouchHitTesting);
105 int default_tile_width = settings.default_tile_size.width();
106 if (cmd->HasSwitch(switches::kDefaultTileWidth)) {
107 GetSwitchValueAsInt(*cmd, switches::kDefaultTileWidth, 1,
108 std::numeric_limits<int>::max(), &default_tile_width);
110 int default_tile_height = settings.default_tile_size.height();
111 if (cmd->HasSwitch(switches::kDefaultTileHeight)) {
112 GetSwitchValueAsInt(*cmd, switches::kDefaultTileHeight, 1,
113 std::numeric_limits<int>::max(), &default_tile_height);
115 settings.default_tile_size = gfx::Size(default_tile_width,
116 default_tile_height);
118 int max_untiled_layer_width = settings.max_untiled_layer_size.width();
119 if (cmd->HasSwitch(switches::kMaxUntiledLayerWidth)) {
120 GetSwitchValueAsInt(*cmd, switches::kMaxUntiledLayerWidth, 1,
121 std::numeric_limits<int>::max(),
122 &max_untiled_layer_width);
124 int max_untiled_layer_height = settings.max_untiled_layer_size.height();
125 if (cmd->HasSwitch(switches::kMaxUntiledLayerHeight)) {
126 GetSwitchValueAsInt(*cmd, switches::kMaxUntiledLayerHeight, 1,
127 std::numeric_limits<int>::max(),
128 &max_untiled_layer_height);
131 settings.max_untiled_layer_size = gfx::Size(max_untiled_layer_width,
132 max_untiled_layer_height);
134 settings.impl_side_painting = cc::switches::IsImplSidePaintingEnabled();
135 settings.gpu_rasterization = cc::switches::IsGpuRasterizationEnabled();
137 settings.calculate_top_controls_position =
138 cmd->HasSwitch(cc::switches::kEnableTopControlsPositionCalculation);
139 if (cmd->HasSwitch(cc::switches::kTopControlsHeight)) {
140 std::string controls_height_str =
141 cmd->GetSwitchValueASCII(cc::switches::kTopControlsHeight);
142 double controls_height;
143 if (base::StringToDouble(controls_height_str, &controls_height) &&
145 settings.top_controls_height = controls_height;
148 if (settings.calculate_top_controls_position &&
149 settings.top_controls_height <= 0) {
151 << "Top controls repositioning enabled without valid height set.";
152 settings.calculate_top_controls_position = false;
155 if (cmd->HasSwitch(cc::switches::kTopControlsShowThreshold)) {
156 std::string top_threshold_str =
157 cmd->GetSwitchValueASCII(cc::switches::kTopControlsShowThreshold);
158 double show_threshold;
159 if (base::StringToDouble(top_threshold_str, &show_threshold) &&
160 show_threshold >= 0.f && show_threshold <= 1.f)
161 settings.top_controls_show_threshold = show_threshold;
164 if (cmd->HasSwitch(cc::switches::kTopControlsHideThreshold)) {
165 std::string top_threshold_str =
166 cmd->GetSwitchValueASCII(cc::switches::kTopControlsHideThreshold);
167 double hide_threshold;
168 if (base::StringToDouble(top_threshold_str, &hide_threshold) &&
169 hide_threshold >= 0.f && hide_threshold <= 1.f)
170 settings.top_controls_hide_threshold = hide_threshold;
173 settings.partial_swap_enabled = widget->AllowPartialSwap();
174 settings.background_color_instead_of_checkerboard =
175 cmd->HasSwitch(cc::switches::kBackgroundColorInsteadOfCheckerboard);
176 settings.show_overdraw_in_tracing =
177 cmd->HasSwitch(cc::switches::kTraceOverdraw);
178 settings.can_use_lcd_text = cc::switches::IsLCDTextEnabled();
179 settings.use_pinch_virtual_viewport =
180 cmd->HasSwitch(cc::switches::kEnablePinchVirtualViewport);
181 settings.allow_antialiasing &=
182 !cmd->HasSwitch(cc::switches::kDisableCompositedAntialiasing);
184 // These flags should be mirrored by UI versions in ui/compositor/.
185 settings.initial_debug_state.show_debug_borders =
186 cmd->HasSwitch(cc::switches::kShowCompositedLayerBorders);
187 settings.initial_debug_state.show_fps_counter =
188 cmd->HasSwitch(cc::switches::kShowFPSCounter);
189 settings.initial_debug_state.show_layer_animation_bounds_rects =
190 cmd->HasSwitch(cc::switches::kShowLayerAnimationBounds);
191 settings.initial_debug_state.show_paint_rects =
192 cmd->HasSwitch(switches::kShowPaintRects);
193 settings.initial_debug_state.show_property_changed_rects =
194 cmd->HasSwitch(cc::switches::kShowPropertyChangedRects);
195 settings.initial_debug_state.show_surface_damage_rects =
196 cmd->HasSwitch(cc::switches::kShowSurfaceDamageRects);
197 settings.initial_debug_state.show_screen_space_rects =
198 cmd->HasSwitch(cc::switches::kShowScreenSpaceRects);
199 settings.initial_debug_state.show_replica_screen_space_rects =
200 cmd->HasSwitch(cc::switches::kShowReplicaScreenSpaceRects);
201 settings.initial_debug_state.show_occluding_rects =
202 cmd->HasSwitch(cc::switches::kShowOccludingRects);
203 settings.initial_debug_state.show_non_occluding_rects =
204 cmd->HasSwitch(cc::switches::kShowNonOccludingRects);
206 settings.initial_debug_state.SetRecordRenderingStats(
207 cmd->HasSwitch(cc::switches::kEnableGpuBenchmarking));
209 if (cmd->HasSwitch(cc::switches::kSlowDownRasterScaleFactor)) {
210 const int kMinSlowDownScaleFactor = 0;
211 const int kMaxSlowDownScaleFactor = INT_MAX;
214 cc::switches::kSlowDownRasterScaleFactor,
215 kMinSlowDownScaleFactor,
216 kMaxSlowDownScaleFactor,
217 &settings.initial_debug_state.slow_down_raster_scale_factor);
220 if (cmd->HasSwitch(cc::switches::kMaxTilesForInterestArea)) {
221 int max_tiles_for_interest_area;
222 if (GetSwitchValueAsInt(*cmd,
223 cc::switches::kMaxTilesForInterestArea,
224 1, std::numeric_limits<int>::max(),
225 &max_tiles_for_interest_area))
226 settings.max_tiles_for_interest_area = max_tiles_for_interest_area;
229 if (cmd->HasSwitch(cc::switches::kMaxUnusedResourceMemoryUsagePercentage)) {
230 int max_unused_resource_memory_percentage;
231 if (GetSwitchValueAsInt(
233 cc::switches::kMaxUnusedResourceMemoryUsagePercentage,
235 &max_unused_resource_memory_percentage)) {
236 settings.max_unused_resource_memory_percentage =
237 max_unused_resource_memory_percentage;
241 settings.strict_layer_property_change_checking =
242 cmd->HasSwitch(cc::switches::kStrictLayerPropertyChangeChecking);
244 settings.use_map_image = cc::switches::IsMapImageEnabled();
246 #if defined(OS_ANDROID)
247 // TODO(danakj): Move these to the android code.
248 settings.max_partial_texture_updates = 0;
249 settings.scrollbar_animator = cc::LayerTreeSettings::LinearFade;
250 settings.solid_color_scrollbar_color =
251 cmd->HasSwitch(switches::kHideScrollbars)
252 ? SK_ColorTRANSPARENT
253 : SkColorSetARGB(128, 128, 128, 128);
254 settings.highp_threshold_min = 2048;
255 // Android WebView handles root layer flings itself.
256 settings.ignore_root_layer_flings =
257 widget->UsingSynchronousRendererCompositor();
258 // RGBA_4444 textures are only enabled for low end devices
259 // and are disabled for Android WebView as it doesn't support the format.
260 settings.use_rgba_4444_textures =
261 base::android::SysUtils::IsLowEndDevice() &&
262 !widget->UsingSynchronousRendererCompositor() &&
263 !cmd->HasSwitch(cc::switches::kDisable4444Textures);
264 if (widget->UsingSynchronousRendererCompositor()) {
265 // TODO(boliu): Set this ratio for Webview.
266 } else if (base::android::SysUtils::IsLowEndDevice()) {
267 // On low-end we want to be very carefull about killing other
268 // apps. So initially we use 50% more memory to avoid flickering
269 // or raster-on-demand.
270 settings.max_memory_for_prepaint_percentage = 67;
272 // On other devices we have increased memory excessively to avoid
273 // raster-on-demand already, so now we reserve 50% _only_ to avoid
274 // raster-on-demand, and use 50% of the memory otherwise.
275 settings.max_memory_for_prepaint_percentage = 50;
278 #elif !defined(OS_MACOSX)
279 if (IsOverlayScrollbarEnabled()) {
280 #if defined(OS_TIZEN)
281 // Tizen fades out the scrollbar after contents interaction ends.
282 settings.scrollbar_animator = cc::LayerTreeSettings::LinearFade;
284 settings.scrollbar_animator = cc::LayerTreeSettings::Thinning;
286 settings.solid_color_scrollbar_color = SkColorSetARGB(128, 128, 128, 128);
287 } else if (cmd->HasSwitch(cc::switches::kEnablePinchVirtualViewport)) {
288 settings.scrollbar_animator = cc::LayerTreeSettings::LinearFade;
289 settings.solid_color_scrollbar_color = SkColorSetARGB(128, 128, 128, 128);
293 compositor->Initialize(settings);
295 return compositor.Pass();
298 RenderWidgetCompositor::RenderWidgetCompositor(RenderWidget* widget,
300 : threaded_(threaded),
301 suppress_schedule_composite_(false),
305 RenderWidgetCompositor::~RenderWidgetCompositor() {}
307 const base::WeakPtr<cc::InputHandler>&
308 RenderWidgetCompositor::GetInputHandler() {
309 return layer_tree_host_->GetInputHandler();
312 void RenderWidgetCompositor::SetSuppressScheduleComposite(bool suppress) {
313 if (suppress_schedule_composite_ == suppress)
317 TRACE_EVENT_ASYNC_BEGIN0("gpu",
318 "RenderWidgetCompositor::SetSuppressScheduleComposite", this);
320 TRACE_EVENT_ASYNC_END0("gpu",
321 "RenderWidgetCompositor::SetSuppressScheduleComposite", this);
322 suppress_schedule_composite_ = suppress;
325 bool RenderWidgetCompositor::BeginMainFrameRequested() const {
326 return layer_tree_host_->BeginMainFrameRequested();
329 void RenderWidgetCompositor::UpdateAnimations(base::TimeTicks time) {
330 layer_tree_host_->UpdateClientAnimations(time);
333 void RenderWidgetCompositor::Composite(base::TimeTicks frame_begin_time) {
334 layer_tree_host_->Composite(frame_begin_time);
337 void RenderWidgetCompositor::SetNeedsDisplayOnAllLayers() {
338 layer_tree_host_->SetNeedsDisplayOnAllLayers();
341 void RenderWidgetCompositor::SetRasterizeOnlyVisibleContent() {
342 cc::LayerTreeDebugState current = layer_tree_host_->debug_state();
343 current.rasterize_only_visible_content = true;
344 layer_tree_host_->SetDebugState(current);
347 void RenderWidgetCompositor::UpdateTopControlsState(
348 cc::TopControlsState constraints,
349 cc::TopControlsState current,
351 layer_tree_host_->UpdateTopControlsState(constraints,
356 void RenderWidgetCompositor::SetOverdrawBottomHeight(
357 float overdraw_bottom_height) {
358 layer_tree_host_->SetOverdrawBottomHeight(overdraw_bottom_height);
361 void RenderWidgetCompositor::SetNeedsRedrawRect(gfx::Rect damage_rect) {
362 layer_tree_host_->SetNeedsRedrawRect(damage_rect);
365 void RenderWidgetCompositor::SetNeedsForcedRedraw() {
366 layer_tree_host_->SetNextCommitForcesRedraw();
370 scoped_ptr<cc::SwapPromiseMonitor>
371 RenderWidgetCompositor::CreateLatencyInfoSwapPromiseMonitor(
372 ui::LatencyInfo* latency) {
373 return scoped_ptr<cc::SwapPromiseMonitor>(
374 new cc::LatencyInfoSwapPromiseMonitor(
375 latency, layer_tree_host_.get(), NULL));
378 int RenderWidgetCompositor::GetLayerTreeId() const {
379 return layer_tree_host_->id();
382 void RenderWidgetCompositor::NotifyInputThrottledUntilCommit() {
383 layer_tree_host_->NotifyInputThrottledUntilCommit();
386 const cc::Layer* RenderWidgetCompositor::GetRootLayer() const {
387 return layer_tree_host_->root_layer();
390 bool RenderWidgetCompositor::ScheduleMicroBenchmark(
391 const std::string& name,
392 scoped_ptr<base::Value> value,
393 const base::Callback<void(scoped_ptr<base::Value>)>& callback) {
394 return layer_tree_host_->ScheduleMicroBenchmark(name, value.Pass(), callback);
397 void RenderWidgetCompositor::Initialize(cc::LayerTreeSettings settings) {
398 scoped_refptr<base::MessageLoopProxy> compositor_message_loop_proxy =
399 RenderThreadImpl::current()->compositor_message_loop_proxy();
400 if (compositor_message_loop_proxy.get()) {
401 layer_tree_host_ = cc::LayerTreeHost::CreateThreaded(
402 this, NULL, settings, compositor_message_loop_proxy);
404 layer_tree_host_ = cc::LayerTreeHost::CreateSingleThreaded(
405 this, this, NULL, settings);
407 DCHECK(layer_tree_host_);
410 void RenderWidgetCompositor::setSurfaceReady() {
411 layer_tree_host_->SetLayerTreeHostClientReady();
414 void RenderWidgetCompositor::setRootLayer(const blink::WebLayer& layer) {
415 layer_tree_host_->SetRootLayer(
416 static_cast<const webkit::WebLayerImpl*>(&layer)->layer());
419 void RenderWidgetCompositor::clearRootLayer() {
420 layer_tree_host_->SetRootLayer(scoped_refptr<cc::Layer>());
423 void RenderWidgetCompositor::setViewportSize(
425 const WebSize& device_viewport_size) {
426 layer_tree_host_->SetViewportSize(device_viewport_size);
429 WebSize RenderWidgetCompositor::layoutViewportSize() const {
430 return layer_tree_host_->device_viewport_size();
433 WebSize RenderWidgetCompositor::deviceViewportSize() const {
434 return layer_tree_host_->device_viewport_size();
437 WebFloatPoint RenderWidgetCompositor::adjustEventPointForPinchZoom(
438 const WebFloatPoint& point) const {
442 void RenderWidgetCompositor::setDeviceScaleFactor(float device_scale) {
443 layer_tree_host_->SetDeviceScaleFactor(device_scale);
446 float RenderWidgetCompositor::deviceScaleFactor() const {
447 return layer_tree_host_->device_scale_factor();
450 void RenderWidgetCompositor::setBackgroundColor(blink::WebColor color) {
451 layer_tree_host_->set_background_color(color);
454 void RenderWidgetCompositor::setHasTransparentBackground(bool transparent) {
455 layer_tree_host_->set_has_transparent_background(transparent);
458 void RenderWidgetCompositor::setOverhangBitmap(const SkBitmap& bitmap) {
459 layer_tree_host_->SetOverhangBitmap(bitmap);
462 void RenderWidgetCompositor::setVisible(bool visible) {
463 layer_tree_host_->SetVisible(visible);
466 void RenderWidgetCompositor::setPageScaleFactorAndLimits(
467 float page_scale_factor, float minimum, float maximum) {
468 layer_tree_host_->SetPageScaleFactorAndLimits(
469 page_scale_factor, minimum, maximum);
472 void RenderWidgetCompositor::startPageScaleAnimation(
473 const blink::WebPoint& destination,
475 float new_page_scale,
476 double duration_sec) {
477 base::TimeDelta duration = base::TimeDelta::FromMicroseconds(
478 duration_sec * base::Time::kMicrosecondsPerSecond);
479 layer_tree_host_->StartPageScaleAnimation(
480 gfx::Vector2d(destination.x, destination.y),
486 void RenderWidgetCompositor::setNeedsAnimate() {
487 layer_tree_host_->SetNeedsAnimate();
490 bool RenderWidgetCompositor::commitRequested() const {
491 return layer_tree_host_->CommitRequested();
494 void RenderWidgetCompositor::didStopFlinging() {
495 layer_tree_host_->DidStopFlinging();
498 void RenderWidgetCompositor::registerForAnimations(blink::WebLayer* layer) {
499 cc::Layer* cc_layer = static_cast<webkit::WebLayerImpl*>(layer)->layer();
500 cc_layer->layer_animation_controller()->SetAnimationRegistrar(
501 layer_tree_host_->animation_registrar());
504 void RenderWidgetCompositor::registerViewportLayers(
505 const blink::WebLayer* pageScaleLayer,
506 const blink::WebLayer* innerViewportScrollLayer,
507 const blink::WebLayer* outerViewportScrollLayer) {
508 layer_tree_host_->RegisterViewportLayers(
509 static_cast<const webkit::WebLayerImpl*>(pageScaleLayer)->layer(),
510 static_cast<const webkit::WebLayerImpl*>(innerViewportScrollLayer)
512 // The outer viewport layer will only exist when using pinch virtual
514 outerViewportScrollLayer ? static_cast<const webkit::WebLayerImpl*>(
515 outerViewportScrollLayer)->layer()
519 void RenderWidgetCompositor::clearViewportLayers() {
520 layer_tree_host_->RegisterViewportLayers(scoped_refptr<cc::Layer>(),
521 scoped_refptr<cc::Layer>(),
522 scoped_refptr<cc::Layer>());
525 bool RenderWidgetCompositor::compositeAndReadback(
526 void *pixels, const WebRect& rect_in_device_viewport) {
527 return layer_tree_host_->CompositeAndReadback(pixels,
528 rect_in_device_viewport);
531 void RenderWidgetCompositor::finishAllRendering() {
532 layer_tree_host_->FinishAllRendering();
535 void RenderWidgetCompositor::setDeferCommits(bool defer_commits) {
536 layer_tree_host_->SetDeferCommits(defer_commits);
539 void RenderWidgetCompositor::setShowFPSCounter(bool show) {
540 cc::LayerTreeDebugState debug_state = layer_tree_host_->debug_state();
541 debug_state.show_fps_counter = show;
542 layer_tree_host_->SetDebugState(debug_state);
545 void RenderWidgetCompositor::setShowPaintRects(bool show) {
546 cc::LayerTreeDebugState debug_state = layer_tree_host_->debug_state();
547 debug_state.show_paint_rects = show;
548 layer_tree_host_->SetDebugState(debug_state);
551 void RenderWidgetCompositor::setShowDebugBorders(bool show) {
552 cc::LayerTreeDebugState debug_state = layer_tree_host_->debug_state();
553 debug_state.show_debug_borders = show;
554 layer_tree_host_->SetDebugState(debug_state);
557 void RenderWidgetCompositor::setContinuousPaintingEnabled(bool enabled) {
558 cc::LayerTreeDebugState debug_state = layer_tree_host_->debug_state();
559 debug_state.continuous_painting = enabled;
560 layer_tree_host_->SetDebugState(debug_state);
563 void RenderWidgetCompositor::setShowScrollBottleneckRects(bool show) {
564 cc::LayerTreeDebugState debug_state = layer_tree_host_->debug_state();
565 debug_state.show_touch_event_handler_rects = show;
566 debug_state.show_wheel_event_handler_rects = show;
567 debug_state.show_non_fast_scrollable_rects = show;
568 layer_tree_host_->SetDebugState(debug_state);
571 void RenderWidgetCompositor::WillBeginMainFrame(int frame_id) {
572 widget_->InstrumentWillBeginFrame(frame_id);
573 widget_->willBeginCompositorFrame();
576 void RenderWidgetCompositor::DidBeginMainFrame() {
577 widget_->InstrumentDidBeginFrame();
580 void RenderWidgetCompositor::Animate(base::TimeTicks frame_begin_time) {
581 widget_->webwidget()->animate(
582 (frame_begin_time - base::TimeTicks()).InSecondsF());
585 void RenderWidgetCompositor::Layout() {
586 widget_->webwidget()->layout();
589 void RenderWidgetCompositor::ApplyScrollAndScale(
590 const gfx::Vector2d& scroll_delta,
592 widget_->webwidget()->applyScrollAndScale(scroll_delta, page_scale);
595 scoped_ptr<cc::OutputSurface> RenderWidgetCompositor::CreateOutputSurface(
597 return widget_->CreateOutputSurface(fallback);
600 void RenderWidgetCompositor::DidInitializeOutputSurface(bool success) {
602 widget_->webwidget()->didExitCompositingMode();
605 void RenderWidgetCompositor::WillCommit() {
606 widget_->InstrumentWillComposite();
609 void RenderWidgetCompositor::DidCommit() {
610 widget_->DidCommitCompositorFrame();
611 widget_->didBecomeReadyForAdditionalInput();
614 void RenderWidgetCompositor::DidCommitAndDrawFrame() {
615 widget_->didCommitAndDrawCompositorFrame();
618 void RenderWidgetCompositor::DidCompleteSwapBuffers() {
619 widget_->didCompleteSwapBuffers();
621 widget_->OnSwapBuffersComplete();
624 scoped_refptr<cc::ContextProvider>
625 RenderWidgetCompositor::OffscreenContextProvider() {
626 return RenderThreadImpl::current()->OffscreenCompositorContextProvider();
629 void RenderWidgetCompositor::ScheduleComposite() {
630 if (!suppress_schedule_composite_)
631 widget_->scheduleComposite();
634 void RenderWidgetCompositor::ScheduleAnimation() {
635 widget_->scheduleAnimation();
638 void RenderWidgetCompositor::DidPostSwapBuffers() {
639 widget_->OnSwapBuffersPosted();
642 void RenderWidgetCompositor::DidAbortSwapBuffers() {
643 widget_->OnSwapBuffersAborted();
646 void RenderWidgetCompositor::RateLimitSharedMainThreadContext() {
647 cc::ContextProvider* provider =
648 RenderThreadImpl::current()->SharedMainThreadContextProvider().get();
649 provider->ContextGL()->RateLimitOffscreenContextCHROMIUM();
652 } // namespace content