| 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 <stddef.h> | 7 #include <stddef.h> |
| 8 #include <limits> | 8 #include <limits> |
| 9 #include <string> | 9 #include <string> |
| 10 #include <utility> | 10 #include <utility> |
| (...skipping 27 matching lines...) Expand all Loading... |
| 38 #include "cc/proto/compositor_message.pb.h" | 38 #include "cc/proto/compositor_message.pb.h" |
| 39 #include "cc/resources/single_release_callback.h" | 39 #include "cc/resources/single_release_callback.h" |
| 40 #include "cc/scheduler/begin_frame_source.h" | 40 #include "cc/scheduler/begin_frame_source.h" |
| 41 #include "cc/trees/latency_info_swap_promise_monitor.h" | 41 #include "cc/trees/latency_info_swap_promise_monitor.h" |
| 42 #include "cc/trees/layer_tree_host.h" | 42 #include "cc/trees/layer_tree_host.h" |
| 43 #include "cc/trees/remote_proto_channel.h" | 43 #include "cc/trees/remote_proto_channel.h" |
| 44 #include "components/scheduler/renderer/renderer_scheduler.h" | 44 #include "components/scheduler/renderer/renderer_scheduler.h" |
| 45 #include "content/common/content_switches_internal.h" | 45 #include "content/common/content_switches_internal.h" |
| 46 #include "content/common/gpu/client/context_provider_command_buffer.h" | 46 #include "content/common/gpu/client/context_provider_command_buffer.h" |
| 47 #include "content/public/common/content_switches.h" | 47 #include "content/public/common/content_switches.h" |
| 48 #include "content/renderer/gpu/render_widget_compositor_delegate.h" | |
| 49 #include "content/renderer/input/input_handler_manager.h" | 48 #include "content/renderer/input/input_handler_manager.h" |
| 50 #include "gpu/command_buffer/client/gles2_interface.h" | 49 #include "gpu/command_buffer/client/gles2_interface.h" |
| 51 #include "gpu/command_buffer/service/gpu_switches.h" | 50 #include "gpu/command_buffer/service/gpu_switches.h" |
| 52 #include "third_party/WebKit/public/platform/WebCompositeAndReadbackAsyncCallbac
k.h" | 51 #include "third_party/WebKit/public/platform/WebCompositeAndReadbackAsyncCallbac
k.h" |
| 53 #include "third_party/WebKit/public/platform/WebLayoutAndPaintAsyncCallback.h" | 52 #include "third_party/WebKit/public/platform/WebLayoutAndPaintAsyncCallback.h" |
| 54 #include "third_party/WebKit/public/platform/WebSize.h" | 53 #include "third_party/WebKit/public/platform/WebSize.h" |
| 55 #include "third_party/WebKit/public/web/WebKit.h" | 54 #include "third_party/WebKit/public/web/WebKit.h" |
| 56 #include "third_party/WebKit/public/web/WebRuntimeFeatures.h" | 55 #include "third_party/WebKit/public/web/WebRuntimeFeatures.h" |
| 57 #include "third_party/WebKit/public/web/WebSelection.h" | 56 #include "third_party/WebKit/public/web/WebSelection.h" |
| 57 #include "third_party/WebKit/public/web/WebWidget.h" |
| 58 #include "ui/gl/gl_switches.h" | 58 #include "ui/gl/gl_switches.h" |
| 59 #include "ui/native_theme/native_theme_switches.h" | 59 #include "ui/native_theme/native_theme_switches.h" |
| 60 | 60 |
| 61 #if defined(OS_ANDROID) | 61 #if defined(OS_ANDROID) |
| 62 #include "base/android/build_info.h" | 62 #include "base/android/build_info.h" |
| 63 #include "content/renderer/android/synchronous_compositor_factory.h" | 63 #include "content/renderer/android/synchronous_compositor_factory.h" |
| 64 #include "ui/gfx/android/device_display_info.h" | 64 #include "ui/gfx/android/device_display_info.h" |
| 65 #endif | 65 #endif |
| 66 | 66 |
| 67 namespace base { | 67 namespace base { |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 128 cc::LayerSelection ConvertWebSelection(const WebSelection& web_selection) { | 128 cc::LayerSelection ConvertWebSelection(const WebSelection& web_selection) { |
| 129 cc::LayerSelection cc_selection; | 129 cc::LayerSelection cc_selection; |
| 130 cc_selection.start = ConvertWebSelectionBound(web_selection, true); | 130 cc_selection.start = ConvertWebSelectionBound(web_selection, true); |
| 131 cc_selection.end = ConvertWebSelectionBound(web_selection, false); | 131 cc_selection.end = ConvertWebSelectionBound(web_selection, false); |
| 132 cc_selection.is_editable = web_selection.isEditable(); | 132 cc_selection.is_editable = web_selection.isEditable(); |
| 133 cc_selection.is_empty_text_form_control = | 133 cc_selection.is_empty_text_form_control = |
| 134 web_selection.isEmptyTextFormControl(); | 134 web_selection.isEmptyTextFormControl(); |
| 135 return cc_selection; | 135 return cc_selection; |
| 136 } | 136 } |
| 137 | 137 |
| 138 gfx::Size CalculateDefaultTileSize(float initial_device_scale_factor) { | 138 gfx::Size CalculateDefaultTileSize(RenderWidget* widget) { |
| 139 int default_tile_size = 256; | 139 int default_tile_size = 256; |
| 140 #if defined(OS_ANDROID) | 140 #if defined(OS_ANDROID) |
| 141 // TODO(epenner): unify this for all platforms if it | 141 // TODO(epenner): unify this for all platforms if it |
| 142 // makes sense (http://crbug.com/159524) | 142 // makes sense (http://crbug.com/159524) |
| 143 | 143 |
| 144 gfx::DeviceDisplayInfo info; | 144 gfx::DeviceDisplayInfo info; |
| 145 bool real_size_supported = true; | 145 bool real_size_supported = true; |
| 146 int display_width = info.GetPhysicalDisplayWidth(); | 146 int display_width = info.GetPhysicalDisplayWidth(); |
| 147 int display_height = info.GetPhysicalDisplayHeight(); | 147 int display_height = info.GetPhysicalDisplayHeight(); |
| 148 if (display_width == 0 || display_height == 0) { | 148 if (display_width == 0 || display_height == 0) { |
| (...skipping 24 matching lines...) Expand all Loading... |
| 173 // We don't know the exact resolution due to screen controls etc. | 173 // We don't know the exact resolution due to screen controls etc. |
| 174 // So this just estimates the values above using tile counts. | 174 // So this just estimates the values above using tile counts. |
| 175 int numTiles = (display_width * display_height) / (256 * 256); | 175 int numTiles = (display_width * display_height) / (256 * 256); |
| 176 if (numTiles > 16) | 176 if (numTiles > 16) |
| 177 default_tile_size = 384; | 177 default_tile_size = 384; |
| 178 if (numTiles >= 40) | 178 if (numTiles >= 40) |
| 179 default_tile_size = 512; | 179 default_tile_size = 512; |
| 180 } | 180 } |
| 181 #elif defined(OS_CHROMEOS) | 181 #elif defined(OS_CHROMEOS) |
| 182 // Use 512 for high DPI (dsf=2.0f) devices. | 182 // Use 512 for high DPI (dsf=2.0f) devices. |
| 183 if (initial_device_scale_factor >= 2.0f) | 183 if (widget->screen_info().deviceScaleFactor >= 2.0f) |
| 184 default_tile_size = 512; | 184 default_tile_size = 512; |
| 185 #endif | 185 #endif |
| 186 | 186 |
| 187 return gfx::Size(default_tile_size, default_tile_size); | 187 return gfx::Size(default_tile_size, default_tile_size); |
| 188 } | 188 } |
| 189 | 189 |
| 190 // Check cc::TopControlsState, and blink::WebTopControlsState | 190 // Check cc::TopControlsState, and blink::WebTopControlsState |
| 191 // are kept in sync. | 191 // are kept in sync. |
| 192 static_assert(int(blink::WebTopControlsBoth) == int(cc::BOTH), | 192 static_assert(int(blink::WebTopControlsBoth) == int(cc::BOTH), |
| 193 "mismatching enums: BOTH"); | 193 "mismatching enums: BOTH"); |
| 194 static_assert(int(blink::WebTopControlsHidden) == int(cc::HIDDEN), | 194 static_assert(int(blink::WebTopControlsHidden) == int(cc::HIDDEN), |
| 195 "mismatching enums: HIDDEN"); | 195 "mismatching enums: HIDDEN"); |
| 196 static_assert(int(blink::WebTopControlsShown) == int(cc::SHOWN), | 196 static_assert(int(blink::WebTopControlsShown) == int(cc::SHOWN), |
| 197 "mismatching enums: SHOWN"); | 197 "mismatching enums: SHOWN"); |
| 198 | 198 |
| 199 static cc::TopControlsState ConvertTopControlsState( | 199 static cc::TopControlsState ConvertTopControlsState( |
| 200 WebTopControlsState state) { | 200 WebTopControlsState state) { |
| 201 return static_cast<cc::TopControlsState>(state); | 201 return static_cast<cc::TopControlsState>(state); |
| 202 } | 202 } |
| 203 | 203 |
| 204 } // namespace | 204 } // namespace |
| 205 | 205 |
| 206 // static | 206 // static |
| 207 scoped_ptr<RenderWidgetCompositor> RenderWidgetCompositor::Create( | 207 scoped_ptr<RenderWidgetCompositor> RenderWidgetCompositor::Create( |
| 208 RenderWidgetCompositorDelegate* delegate, | 208 RenderWidget* widget, |
| 209 float device_scale_factor, | |
| 210 CompositorDependencies* compositor_deps) { | 209 CompositorDependencies* compositor_deps) { |
| 211 scoped_ptr<RenderWidgetCompositor> compositor( | 210 scoped_ptr<RenderWidgetCompositor> compositor( |
| 212 new RenderWidgetCompositor(delegate, compositor_deps)); | 211 new RenderWidgetCompositor(widget, compositor_deps)); |
| 213 compositor->Initialize(device_scale_factor); | 212 compositor->Initialize(); |
| 214 return compositor; | 213 return compositor; |
| 215 } | 214 } |
| 216 | 215 |
| 217 RenderWidgetCompositor::RenderWidgetCompositor( | 216 RenderWidgetCompositor::RenderWidgetCompositor( |
| 218 RenderWidgetCompositorDelegate* delegate, | 217 RenderWidget* widget, |
| 219 CompositorDependencies* compositor_deps) | 218 CompositorDependencies* compositor_deps) |
| 220 : num_failed_recreate_attempts_(0), | 219 : num_failed_recreate_attempts_(0), |
| 221 delegate_(delegate), | 220 widget_(widget), |
| 222 compositor_deps_(compositor_deps), | 221 compositor_deps_(compositor_deps), |
| 223 never_visible_(false), | 222 never_visible_(false), |
| 224 layout_and_paint_async_callback_(nullptr), | 223 layout_and_paint_async_callback_(nullptr), |
| 225 remote_proto_channel_receiver_(nullptr), | 224 remote_proto_channel_receiver_(nullptr), |
| 226 weak_factory_(this) {} | 225 weak_factory_(this) { |
| 226 } |
| 227 | 227 |
| 228 void RenderWidgetCompositor::Initialize(float device_scale_factor) { | 228 void RenderWidgetCompositor::Initialize() { |
| 229 base::CommandLine* cmd = base::CommandLine::ForCurrentProcess(); | 229 base::CommandLine* cmd = base::CommandLine::ForCurrentProcess(); |
| 230 | 230 |
| 231 cc::LayerTreeSettings settings; | 231 cc::LayerTreeSettings settings; |
| 232 | 232 |
| 233 // For web contents, layer transforms should scale up the contents of layers | 233 // For web contents, layer transforms should scale up the contents of layers |
| 234 // to keep content always crisp when possible. | 234 // to keep content always crisp when possible. |
| 235 settings.layer_transforms_should_scale_layer_contents = true; | 235 settings.layer_transforms_should_scale_layer_contents = true; |
| 236 | 236 |
| 237 if (cmd->HasSwitch(switches::kDisableGpuVsync)) { | 237 if (cmd->HasSwitch(switches::kDisableGpuVsync)) { |
| 238 std::string display_vsync_string = | 238 std::string display_vsync_string = |
| (...skipping 11 matching lines...) Expand all Loading... |
| 250 cmd->HasSwitch(cc::switches::kEnableMainFrameBeforeActivation) && | 250 cmd->HasSwitch(cc::switches::kEnableMainFrameBeforeActivation) && |
| 251 !cmd->HasSwitch(cc::switches::kDisableMainFrameBeforeActivation); | 251 !cmd->HasSwitch(cc::switches::kDisableMainFrameBeforeActivation); |
| 252 settings.accelerated_animation_enabled = | 252 settings.accelerated_animation_enabled = |
| 253 compositor_deps_->IsThreadedAnimationEnabled(); | 253 compositor_deps_->IsThreadedAnimationEnabled(); |
| 254 | 254 |
| 255 settings.use_compositor_animation_timelines = | 255 settings.use_compositor_animation_timelines = |
| 256 !cmd->HasSwitch(switches::kDisableCompositorAnimationTimelines); | 256 !cmd->HasSwitch(switches::kDisableCompositorAnimationTimelines); |
| 257 blink::WebRuntimeFeatures::enableCompositorAnimationTimelines( | 257 blink::WebRuntimeFeatures::enableCompositorAnimationTimelines( |
| 258 settings.use_compositor_animation_timelines); | 258 settings.use_compositor_animation_timelines); |
| 259 | 259 |
| 260 settings.default_tile_size = CalculateDefaultTileSize(device_scale_factor); | 260 settings.default_tile_size = CalculateDefaultTileSize(widget_); |
| 261 if (cmd->HasSwitch(switches::kDefaultTileWidth)) { | 261 if (cmd->HasSwitch(switches::kDefaultTileWidth)) { |
| 262 int tile_width = 0; | 262 int tile_width = 0; |
| 263 GetSwitchValueAsInt(*cmd, | 263 GetSwitchValueAsInt(*cmd, |
| 264 switches::kDefaultTileWidth, | 264 switches::kDefaultTileWidth, |
| 265 1, | 265 1, |
| 266 std::numeric_limits<int>::max(), | 266 std::numeric_limits<int>::max(), |
| 267 &tile_width); | 267 &tile_width); |
| 268 settings.default_tile_size.set_width(tile_width); | 268 settings.default_tile_size.set_width(tile_width); |
| 269 } | 269 } |
| 270 if (cmd->HasSwitch(switches::kDefaultTileHeight)) { | 270 if (cmd->HasSwitch(switches::kDefaultTileHeight)) { |
| (...skipping 178 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 449 if (cmd->HasSwitch(switches::kDisableLowResTiling)) | 449 if (cmd->HasSwitch(switches::kDisableLowResTiling)) |
| 450 settings.create_low_res_tiling = false; | 450 settings.create_low_res_tiling = false; |
| 451 if (cmd->HasSwitch(cc::switches::kEnableBeginFrameScheduling)) | 451 if (cmd->HasSwitch(cc::switches::kEnableBeginFrameScheduling)) |
| 452 settings.use_external_begin_frame_source = true; | 452 settings.use_external_begin_frame_source = true; |
| 453 | 453 |
| 454 settings.renderer_settings.use_rgba_4444_textures |= | 454 settings.renderer_settings.use_rgba_4444_textures |= |
| 455 cmd->HasSwitch(switches::kEnableRGBA4444Textures); | 455 cmd->HasSwitch(switches::kEnableRGBA4444Textures); |
| 456 settings.renderer_settings.use_rgba_4444_textures &= | 456 settings.renderer_settings.use_rgba_4444_textures &= |
| 457 !cmd->HasSwitch(switches::kDisableRGBA4444Textures); | 457 !cmd->HasSwitch(switches::kDisableRGBA4444Textures); |
| 458 | 458 |
| 459 if (delegate_->ForOOPIF()) { | 459 if (widget_->for_oopif()) { |
| 460 // TODO(simonhong): Apply BeginFrame scheduling for OOPIF. | 460 // TODO(simonhong): Apply BeginFrame scheduling for OOPIF. |
| 461 // See crbug.com/471411. | 461 // See crbug.com/471411. |
| 462 settings.use_external_begin_frame_source = false; | 462 settings.use_external_begin_frame_source = false; |
| 463 } | 463 } |
| 464 | 464 |
| 465 settings.max_staging_buffer_usage_in_bytes = 32 * 1024 * 1024; // 32MB | 465 settings.max_staging_buffer_usage_in_bytes = 32 * 1024 * 1024; // 32MB |
| 466 // Use 1/4th of staging buffers on low-end devices. | 466 // Use 1/4th of staging buffers on low-end devices. |
| 467 if (base::SysInfo::IsLowEndDevice()) | 467 if (base::SysInfo::IsLowEndDevice()) |
| 468 settings.max_staging_buffer_usage_in_bytes /= 4; | 468 settings.max_staging_buffer_usage_in_bytes /= 4; |
| 469 | 469 |
| (...skipping 12 matching lines...) Expand all Loading... |
| 482 cc::TaskGraphRunner* task_graph_runner = | 482 cc::TaskGraphRunner* task_graph_runner = |
| 483 compositor_deps_->GetTaskGraphRunner(); | 483 compositor_deps_->GetTaskGraphRunner(); |
| 484 | 484 |
| 485 bool use_remote_compositing = cmd->HasSwitch(switches::kUseRemoteCompositing); | 485 bool use_remote_compositing = cmd->HasSwitch(switches::kUseRemoteCompositing); |
| 486 | 486 |
| 487 if (use_remote_compositing) | 487 if (use_remote_compositing) |
| 488 settings.use_external_begin_frame_source = false; | 488 settings.use_external_begin_frame_source = false; |
| 489 | 489 |
| 490 scoped_ptr<cc::BeginFrameSource> external_begin_frame_source; | 490 scoped_ptr<cc::BeginFrameSource> external_begin_frame_source; |
| 491 if (settings.use_external_begin_frame_source) { | 491 if (settings.use_external_begin_frame_source) { |
| 492 external_begin_frame_source = delegate_->CreateExternalBeginFrameSource(); | 492 external_begin_frame_source = |
| 493 compositor_deps_->CreateExternalBeginFrameSource(widget_->routing_id()); |
| 493 } | 494 } |
| 494 | 495 |
| 495 cc::LayerTreeHost::InitParams params; | 496 cc::LayerTreeHost::InitParams params; |
| 496 params.client = this; | 497 params.client = this; |
| 497 params.shared_bitmap_manager = shared_bitmap_manager; | 498 params.shared_bitmap_manager = shared_bitmap_manager; |
| 498 params.gpu_memory_buffer_manager = gpu_memory_buffer_manager; | 499 params.gpu_memory_buffer_manager = gpu_memory_buffer_manager; |
| 499 params.settings = &settings; | 500 params.settings = &settings; |
| 500 params.task_graph_runner = task_graph_runner; | 501 params.task_graph_runner = task_graph_runner; |
| 501 params.main_task_runner = main_thread_compositor_task_runner; | 502 params.main_task_runner = main_thread_compositor_task_runner; |
| 502 params.external_begin_frame_source = std::move(external_begin_frame_source); | 503 params.external_begin_frame_source = std::move(external_begin_frame_source); |
| (...skipping 354 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 857 | 858 |
| 858 void RenderWidgetCompositor::setTopControlsHeight(float height, bool shrink) { | 859 void RenderWidgetCompositor::setTopControlsHeight(float height, bool shrink) { |
| 859 layer_tree_host_->SetTopControlsHeight(height, shrink); | 860 layer_tree_host_->SetTopControlsHeight(height, shrink); |
| 860 } | 861 } |
| 861 | 862 |
| 862 void RenderWidgetCompositor::setTopControlsShownRatio(float ratio) { | 863 void RenderWidgetCompositor::setTopControlsShownRatio(float ratio) { |
| 863 layer_tree_host_->SetTopControlsShownRatio(ratio); | 864 layer_tree_host_->SetTopControlsShownRatio(ratio); |
| 864 } | 865 } |
| 865 | 866 |
| 866 void RenderWidgetCompositor::WillBeginMainFrame() { | 867 void RenderWidgetCompositor::WillBeginMainFrame() { |
| 867 delegate_->WillBeginCompositorFrame(); | 868 widget_->WillBeginCompositorFrame(); |
| 868 } | 869 } |
| 869 | 870 |
| 870 void RenderWidgetCompositor::DidBeginMainFrame() { | 871 void RenderWidgetCompositor::DidBeginMainFrame() { |
| 871 } | 872 } |
| 872 | 873 |
| 873 void RenderWidgetCompositor::BeginMainFrame(const cc::BeginFrameArgs& args) { | 874 void RenderWidgetCompositor::BeginMainFrame(const cc::BeginFrameArgs& args) { |
| 874 compositor_deps_->GetRendererScheduler()->WillBeginFrame(args); | 875 compositor_deps_->GetRendererScheduler()->WillBeginFrame(args); |
| 875 double frame_time_sec = (args.frame_time - base::TimeTicks()).InSecondsF(); | 876 double frame_time_sec = (args.frame_time - base::TimeTicks()).InSecondsF(); |
| 876 delegate_->BeginMainFrame(frame_time_sec); | 877 widget_->webwidget()->beginFrame(frame_time_sec); |
| 877 } | 878 } |
| 878 | 879 |
| 879 void RenderWidgetCompositor::BeginMainFrameNotExpectedSoon() { | 880 void RenderWidgetCompositor::BeginMainFrameNotExpectedSoon() { |
| 880 compositor_deps_->GetRendererScheduler()->BeginFrameNotExpectedSoon(); | 881 compositor_deps_->GetRendererScheduler()->BeginFrameNotExpectedSoon(); |
| 881 } | 882 } |
| 882 | 883 |
| 883 void RenderWidgetCompositor::UpdateLayerTreeHost() { | 884 void RenderWidgetCompositor::UpdateLayerTreeHost() { |
| 884 delegate_->UpdateVisualState(); | 885 widget_->webwidget()->updateAllLifecyclePhases(); |
| 886 |
| 885 if (temporary_copy_output_request_) { | 887 if (temporary_copy_output_request_) { |
| 886 // For WebViewImpl, this will always have a root layer. For other widgets, | 888 // For WebViewImpl, this will always have a root layer. For other widgets, |
| 887 // the widget may be closed before servicing this request, so ignore it. | 889 // the widget may be closed before servicing this request, so ignore it. |
| 888 if (cc::Layer* root_layer = layer_tree_host_->root_layer()) { | 890 if (cc::Layer* root_layer = layer_tree_host_->root_layer()) { |
| 889 root_layer->RequestCopyOfOutput( | 891 root_layer->RequestCopyOfOutput( |
| 890 std::move(temporary_copy_output_request_)); | 892 std::move(temporary_copy_output_request_)); |
| 891 } else { | 893 } else { |
| 892 temporary_copy_output_request_->SendEmptyResult(); | 894 temporary_copy_output_request_->SendEmptyResult(); |
| 893 temporary_copy_output_request_ = nullptr; | 895 temporary_copy_output_request_ = nullptr; |
| 894 } | 896 } |
| 895 } | 897 } |
| 896 } | 898 } |
| 897 | 899 |
| 898 void RenderWidgetCompositor::ApplyViewportDeltas( | 900 void RenderWidgetCompositor::ApplyViewportDeltas( |
| 899 const gfx::Vector2dF& inner_delta, | 901 const gfx::Vector2dF& inner_delta, |
| 900 const gfx::Vector2dF& outer_delta, | 902 const gfx::Vector2dF& outer_delta, |
| 901 const gfx::Vector2dF& elastic_overscroll_delta, | 903 const gfx::Vector2dF& elastic_overscroll_delta, |
| 902 float page_scale, | 904 float page_scale, |
| 903 float top_controls_delta) { | 905 float top_controls_delta) { |
| 904 delegate_->ApplyViewportDeltas(inner_delta, outer_delta, | 906 widget_->webwidget()->applyViewportDeltas( |
| 905 elastic_overscroll_delta, page_scale, | 907 inner_delta, |
| 906 top_controls_delta); | 908 outer_delta, |
| 909 elastic_overscroll_delta, |
| 910 page_scale, |
| 911 top_controls_delta); |
| 907 } | 912 } |
| 908 | 913 |
| 909 void RenderWidgetCompositor::RequestNewOutputSurface() { | 914 void RenderWidgetCompositor::RequestNewOutputSurface() { |
| 915 // If the host is closing, then no more compositing is possible. This |
| 916 // prevents shutdown races between handling the close message and |
| 917 // the CreateOutputSurface task. |
| 918 if (widget_->host_closing()) |
| 919 return; |
| 920 |
| 910 bool fallback = | 921 bool fallback = |
| 911 num_failed_recreate_attempts_ >= OUTPUT_SURFACE_RETRIES_BEFORE_FALLBACK; | 922 num_failed_recreate_attempts_ >= OUTPUT_SURFACE_RETRIES_BEFORE_FALLBACK; |
| 912 scoped_ptr<cc::OutputSurface> surface( | 923 scoped_ptr<cc::OutputSurface> surface(widget_->CreateOutputSurface(fallback)); |
| 913 delegate_->CreateOutputSurface(fallback)); | |
| 914 | 924 |
| 915 if (!surface) { | 925 if (!surface) { |
| 916 DidFailToInitializeOutputSurface(); | 926 DidFailToInitializeOutputSurface(); |
| 917 return; | 927 return; |
| 918 } | 928 } |
| 919 | 929 |
| 920 DCHECK_EQ(surface->capabilities().max_frames_pending, 1); | 930 DCHECK_EQ(surface->capabilities().max_frames_pending, 1); |
| 921 | 931 |
| 922 layer_tree_host_->SetOutputSurface(std::move(surface)); | 932 layer_tree_host_->SetOutputSurface(std::move(surface)); |
| 923 } | 933 } |
| (...skipping 13 matching lines...) Expand all Loading... |
| 937 FROM_HERE, base::Bind(&RenderWidgetCompositor::RequestNewOutputSurface, | 947 FROM_HERE, base::Bind(&RenderWidgetCompositor::RequestNewOutputSurface, |
| 938 weak_factory_.GetWeakPtr())); | 948 weak_factory_.GetWeakPtr())); |
| 939 } | 949 } |
| 940 | 950 |
| 941 void RenderWidgetCompositor::WillCommit() { | 951 void RenderWidgetCompositor::WillCommit() { |
| 942 InvokeLayoutAndPaintCallback(); | 952 InvokeLayoutAndPaintCallback(); |
| 943 } | 953 } |
| 944 | 954 |
| 945 void RenderWidgetCompositor::DidCommit() { | 955 void RenderWidgetCompositor::DidCommit() { |
| 946 DCHECK(!temporary_copy_output_request_); | 956 DCHECK(!temporary_copy_output_request_); |
| 947 delegate_->DidCommitCompositorFrame(); | 957 widget_->DidCommitCompositorFrame(); |
| 948 compositor_deps_->GetRendererScheduler()->DidCommitFrameToCompositor(); | 958 compositor_deps_->GetRendererScheduler()->DidCommitFrameToCompositor(); |
| 949 } | 959 } |
| 950 | 960 |
| 951 void RenderWidgetCompositor::DidCommitAndDrawFrame() { | 961 void RenderWidgetCompositor::DidCommitAndDrawFrame() { |
| 952 delegate_->DidCommitAndDrawCompositorFrame(); | 962 widget_->DidCommitAndDrawCompositorFrame(); |
| 953 } | 963 } |
| 954 | 964 |
| 955 void RenderWidgetCompositor::DidCompleteSwapBuffers() { | 965 void RenderWidgetCompositor::DidCompleteSwapBuffers() { |
| 956 delegate_->DidCompleteSwapBuffers(); | 966 widget_->DidCompleteSwapBuffers(); |
| 957 bool threaded = !!compositor_deps_->GetCompositorImplThreadTaskRunner().get(); | 967 bool threaded = !!compositor_deps_->GetCompositorImplThreadTaskRunner().get(); |
| 958 if (!threaded) | 968 if (!threaded) |
| 959 delegate_->OnSwapBuffersComplete(); | 969 widget_->OnSwapBuffersComplete(); |
| 960 } | 970 } |
| 961 | 971 |
| 962 void RenderWidgetCompositor::DidCompletePageScaleAnimation() { | 972 void RenderWidgetCompositor::DidCompletePageScaleAnimation() { |
| 963 delegate_->DidCompletePageScaleAnimation(); | 973 widget_->DidCompletePageScaleAnimation(); |
| 964 } | 974 } |
| 965 | 975 |
| 966 void RenderWidgetCompositor::ScheduleAnimation() { | 976 void RenderWidgetCompositor::ScheduleAnimation() { |
| 967 delegate_->ScheduleAnimation(); | 977 widget_->scheduleAnimation(); |
| 968 } | 978 } |
| 969 | 979 |
| 970 void RenderWidgetCompositor::DidPostSwapBuffers() { | 980 void RenderWidgetCompositor::DidPostSwapBuffers() { |
| 971 delegate_->OnSwapBuffersPosted(); | 981 widget_->OnSwapBuffersPosted(); |
| 972 } | 982 } |
| 973 | 983 |
| 974 void RenderWidgetCompositor::DidAbortSwapBuffers() { | 984 void RenderWidgetCompositor::DidAbortSwapBuffers() { |
| 975 delegate_->OnSwapBuffersAborted(); | 985 widget_->OnSwapBuffersAborted(); |
| 976 } | 986 } |
| 977 | 987 |
| 978 void RenderWidgetCompositor::SetProtoReceiver(ProtoReceiver* receiver) { | 988 void RenderWidgetCompositor::SetProtoReceiver(ProtoReceiver* receiver) { |
| 979 remote_proto_channel_receiver_ = receiver; | 989 remote_proto_channel_receiver_ = receiver; |
| 980 } | 990 } |
| 981 | 991 |
| 982 void RenderWidgetCompositor::SendCompositorProto( | 992 void RenderWidgetCompositor::SendCompositorProto( |
| 983 const cc::proto::CompositorMessage& proto) { | 993 const cc::proto::CompositorMessage& proto) { |
| 984 int signed_size = proto.ByteSize(); | 994 int signed_size = proto.ByteSize(); |
| 985 size_t unsigned_size = base::checked_cast<size_t>(signed_size); | 995 size_t unsigned_size = base::checked_cast<size_t>(signed_size); |
| 986 std::vector<uint8_t> serialized(unsigned_size); | 996 std::vector<uint8_t> serialized(unsigned_size); |
| 987 proto.SerializeToArray(serialized.data(), signed_size); | 997 proto.SerializeToArray(serialized.data(), signed_size); |
| 988 delegate_->ForwardCompositorProto(serialized); | 998 widget_->ForwardCompositorProto(serialized); |
| 989 } | 999 } |
| 990 | 1000 |
| 991 void RenderWidgetCompositor::RecordFrameTimingEvents( | 1001 void RenderWidgetCompositor::RecordFrameTimingEvents( |
| 992 scoped_ptr<cc::FrameTimingTracker::CompositeTimingSet> composite_events, | 1002 scoped_ptr<cc::FrameTimingTracker::CompositeTimingSet> composite_events, |
| 993 scoped_ptr<cc::FrameTimingTracker::MainFrameTimingSet> main_frame_events) { | 1003 scoped_ptr<cc::FrameTimingTracker::MainFrameTimingSet> main_frame_events) { |
| 994 delegate_->RecordFrameTimingEvents(std::move(composite_events), | 1004 for (const auto& composite_event : *composite_events ) { |
| 995 std::move(main_frame_events)); | 1005 int64_t frameId = composite_event.first; |
| 1006 const std::vector<cc::FrameTimingTracker::CompositeTimingEvent>& events = |
| 1007 composite_event.second; |
| 1008 std::vector<blink::WebFrameTimingEvent> webEvents; |
| 1009 for (size_t i = 0; i < events.size(); ++i) { |
| 1010 webEvents.push_back(blink::WebFrameTimingEvent( |
| 1011 events[i].frame_id, |
| 1012 (events[i].timestamp - base::TimeTicks()).InSecondsF())); |
| 1013 } |
| 1014 widget_->webwidget()->recordFrameTimingEvent( |
| 1015 blink::WebWidget::CompositeEvent, frameId, webEvents); |
| 1016 } |
| 1017 for (const auto& main_frame_event : *main_frame_events ) { |
| 1018 int64_t frameId = main_frame_event.first; |
| 1019 const std::vector<cc::FrameTimingTracker::MainFrameTimingEvent>& events = |
| 1020 main_frame_event.second; |
| 1021 std::vector<blink::WebFrameTimingEvent> webEvents; |
| 1022 for (size_t i = 0; i < events.size(); ++i) { |
| 1023 webEvents.push_back(blink::WebFrameTimingEvent( |
| 1024 events[i].frame_id, |
| 1025 (events[i].timestamp - base::TimeTicks()).InSecondsF(), |
| 1026 (events[i].end_time - base::TimeTicks()).InSecondsF())); |
| 1027 } |
| 1028 widget_->webwidget()->recordFrameTimingEvent( |
| 1029 blink::WebWidget::RenderEvent, frameId, webEvents); |
| 1030 } |
| 996 } | 1031 } |
| 997 | 1032 |
| 998 void RenderWidgetCompositor::SetSurfaceIdNamespace( | 1033 void RenderWidgetCompositor::SetSurfaceIdNamespace( |
| 999 uint32_t surface_id_namespace) { | 1034 uint32_t surface_id_namespace) { |
| 1000 layer_tree_host_->set_surface_id_namespace(surface_id_namespace); | 1035 layer_tree_host_->set_surface_id_namespace(surface_id_namespace); |
| 1001 } | 1036 } |
| 1002 | 1037 |
| 1003 void RenderWidgetCompositor::OnHandleCompositorProto( | 1038 void RenderWidgetCompositor::OnHandleCompositorProto( |
| 1004 const std::vector<uint8_t>& proto) { | 1039 const std::vector<uint8_t>& proto) { |
| 1005 DCHECK(remote_proto_channel_receiver_); | 1040 DCHECK(remote_proto_channel_receiver_); |
| (...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1094 #endif | 1129 #endif |
| 1095 return actual; | 1130 return actual; |
| 1096 } | 1131 } |
| 1097 | 1132 |
| 1098 void RenderWidgetCompositor::SetPaintedDeviceScaleFactor( | 1133 void RenderWidgetCompositor::SetPaintedDeviceScaleFactor( |
| 1099 float device_scale) { | 1134 float device_scale) { |
| 1100 layer_tree_host_->SetPaintedDeviceScaleFactor(device_scale); | 1135 layer_tree_host_->SetPaintedDeviceScaleFactor(device_scale); |
| 1101 } | 1136 } |
| 1102 | 1137 |
| 1103 } // namespace content | 1138 } // namespace content |
| OLD | NEW |