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/child/child_shared_bitmap_manager.h"
28 #include "content/common/content_switches_internal.h"
29 #include "content/common/gpu/client/context_provider_command_buffer.h"
30 #include "content/public/common/content_switches.h"
31 #include "content/renderer/input/input_handler_manager.h"
32 #include "content/renderer/render_thread_impl.h"
33 #include "gpu/command_buffer/client/gles2_interface.h"
34 #include "third_party/WebKit/public/platform/WebSize.h"
35 #include "third_party/WebKit/public/web/WebWidget.h"
36 #include "ui/gl/gl_switches.h"
37 #include "ui/native_theme/native_theme_switches.h"
38 #include "webkit/renderer/compositor_bindings/web_layer_impl.h"
48 using blink::WebFloatPoint;
55 bool GetSwitchValueAsInt(
56 const CommandLine& command_line,
57 const std::string& switch_string,
61 std::string string_value = command_line.GetSwitchValueASCII(switch_string);
63 if (base::StringToInt(string_value, &int_value) &&
64 int_value >= min_value && int_value <= max_value) {
68 LOG(WARNING) << "Failed to parse switch " << switch_string << ": " <<
77 scoped_ptr<RenderWidgetCompositor> RenderWidgetCompositor::Create(
80 scoped_ptr<RenderWidgetCompositor> compositor(
81 new RenderWidgetCompositor(widget, threaded));
83 CommandLine* cmd = CommandLine::ForCurrentProcess();
85 cc::LayerTreeSettings settings;
87 // For web contents, layer transforms should scale up the contents of layers
88 // to keep content always crisp when possible.
89 settings.layer_transforms_should_scale_layer_contents = true;
91 settings.throttle_frame_production =
92 !cmd->HasSwitch(switches::kDisableGpuVsync);
93 settings.begin_impl_frame_scheduling_enabled =
94 cmd->HasSwitch(switches::kEnableBeginFrameScheduling);
95 settings.main_frame_before_activation_enabled =
96 cmd->HasSwitch(cc::switches::kEnableMainFrameBeforeActivation) &&
97 !cmd->HasSwitch(cc::switches::kDisableMainFrameBeforeActivation);
98 settings.main_frame_before_draw_enabled =
99 !cmd->HasSwitch(cc::switches::kDisableMainFrameBeforeDraw);
100 settings.using_synchronous_renderer_compositor =
101 widget->UsingSynchronousRendererCompositor();
102 settings.accelerated_animation_enabled =
103 !cmd->HasSwitch(cc::switches::kDisableThreadedAnimation);
104 settings.touch_hit_testing =
105 !cmd->HasSwitch(cc::switches::kDisableCompositorTouchHitTesting) &&
106 !cmd->HasSwitch(switches::kEnableBleedingEdgeRenderingFastPaths);
108 int default_tile_width = settings.default_tile_size.width();
109 if (cmd->HasSwitch(switches::kDefaultTileWidth)) {
110 GetSwitchValueAsInt(*cmd, switches::kDefaultTileWidth, 1,
111 std::numeric_limits<int>::max(), &default_tile_width);
113 int default_tile_height = settings.default_tile_size.height();
114 if (cmd->HasSwitch(switches::kDefaultTileHeight)) {
115 GetSwitchValueAsInt(*cmd, switches::kDefaultTileHeight, 1,
116 std::numeric_limits<int>::max(), &default_tile_height);
118 settings.default_tile_size = gfx::Size(default_tile_width,
119 default_tile_height);
121 int max_untiled_layer_width = settings.max_untiled_layer_size.width();
122 if (cmd->HasSwitch(switches::kMaxUntiledLayerWidth)) {
123 GetSwitchValueAsInt(*cmd, switches::kMaxUntiledLayerWidth, 1,
124 std::numeric_limits<int>::max(),
125 &max_untiled_layer_width);
127 int max_untiled_layer_height = settings.max_untiled_layer_size.height();
128 if (cmd->HasSwitch(switches::kMaxUntiledLayerHeight)) {
129 GetSwitchValueAsInt(*cmd, switches::kMaxUntiledLayerHeight, 1,
130 std::numeric_limits<int>::max(),
131 &max_untiled_layer_height);
134 settings.max_untiled_layer_size = gfx::Size(max_untiled_layer_width,
135 max_untiled_layer_height);
137 settings.impl_side_painting =
138 RenderThreadImpl::current()->is_impl_side_painting_enabled();
139 if (RenderThreadImpl::current()->is_gpu_rasterization_forced())
140 settings.rasterization_site = cc::LayerTreeSettings::GpuRasterization;
141 else if (RenderThreadImpl::current()->is_gpu_rasterization_enabled())
142 settings.rasterization_site = cc::LayerTreeSettings::HybridRasterization;
144 settings.rasterization_site = cc::LayerTreeSettings::CpuRasterization;
145 settings.create_low_res_tiling =
146 RenderThreadImpl::current()->is_low_res_tiling_enabled();
148 settings.calculate_top_controls_position =
149 cmd->HasSwitch(cc::switches::kEnableTopControlsPositionCalculation);
150 if (cmd->HasSwitch(cc::switches::kTopControlsHeight)) {
151 std::string controls_height_str =
152 cmd->GetSwitchValueASCII(cc::switches::kTopControlsHeight);
153 double controls_height;
154 if (base::StringToDouble(controls_height_str, &controls_height) &&
156 settings.top_controls_height = controls_height;
159 if (settings.calculate_top_controls_position &&
160 settings.top_controls_height <= 0) {
162 << "Top controls repositioning enabled without valid height set.";
163 settings.calculate_top_controls_position = false;
166 if (cmd->HasSwitch(cc::switches::kTopControlsShowThreshold)) {
167 std::string top_threshold_str =
168 cmd->GetSwitchValueASCII(cc::switches::kTopControlsShowThreshold);
169 double show_threshold;
170 if (base::StringToDouble(top_threshold_str, &show_threshold) &&
171 show_threshold >= 0.f && show_threshold <= 1.f)
172 settings.top_controls_show_threshold = show_threshold;
175 if (cmd->HasSwitch(cc::switches::kTopControlsHideThreshold)) {
176 std::string top_threshold_str =
177 cmd->GetSwitchValueASCII(cc::switches::kTopControlsHideThreshold);
178 double hide_threshold;
179 if (base::StringToDouble(top_threshold_str, &hide_threshold) &&
180 hide_threshold >= 0.f && hide_threshold <= 1.f)
181 settings.top_controls_hide_threshold = hide_threshold;
184 settings.can_use_lcd_text =
185 RenderThreadImpl::current()->is_lcd_text_enabled();
186 settings.use_pinch_virtual_viewport =
187 cmd->HasSwitch(cc::switches::kEnablePinchVirtualViewport);
188 settings.allow_antialiasing &=
189 !cmd->HasSwitch(cc::switches::kDisableCompositedAntialiasing);
191 // These flags should be mirrored by UI versions in ui/compositor/.
192 settings.initial_debug_state.show_debug_borders =
193 cmd->HasSwitch(cc::switches::kShowCompositedLayerBorders);
194 settings.initial_debug_state.show_fps_counter =
195 cmd->HasSwitch(cc::switches::kShowFPSCounter);
196 settings.initial_debug_state.show_layer_animation_bounds_rects =
197 cmd->HasSwitch(cc::switches::kShowLayerAnimationBounds);
198 settings.initial_debug_state.show_paint_rects =
199 cmd->HasSwitch(switches::kShowPaintRects);
200 settings.initial_debug_state.show_property_changed_rects =
201 cmd->HasSwitch(cc::switches::kShowPropertyChangedRects);
202 settings.initial_debug_state.show_surface_damage_rects =
203 cmd->HasSwitch(cc::switches::kShowSurfaceDamageRects);
204 settings.initial_debug_state.show_screen_space_rects =
205 cmd->HasSwitch(cc::switches::kShowScreenSpaceRects);
206 settings.initial_debug_state.show_replica_screen_space_rects =
207 cmd->HasSwitch(cc::switches::kShowReplicaScreenSpaceRects);
208 settings.initial_debug_state.show_occluding_rects =
209 cmd->HasSwitch(cc::switches::kShowOccludingRects);
210 settings.initial_debug_state.show_non_occluding_rects =
211 cmd->HasSwitch(cc::switches::kShowNonOccludingRects);
213 settings.initial_debug_state.SetRecordRenderingStats(
214 cmd->HasSwitch(cc::switches::kEnableGpuBenchmarking));
216 if (cmd->HasSwitch(cc::switches::kSlowDownRasterScaleFactor)) {
217 const int kMinSlowDownScaleFactor = 0;
218 const int kMaxSlowDownScaleFactor = INT_MAX;
221 cc::switches::kSlowDownRasterScaleFactor,
222 kMinSlowDownScaleFactor,
223 kMaxSlowDownScaleFactor,
224 &settings.initial_debug_state.slow_down_raster_scale_factor);
227 if (cmd->HasSwitch(cc::switches::kMaxTilesForInterestArea)) {
228 int max_tiles_for_interest_area;
229 if (GetSwitchValueAsInt(*cmd,
230 cc::switches::kMaxTilesForInterestArea,
231 1, std::numeric_limits<int>::max(),
232 &max_tiles_for_interest_area))
233 settings.max_tiles_for_interest_area = max_tiles_for_interest_area;
236 if (cmd->HasSwitch(cc::switches::kMaxUnusedResourceMemoryUsagePercentage)) {
237 int max_unused_resource_memory_percentage;
238 if (GetSwitchValueAsInt(
240 cc::switches::kMaxUnusedResourceMemoryUsagePercentage,
242 &max_unused_resource_memory_percentage)) {
243 settings.max_unused_resource_memory_percentage =
244 max_unused_resource_memory_percentage;
248 settings.strict_layer_property_change_checking =
249 cmd->HasSwitch(cc::switches::kStrictLayerPropertyChangeChecking);
251 settings.use_map_image = RenderThreadImpl::current()->is_map_image_enabled();
253 #if defined(OS_ANDROID)
254 settings.max_partial_texture_updates = 0;
255 settings.scrollbar_animator = cc::LayerTreeSettings::LinearFade;
256 settings.solid_color_scrollbar_color =
257 (widget->UsingSynchronousRendererCompositor()) // It is Android Webview.
258 ? SK_ColorTRANSPARENT
259 : SkColorSetARGB(128, 128, 128, 128);
260 settings.highp_threshold_min = 2048;
261 // Android WebView handles root layer flings itself.
262 settings.ignore_root_layer_flings =
263 widget->UsingSynchronousRendererCompositor();
264 // RGBA_4444 textures are only enabled for low end devices
265 // and are disabled for Android WebView as it doesn't support the format.
266 settings.use_rgba_4444_textures =
267 base::android::SysUtils::IsLowEndDevice() &&
268 !widget->UsingSynchronousRendererCompositor();
269 if (widget->UsingSynchronousRendererCompositor()) {
270 // TODO(boliu): Set this ratio for Webview.
271 } else if (base::android::SysUtils::IsLowEndDevice()) {
272 // On low-end we want to be very carefull about killing other
273 // apps. So initially we use 50% more memory to avoid flickering
274 // or raster-on-demand.
275 settings.max_memory_for_prepaint_percentage = 67;
277 // On other devices we have increased memory excessively to avoid
278 // raster-on-demand already, so now we reserve 50% _only_ to avoid
279 // raster-on-demand, and use 50% of the memory otherwise.
280 settings.max_memory_for_prepaint_percentage = 50;
282 // Webview does not own the surface so should not clear it.
283 settings.should_clear_root_render_pass =
284 !widget->UsingSynchronousRendererCompositor();
286 #elif !defined(OS_MACOSX)
287 if (ui::IsOverlayScrollbarEnabled()) {
288 #if defined(OS_TIZEN)
289 // Tizen fades out the scrollbar after contents interaction ends.
290 settings.scrollbar_animator = cc::LayerTreeSettings::LinearFade;
292 settings.scrollbar_animator = cc::LayerTreeSettings::Thinning;
294 settings.solid_color_scrollbar_color = SkColorSetARGB(128, 128, 128, 128);
295 } else if (cmd->HasSwitch(cc::switches::kEnablePinchVirtualViewport)) {
296 settings.scrollbar_animator = cc::LayerTreeSettings::LinearFade;
297 settings.solid_color_scrollbar_color = SkColorSetARGB(128, 128, 128, 128);
301 compositor->Initialize(settings);
303 return compositor.Pass();
306 RenderWidgetCompositor::RenderWidgetCompositor(RenderWidget* widget,
308 : threaded_(threaded),
309 suppress_schedule_composite_(false),
313 RenderWidgetCompositor::~RenderWidgetCompositor() {}
315 const base::WeakPtr<cc::InputHandler>&
316 RenderWidgetCompositor::GetInputHandler() {
317 return layer_tree_host_->GetInputHandler();
320 void RenderWidgetCompositor::SetSuppressScheduleComposite(bool suppress) {
321 if (suppress_schedule_composite_ == suppress)
325 TRACE_EVENT_ASYNC_BEGIN0("gpu",
326 "RenderWidgetCompositor::SetSuppressScheduleComposite", this);
328 TRACE_EVENT_ASYNC_END0("gpu",
329 "RenderWidgetCompositor::SetSuppressScheduleComposite", this);
330 suppress_schedule_composite_ = suppress;
333 bool RenderWidgetCompositor::BeginMainFrameRequested() const {
334 return layer_tree_host_->BeginMainFrameRequested();
337 void RenderWidgetCompositor::UpdateAnimations(base::TimeTicks time) {
338 layer_tree_host_->UpdateClientAnimations(time);
341 void RenderWidgetCompositor::Composite(base::TimeTicks frame_begin_time) {
342 layer_tree_host_->Composite(frame_begin_time);
345 void RenderWidgetCompositor::SetNeedsDisplayOnAllLayers() {
346 layer_tree_host_->SetNeedsDisplayOnAllLayers();
349 void RenderWidgetCompositor::SetRasterizeOnlyVisibleContent() {
350 cc::LayerTreeDebugState current = layer_tree_host_->debug_state();
351 current.rasterize_only_visible_content = true;
352 layer_tree_host_->SetDebugState(current);
355 void RenderWidgetCompositor::UpdateTopControlsState(
356 cc::TopControlsState constraints,
357 cc::TopControlsState current,
359 layer_tree_host_->UpdateTopControlsState(constraints,
364 void RenderWidgetCompositor::SetOverdrawBottomHeight(
365 float overdraw_bottom_height) {
366 layer_tree_host_->SetOverdrawBottomHeight(overdraw_bottom_height);
369 void RenderWidgetCompositor::SetNeedsRedrawRect(gfx::Rect damage_rect) {
370 layer_tree_host_->SetNeedsRedrawRect(damage_rect);
373 void RenderWidgetCompositor::SetNeedsForcedRedraw() {
374 layer_tree_host_->SetNextCommitForcesRedraw();
378 scoped_ptr<cc::SwapPromiseMonitor>
379 RenderWidgetCompositor::CreateLatencyInfoSwapPromiseMonitor(
380 ui::LatencyInfo* latency) {
381 return scoped_ptr<cc::SwapPromiseMonitor>(
382 new cc::LatencyInfoSwapPromiseMonitor(
383 latency, layer_tree_host_.get(), NULL));
386 int RenderWidgetCompositor::GetLayerTreeId() const {
387 return layer_tree_host_->id();
390 void RenderWidgetCompositor::NotifyInputThrottledUntilCommit() {
391 layer_tree_host_->NotifyInputThrottledUntilCommit();
394 const cc::Layer* RenderWidgetCompositor::GetRootLayer() const {
395 return layer_tree_host_->root_layer();
398 bool RenderWidgetCompositor::ScheduleMicroBenchmark(
399 const std::string& name,
400 scoped_ptr<base::Value> value,
401 const base::Callback<void(scoped_ptr<base::Value>)>& callback) {
402 return layer_tree_host_->ScheduleMicroBenchmark(name, value.Pass(), callback);
405 void RenderWidgetCompositor::Initialize(cc::LayerTreeSettings settings) {
406 scoped_refptr<base::MessageLoopProxy> compositor_message_loop_proxy =
407 RenderThreadImpl::current()->compositor_message_loop_proxy();
408 if (compositor_message_loop_proxy.get()) {
409 layer_tree_host_ = cc::LayerTreeHost::CreateThreaded(
411 ChildThread::current()->shared_bitmap_manager(),
413 compositor_message_loop_proxy);
415 layer_tree_host_ = cc::LayerTreeHost::CreateSingleThreaded(
416 this, this, ChildThread::current()->shared_bitmap_manager(), settings);
418 DCHECK(layer_tree_host_);
421 void RenderWidgetCompositor::setSurfaceReady() {
422 layer_tree_host_->SetLayerTreeHostClientReady();
425 void RenderWidgetCompositor::setRootLayer(const blink::WebLayer& layer) {
426 layer_tree_host_->SetRootLayer(
427 static_cast<const webkit::WebLayerImpl*>(&layer)->layer());
430 void RenderWidgetCompositor::clearRootLayer() {
431 layer_tree_host_->SetRootLayer(scoped_refptr<cc::Layer>());
434 void RenderWidgetCompositor::setViewportSize(
436 const WebSize& device_viewport_size) {
437 layer_tree_host_->SetViewportSize(device_viewport_size);
440 WebSize RenderWidgetCompositor::layoutViewportSize() const {
441 return layer_tree_host_->device_viewport_size();
444 WebSize RenderWidgetCompositor::deviceViewportSize() const {
445 return layer_tree_host_->device_viewport_size();
448 WebFloatPoint RenderWidgetCompositor::adjustEventPointForPinchZoom(
449 const WebFloatPoint& point) const {
453 void RenderWidgetCompositor::setDeviceScaleFactor(float device_scale) {
454 layer_tree_host_->SetDeviceScaleFactor(device_scale);
457 float RenderWidgetCompositor::deviceScaleFactor() const {
458 return layer_tree_host_->device_scale_factor();
461 void RenderWidgetCompositor::setBackgroundColor(blink::WebColor color) {
462 layer_tree_host_->set_background_color(color);
465 void RenderWidgetCompositor::setHasTransparentBackground(bool transparent) {
466 layer_tree_host_->set_has_transparent_background(transparent);
469 void RenderWidgetCompositor::setOverhangBitmap(const SkBitmap& bitmap) {
470 layer_tree_host_->SetOverhangBitmap(bitmap);
473 void RenderWidgetCompositor::setVisible(bool visible) {
474 layer_tree_host_->SetVisible(visible);
477 void RenderWidgetCompositor::setPageScaleFactorAndLimits(
478 float page_scale_factor, float minimum, float maximum) {
479 layer_tree_host_->SetPageScaleFactorAndLimits(
480 page_scale_factor, minimum, maximum);
483 void RenderWidgetCompositor::startPageScaleAnimation(
484 const blink::WebPoint& destination,
486 float new_page_scale,
487 double duration_sec) {
488 base::TimeDelta duration = base::TimeDelta::FromMicroseconds(
489 duration_sec * base::Time::kMicrosecondsPerSecond);
490 layer_tree_host_->StartPageScaleAnimation(
491 gfx::Vector2d(destination.x, destination.y),
497 void RenderWidgetCompositor::setNeedsAnimate() {
498 layer_tree_host_->SetNeedsAnimate();
501 bool RenderWidgetCompositor::commitRequested() const {
502 return layer_tree_host_->CommitRequested();
505 void RenderWidgetCompositor::didStopFlinging() {
506 layer_tree_host_->DidStopFlinging();
509 void RenderWidgetCompositor::registerForAnimations(blink::WebLayer* layer) {
510 cc::Layer* cc_layer = static_cast<webkit::WebLayerImpl*>(layer)->layer();
511 cc_layer->layer_animation_controller()->SetAnimationRegistrar(
512 layer_tree_host_->animation_registrar());
515 void RenderWidgetCompositor::registerViewportLayers(
516 const blink::WebLayer* pageScaleLayer,
517 const blink::WebLayer* innerViewportScrollLayer,
518 const blink::WebLayer* outerViewportScrollLayer) {
519 layer_tree_host_->RegisterViewportLayers(
520 static_cast<const webkit::WebLayerImpl*>(pageScaleLayer)->layer(),
521 static_cast<const webkit::WebLayerImpl*>(innerViewportScrollLayer)
523 // The outer viewport layer will only exist when using pinch virtual
525 outerViewportScrollLayer ? static_cast<const webkit::WebLayerImpl*>(
526 outerViewportScrollLayer)->layer()
530 void RenderWidgetCompositor::clearViewportLayers() {
531 layer_tree_host_->RegisterViewportLayers(scoped_refptr<cc::Layer>(),
532 scoped_refptr<cc::Layer>(),
533 scoped_refptr<cc::Layer>());
536 bool RenderWidgetCompositor::compositeAndReadback(
537 void *pixels, const WebRect& rect_in_device_viewport) {
538 return layer_tree_host_->CompositeAndReadback(pixels,
539 rect_in_device_viewport);
542 void RenderWidgetCompositor::finishAllRendering() {
543 layer_tree_host_->FinishAllRendering();
546 void RenderWidgetCompositor::setDeferCommits(bool defer_commits) {
547 layer_tree_host_->SetDeferCommits(defer_commits);
550 void RenderWidgetCompositor::setShowFPSCounter(bool show) {
551 cc::LayerTreeDebugState debug_state = layer_tree_host_->debug_state();
552 debug_state.show_fps_counter = show;
553 layer_tree_host_->SetDebugState(debug_state);
556 void RenderWidgetCompositor::setShowPaintRects(bool show) {
557 cc::LayerTreeDebugState debug_state = layer_tree_host_->debug_state();
558 debug_state.show_paint_rects = show;
559 layer_tree_host_->SetDebugState(debug_state);
562 void RenderWidgetCompositor::setShowDebugBorders(bool show) {
563 cc::LayerTreeDebugState debug_state = layer_tree_host_->debug_state();
564 debug_state.show_debug_borders = show;
565 layer_tree_host_->SetDebugState(debug_state);
568 void RenderWidgetCompositor::setContinuousPaintingEnabled(bool enabled) {
569 cc::LayerTreeDebugState debug_state = layer_tree_host_->debug_state();
570 debug_state.continuous_painting = enabled;
571 layer_tree_host_->SetDebugState(debug_state);
574 void RenderWidgetCompositor::setShowScrollBottleneckRects(bool show) {
575 cc::LayerTreeDebugState debug_state = layer_tree_host_->debug_state();
576 debug_state.show_touch_event_handler_rects = show;
577 debug_state.show_wheel_event_handler_rects = show;
578 debug_state.show_non_fast_scrollable_rects = show;
579 layer_tree_host_->SetDebugState(debug_state);
582 void RenderWidgetCompositor::WillBeginMainFrame(int frame_id) {
583 widget_->InstrumentWillBeginFrame(frame_id);
584 widget_->willBeginCompositorFrame();
587 void RenderWidgetCompositor::DidBeginMainFrame() {
588 widget_->InstrumentDidBeginFrame();
591 void RenderWidgetCompositor::Animate(base::TimeTicks frame_begin_time) {
592 widget_->webwidget()->animate(
593 (frame_begin_time - base::TimeTicks()).InSecondsF());
596 void RenderWidgetCompositor::Layout() {
597 widget_->webwidget()->layout();
600 void RenderWidgetCompositor::ApplyScrollAndScale(
601 const gfx::Vector2d& scroll_delta,
603 widget_->webwidget()->applyScrollAndScale(scroll_delta, page_scale);
606 scoped_ptr<cc::OutputSurface> RenderWidgetCompositor::CreateOutputSurface(
608 return widget_->CreateOutputSurface(fallback);
611 void RenderWidgetCompositor::DidInitializeOutputSurface(bool success) {
613 widget_->webwidget()->didExitCompositingMode();
616 void RenderWidgetCompositor::WillCommit() {
617 widget_->InstrumentWillComposite();
620 void RenderWidgetCompositor::DidCommit() {
621 widget_->DidCommitCompositorFrame();
622 widget_->didBecomeReadyForAdditionalInput();
625 void RenderWidgetCompositor::DidCommitAndDrawFrame() {
626 widget_->didCommitAndDrawCompositorFrame();
629 void RenderWidgetCompositor::DidCompleteSwapBuffers() {
630 widget_->didCompleteSwapBuffers();
632 widget_->OnSwapBuffersComplete();
635 scoped_refptr<cc::ContextProvider>
636 RenderWidgetCompositor::OffscreenContextProvider() {
637 return RenderThreadImpl::current()->OffscreenCompositorContextProvider();
640 void RenderWidgetCompositor::ScheduleComposite() {
641 if (!suppress_schedule_composite_)
642 widget_->scheduleComposite();
645 void RenderWidgetCompositor::ScheduleAnimation() {
646 widget_->scheduleAnimation();
649 void RenderWidgetCompositor::DidPostSwapBuffers() {
650 widget_->OnSwapBuffersPosted();
653 void RenderWidgetCompositor::DidAbortSwapBuffers() {
654 widget_->OnSwapBuffersAborted();
657 void RenderWidgetCompositor::RateLimitSharedMainThreadContext() {
658 cc::ContextProvider* provider =
659 RenderThreadImpl::current()->SharedMainThreadContextProvider().get();
660 provider->ContextGL()->RateLimitOffscreenContextCHROMIUM();
663 } // namespace content