Chromium Code Reviews| 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" | |
| 48 #include "content/renderer/input/input_handler_manager.h" | 49 #include "content/renderer/input/input_handler_manager.h" |
| 49 #include "gpu/command_buffer/client/gles2_interface.h" | 50 #include "gpu/command_buffer/client/gles2_interface.h" |
| 50 #include "gpu/command_buffer/service/gpu_switches.h" | 51 #include "gpu/command_buffer/service/gpu_switches.h" |
| 51 #include "third_party/WebKit/public/platform/WebCompositeAndReadbackAsyncCallbac k.h" | 52 #include "third_party/WebKit/public/platform/WebCompositeAndReadbackAsyncCallbac k.h" |
| 52 #include "third_party/WebKit/public/platform/WebLayoutAndPaintAsyncCallback.h" | 53 #include "third_party/WebKit/public/platform/WebLayoutAndPaintAsyncCallback.h" |
| 53 #include "third_party/WebKit/public/platform/WebSize.h" | 54 #include "third_party/WebKit/public/platform/WebSize.h" |
| 54 #include "third_party/WebKit/public/web/WebKit.h" | 55 #include "third_party/WebKit/public/web/WebKit.h" |
| 55 #include "third_party/WebKit/public/web/WebRuntimeFeatures.h" | 56 #include "third_party/WebKit/public/web/WebRuntimeFeatures.h" |
| 56 #include "third_party/WebKit/public/web/WebSelection.h" | 57 #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(RenderWidget* widget) { | 138 gfx::Size CalculateDefaultTileSize(float device_scale_factor) { |
| 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 (widget->screen_info().deviceScaleFactor >= 2.0f) | 183 if (device_scale_factor >= 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 RenderWidget* widget, | 208 RenderWidgetCompositorDelegate* delegate, |
| 209 float device_scale_factor, | |
|
piman
2016/01/13 22:09:30
Minor nit, this makes it sound like the device_sca
Fady Samuel
2016/01/13 23:48:13
Hmm, tile size seems like a compositor detail. I'd
piman
2016/01/14 00:13:23
There's already RWC::setDeviceScaleFactor, I would
| |
| 209 CompositorDependencies* compositor_deps) { | 210 CompositorDependencies* compositor_deps) { |
| 210 scoped_ptr<RenderWidgetCompositor> compositor( | 211 scoped_ptr<RenderWidgetCompositor> compositor( |
| 211 new RenderWidgetCompositor(widget, compositor_deps)); | 212 new RenderWidgetCompositor(delegate, compositor_deps)); |
| 212 compositor->Initialize(); | 213 compositor->Initialize(device_scale_factor); |
| 213 return compositor; | 214 return compositor; |
| 214 } | 215 } |
| 215 | 216 |
| 216 RenderWidgetCompositor::RenderWidgetCompositor( | 217 RenderWidgetCompositor::RenderWidgetCompositor( |
| 217 RenderWidget* widget, | 218 RenderWidgetCompositorDelegate* delegate, |
| 218 CompositorDependencies* compositor_deps) | 219 CompositorDependencies* compositor_deps) |
| 219 : num_failed_recreate_attempts_(0), | 220 : num_failed_recreate_attempts_(0), |
| 220 widget_(widget), | 221 delegate_(delegate), |
| 221 compositor_deps_(compositor_deps), | 222 compositor_deps_(compositor_deps), |
| 222 never_visible_(false), | 223 never_visible_(false), |
| 223 layout_and_paint_async_callback_(nullptr), | 224 layout_and_paint_async_callback_(nullptr), |
| 224 remote_proto_channel_receiver_(nullptr), | 225 remote_proto_channel_receiver_(nullptr), |
| 225 weak_factory_(this) { | 226 weak_factory_(this) {} |
| 226 } | |
| 227 | 227 |
| 228 void RenderWidgetCompositor::Initialize() { | 228 void RenderWidgetCompositor::Initialize(float device_scale_factor) { |
| 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(widget_); | 260 settings.default_tile_size = CalculateDefaultTileSize(device_scale_factor); |
| 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 (widget_->for_oopif()) { | 459 if (delegate_->ForOOPIF()) { |
| 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 = | 492 external_begin_frame_source = delegate_->CreateExternalBeginFrameSource(); |
| 493 compositor_deps_->CreateExternalBeginFrameSource(widget_->routing_id()); | |
| 494 } | 493 } |
| 495 | 494 |
| 496 cc::LayerTreeHost::InitParams params; | 495 cc::LayerTreeHost::InitParams params; |
| 497 params.client = this; | 496 params.client = this; |
| 498 params.shared_bitmap_manager = shared_bitmap_manager; | 497 params.shared_bitmap_manager = shared_bitmap_manager; |
| 499 params.gpu_memory_buffer_manager = gpu_memory_buffer_manager; | 498 params.gpu_memory_buffer_manager = gpu_memory_buffer_manager; |
| 500 params.settings = &settings; | 499 params.settings = &settings; |
| 501 params.task_graph_runner = task_graph_runner; | 500 params.task_graph_runner = task_graph_runner; |
| 502 params.main_task_runner = main_thread_compositor_task_runner; | 501 params.main_task_runner = main_thread_compositor_task_runner; |
| 503 params.external_begin_frame_source = std::move(external_begin_frame_source); | 502 params.external_begin_frame_source = std::move(external_begin_frame_source); |
| (...skipping 354 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 858 | 857 |
| 859 void RenderWidgetCompositor::setTopControlsHeight(float height, bool shrink) { | 858 void RenderWidgetCompositor::setTopControlsHeight(float height, bool shrink) { |
| 860 layer_tree_host_->SetTopControlsHeight(height, shrink); | 859 layer_tree_host_->SetTopControlsHeight(height, shrink); |
| 861 } | 860 } |
| 862 | 861 |
| 863 void RenderWidgetCompositor::setTopControlsShownRatio(float ratio) { | 862 void RenderWidgetCompositor::setTopControlsShownRatio(float ratio) { |
| 864 layer_tree_host_->SetTopControlsShownRatio(ratio); | 863 layer_tree_host_->SetTopControlsShownRatio(ratio); |
| 865 } | 864 } |
| 866 | 865 |
| 867 void RenderWidgetCompositor::WillBeginMainFrame() { | 866 void RenderWidgetCompositor::WillBeginMainFrame() { |
| 868 widget_->WillBeginCompositorFrame(); | 867 delegate_->WillBeginCompositorFrame(); |
| 869 } | 868 } |
| 870 | 869 |
| 871 void RenderWidgetCompositor::DidBeginMainFrame() { | 870 void RenderWidgetCompositor::DidBeginMainFrame() { |
| 872 } | 871 } |
| 873 | 872 |
| 874 void RenderWidgetCompositor::BeginMainFrame(const cc::BeginFrameArgs& args) { | 873 void RenderWidgetCompositor::BeginMainFrame(const cc::BeginFrameArgs& args) { |
| 875 compositor_deps_->GetRendererScheduler()->WillBeginFrame(args); | 874 compositor_deps_->GetRendererScheduler()->WillBeginFrame(args); |
| 876 double frame_time_sec = (args.frame_time - base::TimeTicks()).InSecondsF(); | 875 double frame_time_sec = (args.frame_time - base::TimeTicks()).InSecondsF(); |
| 877 widget_->webwidget()->beginFrame(frame_time_sec); | 876 delegate_->BeginMainFrame(frame_time_sec); |
| 878 } | 877 } |
| 879 | 878 |
| 880 void RenderWidgetCompositor::BeginMainFrameNotExpectedSoon() { | 879 void RenderWidgetCompositor::BeginMainFrameNotExpectedSoon() { |
| 881 compositor_deps_->GetRendererScheduler()->BeginFrameNotExpectedSoon(); | 880 compositor_deps_->GetRendererScheduler()->BeginFrameNotExpectedSoon(); |
| 882 } | 881 } |
| 883 | 882 |
| 884 void RenderWidgetCompositor::UpdateLayerTreeHost() { | 883 void RenderWidgetCompositor::UpdateLayerTreeHost() { |
| 885 widget_->webwidget()->updateAllLifecyclePhases(); | |
|
piman
2016/01/13 22:09:30
So if I understand correctly, this moved from here
danakj
2016/01/13 22:24:33
Take a look here, the time when things run matters
Fady Samuel
2016/01/13 23:48:13
I don't want to change semantics in this CL so I'v
| |
| 886 | |
| 887 if (temporary_copy_output_request_) { | 884 if (temporary_copy_output_request_) { |
| 888 // For WebViewImpl, this will always have a root layer. For other widgets, | 885 // For WebViewImpl, this will always have a root layer. For other widgets, |
| 889 // the widget may be closed before servicing this request, so ignore it. | 886 // the widget may be closed before servicing this request, so ignore it. |
| 890 if (cc::Layer* root_layer = layer_tree_host_->root_layer()) { | 887 if (cc::Layer* root_layer = layer_tree_host_->root_layer()) { |
| 891 root_layer->RequestCopyOfOutput( | 888 root_layer->RequestCopyOfOutput( |
| 892 std::move(temporary_copy_output_request_)); | 889 std::move(temporary_copy_output_request_)); |
| 893 } else { | 890 } else { |
| 894 temporary_copy_output_request_->SendEmptyResult(); | 891 temporary_copy_output_request_->SendEmptyResult(); |
| 895 temporary_copy_output_request_ = nullptr; | 892 temporary_copy_output_request_ = nullptr; |
| 896 } | 893 } |
| 897 } | 894 } |
| 898 } | 895 } |
| 899 | 896 |
| 900 void RenderWidgetCompositor::ApplyViewportDeltas( | 897 void RenderWidgetCompositor::ApplyViewportDeltas( |
| 901 const gfx::Vector2dF& inner_delta, | 898 const gfx::Vector2dF& inner_delta, |
| 902 const gfx::Vector2dF& outer_delta, | 899 const gfx::Vector2dF& outer_delta, |
| 903 const gfx::Vector2dF& elastic_overscroll_delta, | 900 const gfx::Vector2dF& elastic_overscroll_delta, |
| 904 float page_scale, | 901 float page_scale, |
| 905 float top_controls_delta) { | 902 float top_controls_delta) { |
| 906 widget_->webwidget()->applyViewportDeltas( | 903 delegate_->ApplyViewportDeltas(inner_delta, outer_delta, |
| 907 inner_delta, | 904 elastic_overscroll_delta, page_scale, |
| 908 outer_delta, | 905 top_controls_delta); |
| 909 elastic_overscroll_delta, | |
| 910 page_scale, | |
| 911 top_controls_delta); | |
| 912 } | 906 } |
| 913 | 907 |
| 914 void RenderWidgetCompositor::RequestNewOutputSurface() { | 908 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 | |
| 921 bool fallback = | 909 bool fallback = |
| 922 num_failed_recreate_attempts_ >= OUTPUT_SURFACE_RETRIES_BEFORE_FALLBACK; | 910 num_failed_recreate_attempts_ >= OUTPUT_SURFACE_RETRIES_BEFORE_FALLBACK; |
| 923 scoped_ptr<cc::OutputSurface> surface(widget_->CreateOutputSurface(fallback)); | 911 scoped_ptr<cc::OutputSurface> surface( |
| 912 delegate_->CreateOutputSurface(fallback)); | |
| 924 | 913 |
| 925 if (!surface) { | 914 if (!surface) { |
| 926 DidFailToInitializeOutputSurface(); | 915 DidFailToInitializeOutputSurface(); |
| 927 return; | 916 return; |
| 928 } | 917 } |
| 929 | 918 |
| 930 DCHECK_EQ(surface->capabilities().max_frames_pending, 1); | 919 DCHECK_EQ(surface->capabilities().max_frames_pending, 1); |
| 931 | 920 |
| 932 layer_tree_host_->SetOutputSurface(std::move(surface)); | 921 layer_tree_host_->SetOutputSurface(std::move(surface)); |
| 933 } | 922 } |
| (...skipping 13 matching lines...) Expand all Loading... | |
| 947 FROM_HERE, base::Bind(&RenderWidgetCompositor::RequestNewOutputSurface, | 936 FROM_HERE, base::Bind(&RenderWidgetCompositor::RequestNewOutputSurface, |
| 948 weak_factory_.GetWeakPtr())); | 937 weak_factory_.GetWeakPtr())); |
| 949 } | 938 } |
| 950 | 939 |
| 951 void RenderWidgetCompositor::WillCommit() { | 940 void RenderWidgetCompositor::WillCommit() { |
| 952 InvokeLayoutAndPaintCallback(); | 941 InvokeLayoutAndPaintCallback(); |
| 953 } | 942 } |
| 954 | 943 |
| 955 void RenderWidgetCompositor::DidCommit() { | 944 void RenderWidgetCompositor::DidCommit() { |
| 956 DCHECK(!temporary_copy_output_request_); | 945 DCHECK(!temporary_copy_output_request_); |
| 957 widget_->DidCommitCompositorFrame(); | 946 delegate_->DidCommitCompositorFrame(); |
| 958 compositor_deps_->GetRendererScheduler()->DidCommitFrameToCompositor(); | 947 compositor_deps_->GetRendererScheduler()->DidCommitFrameToCompositor(); |
| 959 } | 948 } |
| 960 | 949 |
| 961 void RenderWidgetCompositor::DidCommitAndDrawFrame() { | 950 void RenderWidgetCompositor::DidCommitAndDrawFrame() { |
| 962 widget_->DidCommitAndDrawCompositorFrame(); | 951 delegate_->DidCommitAndDrawCompositorFrame(); |
| 963 } | 952 } |
| 964 | 953 |
| 965 void RenderWidgetCompositor::DidCompleteSwapBuffers() { | 954 void RenderWidgetCompositor::DidCompleteSwapBuffers() { |
| 966 widget_->DidCompleteSwapBuffers(); | 955 delegate_->DidCompleteSwapBuffers(); |
| 967 bool threaded = !!compositor_deps_->GetCompositorImplThreadTaskRunner().get(); | 956 bool threaded = !!compositor_deps_->GetCompositorImplThreadTaskRunner().get(); |
| 968 if (!threaded) | 957 if (!threaded) |
| 969 widget_->OnSwapBuffersComplete(); | 958 delegate_->OnSwapBuffersComplete(); |
| 970 } | 959 } |
| 971 | 960 |
| 972 void RenderWidgetCompositor::DidCompletePageScaleAnimation() { | 961 void RenderWidgetCompositor::DidCompletePageScaleAnimation() { |
| 973 widget_->DidCompletePageScaleAnimation(); | 962 delegate_->DidCompletePageScaleAnimation(); |
| 974 } | 963 } |
| 975 | 964 |
| 976 void RenderWidgetCompositor::ScheduleAnimation() { | 965 void RenderWidgetCompositor::ScheduleAnimation() { |
| 977 widget_->scheduleAnimation(); | 966 delegate_->ScheduleAnimation(); |
| 978 } | 967 } |
| 979 | 968 |
| 980 void RenderWidgetCompositor::DidPostSwapBuffers() { | 969 void RenderWidgetCompositor::DidPostSwapBuffers() { |
| 981 widget_->OnSwapBuffersPosted(); | 970 delegate_->OnSwapBuffersPosted(); |
| 982 } | 971 } |
| 983 | 972 |
| 984 void RenderWidgetCompositor::DidAbortSwapBuffers() { | 973 void RenderWidgetCompositor::DidAbortSwapBuffers() { |
| 985 widget_->OnSwapBuffersAborted(); | 974 delegate_->OnSwapBuffersAborted(); |
| 986 } | 975 } |
| 987 | 976 |
| 988 void RenderWidgetCompositor::SetProtoReceiver(ProtoReceiver* receiver) { | 977 void RenderWidgetCompositor::SetProtoReceiver(ProtoReceiver* receiver) { |
| 989 remote_proto_channel_receiver_ = receiver; | 978 remote_proto_channel_receiver_ = receiver; |
| 990 } | 979 } |
| 991 | 980 |
| 992 void RenderWidgetCompositor::SendCompositorProto( | 981 void RenderWidgetCompositor::SendCompositorProto( |
| 993 const cc::proto::CompositorMessage& proto) { | 982 const cc::proto::CompositorMessage& proto) { |
| 994 int signed_size = proto.ByteSize(); | 983 int signed_size = proto.ByteSize(); |
| 995 size_t unsigned_size = base::checked_cast<size_t>(signed_size); | 984 size_t unsigned_size = base::checked_cast<size_t>(signed_size); |
| 996 std::vector<uint8_t> serialized(unsigned_size); | 985 std::vector<uint8_t> serialized(unsigned_size); |
| 997 proto.SerializeToArray(serialized.data(), signed_size); | 986 proto.SerializeToArray(serialized.data(), signed_size); |
| 998 widget_->ForwardCompositorProto(serialized); | 987 delegate_->ForwardCompositorProto(serialized); |
| 999 } | 988 } |
| 1000 | 989 |
| 1001 void RenderWidgetCompositor::RecordFrameTimingEvents( | 990 void RenderWidgetCompositor::RecordFrameTimingEvents( |
| 1002 scoped_ptr<cc::FrameTimingTracker::CompositeTimingSet> composite_events, | 991 scoped_ptr<cc::FrameTimingTracker::CompositeTimingSet> composite_events, |
| 1003 scoped_ptr<cc::FrameTimingTracker::MainFrameTimingSet> main_frame_events) { | 992 scoped_ptr<cc::FrameTimingTracker::MainFrameTimingSet> main_frame_events) { |
| 1004 for (const auto& composite_event : *composite_events ) { | 993 delegate_->RecordFrameTimingEvents(std::move(composite_events), |
| 1005 int64_t frameId = composite_event.first; | 994 std::move(main_frame_events)); |
| 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 } | |
| 1031 } | 995 } |
| 1032 | 996 |
| 1033 void RenderWidgetCompositor::SetSurfaceIdNamespace( | 997 void RenderWidgetCompositor::SetSurfaceIdNamespace( |
| 1034 uint32_t surface_id_namespace) { | 998 uint32_t surface_id_namespace) { |
| 1035 layer_tree_host_->set_surface_id_namespace(surface_id_namespace); | 999 layer_tree_host_->set_surface_id_namespace(surface_id_namespace); |
| 1036 } | 1000 } |
| 1037 | 1001 |
| 1038 void RenderWidgetCompositor::OnHandleCompositorProto( | 1002 void RenderWidgetCompositor::OnHandleCompositorProto( |
| 1039 const std::vector<uint8_t>& proto) { | 1003 const std::vector<uint8_t>& proto) { |
| 1040 DCHECK(remote_proto_channel_receiver_); | 1004 DCHECK(remote_proto_channel_receiver_); |
| (...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1129 #endif | 1093 #endif |
| 1130 return actual; | 1094 return actual; |
| 1131 } | 1095 } |
| 1132 | 1096 |
| 1133 void RenderWidgetCompositor::SetPaintedDeviceScaleFactor( | 1097 void RenderWidgetCompositor::SetPaintedDeviceScaleFactor( |
| 1134 float device_scale) { | 1098 float device_scale) { |
| 1135 layer_tree_host_->SetPaintedDeviceScaleFactor(device_scale); | 1099 layer_tree_host_->SetPaintedDeviceScaleFactor(device_scale); |
| 1136 } | 1100 } |
| 1137 | 1101 |
| 1138 } // namespace content | 1102 } // namespace content |
| OLD | NEW |