Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(14)

Side by Side Diff: cc/layers/layer_impl.cc

Issue 20994007: Add impl/comp scrolling instrumentation. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: . Created 7 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright 2011 The Chromium Authors. All rights reserved. 1 // Copyright 2011 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 "cc/layers/layer_impl.h" 5 #include "cc/layers/layer_impl.h"
6 6
7 #include "base/debug/trace_event.h" 7 #include "base/debug/trace_event.h"
8 #include "base/strings/stringprintf.h" 8 #include "base/strings/stringprintf.h"
9 #include "cc/animation/animation_registrar.h" 9 #include "cc/animation/animation_registrar.h"
10 #include "cc/animation/scrollbar_animation_controller.h" 10 #include "cc/animation/scrollbar_animation_controller.h"
(...skipping 237 matching lines...) Expand 10 before | Expand all | Expand 10 after
248 return 0; 248 return 0;
249 } 249 }
250 250
251 void LayerImpl::SetSentScrollDelta(gfx::Vector2d sent_scroll_delta) { 251 void LayerImpl::SetSentScrollDelta(gfx::Vector2d sent_scroll_delta) {
252 // Pending tree never has sent scroll deltas 252 // Pending tree never has sent scroll deltas
253 DCHECK(layer_tree_impl()->IsActiveTree()); 253 DCHECK(layer_tree_impl()->IsActiveTree());
254 254
255 if (sent_scroll_delta_ == sent_scroll_delta) 255 if (sent_scroll_delta_ == sent_scroll_delta)
256 return; 256 return;
257 257
258 scoped_ptr<base::Value> value = MathUtil::AsValue(sent_scroll_delta);
259 TRACE_EVENT1("impl-scroll",
260 "LayerImpl::SetSentScrollDelta",
261 "sent_scroll_delta",
262 TracedValue::FromValue(value.release()));
263
258 sent_scroll_delta_ = sent_scroll_delta; 264 sent_scroll_delta_ = sent_scroll_delta;
259 } 265 }
260 266
261 gfx::Vector2dF LayerImpl::ScrollBy(gfx::Vector2dF scroll) { 267 gfx::Vector2dF LayerImpl::ScrollBy(gfx::Vector2dF scroll) {
262 DCHECK(scrollable()); 268 DCHECK(scrollable());
263 269
270 scoped_ptr<base::Value> value = MathUtil::AsValue(scroll);
271 TRACE_EVENT1("impl-scroll",
272 "LayerImpl::ScrollBy",
273 "scroll",
274 TracedValue::FromValue(value.release()));
275
264 gfx::Vector2dF min_delta = -scroll_offset_; 276 gfx::Vector2dF min_delta = -scroll_offset_;
265 gfx::Vector2dF max_delta = max_scroll_offset_ - scroll_offset_; 277 gfx::Vector2dF max_delta = max_scroll_offset_ - scroll_offset_;
266 // Clamp new_delta so that position + delta stays within scroll bounds. 278 // Clamp new_delta so that position + delta stays within scroll bounds.
267 gfx::Vector2dF new_delta = (ScrollDelta() + scroll); 279 gfx::Vector2dF new_delta = (ScrollDelta() + scroll);
268 new_delta.SetToMax(min_delta); 280 new_delta.SetToMax(min_delta);
269 new_delta.SetToMin(max_delta); 281 new_delta.SetToMin(max_delta);
270 gfx::Vector2dF unscrolled = ScrollDelta() + scroll - new_delta; 282 gfx::Vector2dF unscrolled = ScrollDelta() + scroll - new_delta;
271 SetScrollDelta(new_delta); 283 SetScrollDelta(new_delta);
272 return unscrolled; 284 return unscrolled;
273 } 285 }
(...skipping 14 matching lines...) Expand all
288 // leave the total scroll offset unchanged on this layer regardless of 300 // leave the total scroll offset unchanged on this layer regardless of
289 // whether a delegate is being used. 301 // whether a delegate is being used.
290 scroll_offset_ += sent_scroll_delta_; 302 scroll_offset_ += sent_scroll_delta_;
291 scroll_delta_ -= sent_scroll_delta_; 303 scroll_delta_ -= sent_scroll_delta_;
292 sent_scroll_delta_ = gfx::Vector2d(); 304 sent_scroll_delta_ = gfx::Vector2d();
293 } 305 }
294 306
295 InputHandler::ScrollStatus LayerImpl::TryScroll( 307 InputHandler::ScrollStatus LayerImpl::TryScroll(
296 gfx::PointF screen_space_point, 308 gfx::PointF screen_space_point,
297 InputHandler::ScrollInputType type) const { 309 InputHandler::ScrollInputType type) const {
310
298 if (should_scroll_on_main_thread()) { 311 if (should_scroll_on_main_thread()) {
299 TRACE_EVENT0("cc", "LayerImpl::TryScroll: Failed ShouldScrollOnMainThread"); 312 TRACE_EVENT_INSTANT0("cc,impl-scroll",
313 "LayerImpl::TryScroll: Failed ShouldScrollOnMainThread",
314 TRACE_EVENT_SCOPE_THREAD);
300 return InputHandler::ScrollOnMainThread; 315 return InputHandler::ScrollOnMainThread;
301 } 316 }
302 317
303 if (!screen_space_transform().IsInvertible()) { 318 if (!screen_space_transform().IsInvertible()) {
304 TRACE_EVENT0("cc", "LayerImpl::TryScroll: Ignored NonInvertibleTransform"); 319 TRACE_EVENT_INSTANT0("cc,impl-scroll",
320 "LayerImpl::TryScroll: Ignored NonInvertibleTransform",
321 TRACE_EVENT_SCOPE_THREAD);
305 return InputHandler::ScrollIgnored; 322 return InputHandler::ScrollIgnored;
306 } 323 }
307 324
308 if (!non_fast_scrollable_region().IsEmpty()) { 325 if (!non_fast_scrollable_region().IsEmpty()) {
309 bool clipped = false; 326 bool clipped = false;
310 gfx::Transform inverse_screen_space_transform( 327 gfx::Transform inverse_screen_space_transform(
311 gfx::Transform::kSkipInitialization); 328 gfx::Transform::kSkipInitialization);
312 if (!screen_space_transform().GetInverse(&inverse_screen_space_transform)) { 329 if (!screen_space_transform().GetInverse(&inverse_screen_space_transform)) {
313 // TODO(shawnsingh): We shouldn't be applying a projection if screen space 330 // TODO(shawnsingh): We shouldn't be applying a projection if screen space
314 // transform is uninvertible here. Perhaps we should be returning 331 // transform is uninvertible here. Perhaps we should be returning
315 // ScrollOnMainThread in this case? 332 // ScrollOnMainThread in this case?
316 } 333 }
317 334
318 gfx::PointF hit_test_point_in_content_space = 335 gfx::PointF hit_test_point_in_content_space =
319 MathUtil::ProjectPoint(inverse_screen_space_transform, 336 MathUtil::ProjectPoint(inverse_screen_space_transform,
320 screen_space_point, 337 screen_space_point,
321 &clipped); 338 &clipped);
322 gfx::PointF hit_test_point_in_layer_space = 339 gfx::PointF hit_test_point_in_layer_space =
323 gfx::ScalePoint(hit_test_point_in_content_space, 340 gfx::ScalePoint(hit_test_point_in_content_space,
324 1.f / contents_scale_x(), 341 1.f / contents_scale_x(),
325 1.f / contents_scale_y()); 342 1.f / contents_scale_y());
326 if (!clipped && 343 if (!clipped &&
327 non_fast_scrollable_region().Contains( 344 non_fast_scrollable_region().Contains(
328 gfx::ToRoundedPoint(hit_test_point_in_layer_space))) { 345 gfx::ToRoundedPoint(hit_test_point_in_layer_space))) {
329 TRACE_EVENT0("cc", 346 TRACE_EVENT_INSTANT0("cc,impl-scroll",
330 "LayerImpl::tryScroll: Failed NonFastScrollableRegion"); 347 "LayerImpl::TryScroll: Failed NonFastScrollableRegion",
348 TRACE_EVENT_SCOPE_THREAD);
331 return InputHandler::ScrollOnMainThread; 349 return InputHandler::ScrollOnMainThread;
332 } 350 }
333 } 351 }
334 352
335 if (type == InputHandler::Wheel && have_wheel_event_handlers()) { 353 if (type == InputHandler::Wheel && have_wheel_event_handlers()) {
336 TRACE_EVENT0("cc", "LayerImpl::tryScroll: Failed WheelEventHandlers"); 354 TRACE_EVENT_INSTANT0("cc,impl-scroll",
355 "LayerImpl::TryScroll: Failed WheelEventHandlers",
356 TRACE_EVENT_SCOPE_THREAD);
337 return InputHandler::ScrollOnMainThread; 357 return InputHandler::ScrollOnMainThread;
338 } 358 }
339 359
340 if (!scrollable()) { 360 if (!scrollable()) {
341 TRACE_EVENT0("cc", "LayerImpl::tryScroll: Ignored not scrollable"); 361 TRACE_EVENT_INSTANT0("cc,impl-scroll",
362 "LayerImpl::TryScroll: Ignored not scrollable",
363 TRACE_EVENT_SCOPE_THREAD);
342 return InputHandler::ScrollIgnored; 364 return InputHandler::ScrollIgnored;
343 } 365 }
344 366
345 if (max_scroll_offset_.x() <= 0 && max_scroll_offset_.y() <= 0) { 367 if (max_scroll_offset_.x() <= 0 && max_scroll_offset_.y() <= 0) {
346 TRACE_EVENT0("cc", 368 TRACE_EVENT_INSTANT0("cc,impl-scroll",
347 "LayerImpl::tryScroll: Ignored. Technically scrollable," 369 "LayerImpl::TryScroll: Ignored. Technically scrollable,"
348 " but has no affordance in either direction."); 370 " but has no affordance in either direction.",
371 TRACE_EVENT_SCOPE_THREAD);
349 return InputHandler::ScrollIgnored; 372 return InputHandler::ScrollIgnored;
350 } 373 }
351 374
375 TRACE_EVENT_INSTANT1("cc,impl-scroll",
376 "LayerImpl::TryScroll: Started",
377 TRACE_EVENT_SCOPE_THREAD,
378 "layer_id", id());
379
352 return InputHandler::ScrollStarted; 380 return InputHandler::ScrollStarted;
353 } 381 }
354 382
355 bool LayerImpl::DrawCheckerboardForMissingTiles() const { 383 bool LayerImpl::DrawCheckerboardForMissingTiles() const {
356 return draw_checkerboard_for_missing_tiles_ && 384 return draw_checkerboard_for_missing_tiles_ &&
357 !layer_tree_impl()->settings().background_color_instead_of_checkerboard; 385 !layer_tree_impl()->settings().background_color_instead_of_checkerboard;
358 } 386 }
359 387
360 gfx::Rect LayerImpl::LayerRectToContentRect( 388 gfx::Rect LayerImpl::LayerRectToContentRect(
361 const gfx::RectF& layer_rect) const { 389 const gfx::RectF& layer_rect) const {
(...skipping 527 matching lines...) Expand 10 before | Expand all | Expand 10 after
889 gfx::Vector2dF LayerImpl::ScrollDelta() const { 917 gfx::Vector2dF LayerImpl::ScrollDelta() const {
890 if (scroll_offset_delegate_) 918 if (scroll_offset_delegate_)
891 return scroll_offset_delegate_->GetTotalScrollOffset() - scroll_offset_; 919 return scroll_offset_delegate_->GetTotalScrollOffset() - scroll_offset_;
892 return scroll_delta_; 920 return scroll_delta_;
893 } 921 }
894 922
895 void LayerImpl::SetScrollDelta(gfx::Vector2dF scroll_delta) { 923 void LayerImpl::SetScrollDelta(gfx::Vector2dF scroll_delta) {
896 if (ScrollDelta() == scroll_delta) 924 if (ScrollDelta() == scroll_delta)
897 return; 925 return;
898 926
927 scoped_ptr<base::Value> value = MathUtil::AsValue(scroll_delta);
928 TRACE_EVENT1("impl-scroll",
929 "LayerImpl::SetScrollDelta",
930 "delta",
931 TracedValue::FromValue(value.release()));
932
899 if (layer_tree_impl()->IsActiveTree()) { 933 if (layer_tree_impl()->IsActiveTree()) {
900 LayerImpl* pending_twin = layer_tree_impl()->FindPendingTreeLayerById(id()); 934 LayerImpl* pending_twin = layer_tree_impl()->FindPendingTreeLayerById(id());
901 if (pending_twin) { 935 if (pending_twin) {
902 // The pending twin can't mirror the scroll delta of the active 936 // The pending twin can't mirror the scroll delta of the active
903 // layer. Although the delta - sent scroll delta difference is 937 // layer. Although the delta - sent scroll delta difference is
904 // identical for both twins, the sent scroll delta for the pending 938 // identical for both twins, the sent scroll delta for the pending
905 // layer is zero, as anything that has been sent has been baked 939 // layer is zero, as anything that has been sent has been baked
906 // into the layer's position/scroll offset as a part of commit. 940 // into the layer's position/scroll offset as a part of commit.
907 DCHECK(pending_twin->sent_scroll_delta().IsZero()); 941 DCHECK(pending_twin->sent_scroll_delta().IsZero());
908 pending_twin->SetScrollDelta(scroll_delta - sent_scroll_delta()); 942 pending_twin->SetScrollDelta(scroll_delta - sent_scroll_delta());
(...skipping 212 matching lines...) Expand 10 before | Expand all | Expand 10 after
1121 state->Set("compositing_reasons", 1155 state->Set("compositing_reasons",
1122 CompositingReasonsAsValue(compositing_reasons_).release()); 1156 CompositingReasonsAsValue(compositing_reasons_).release());
1123 1157
1124 bool clipped; 1158 bool clipped;
1125 gfx::QuadF layer_quad = MathUtil::MapQuad( 1159 gfx::QuadF layer_quad = MathUtil::MapQuad(
1126 screen_space_transform(), 1160 screen_space_transform(),
1127 gfx::QuadF(gfx::Rect(content_bounds())), 1161 gfx::QuadF(gfx::Rect(content_bounds())),
1128 &clipped); 1162 &clipped);
1129 state->Set("layer_quad", MathUtil::AsValue(layer_quad).release()); 1163 state->Set("layer_quad", MathUtil::AsValue(layer_quad).release());
1130 1164
1165 #ifndef NDEBUG
1166 state->SetString("debug_name", debug_name_);
1167 #endif
1131 1168
1132 scoped_ptr<base::ListValue> children_list(new base::ListValue()); 1169 scoped_ptr<base::ListValue> children_list(new base::ListValue());
1133 for (size_t i = 0; i < children_.size(); ++i) 1170 for (size_t i = 0; i < children_.size(); ++i)
1134 children_list->Append(children_[i]->AsValue().release()); 1171 children_list->Append(children_[i]->AsValue().release());
1135 state->Set("children", children_list.release()); 1172 state->Set("children", children_list.release());
1136 if (mask_layer_) 1173 if (mask_layer_)
1137 state->Set("mask_layer", mask_layer_->AsValue().release()); 1174 state->Set("mask_layer", mask_layer_->AsValue().release());
1138 if (replica_layer_) 1175 if (replica_layer_)
1139 state->Set("replica_layer", replica_layer_->AsValue().release()); 1176 state->Set("replica_layer", replica_layer_->AsValue().release());
1140 } 1177 }
1141 1178
1142 size_t LayerImpl::GPUMemoryUsageInBytes() const { return 0; } 1179 size_t LayerImpl::GPUMemoryUsageInBytes() const { return 0; }
1143 1180
1144 scoped_ptr<base::Value> LayerImpl::AsValue() const { 1181 scoped_ptr<base::Value> LayerImpl::AsValue() const {
1145 scoped_ptr<base::DictionaryValue> state(new base::DictionaryValue()); 1182 scoped_ptr<base::DictionaryValue> state(new base::DictionaryValue());
1146 AsValueInto(state.get()); 1183 AsValueInto(state.get());
1147 return state.PassAs<base::Value>(); 1184 return state.PassAs<base::Value>();
1148 } 1185 }
1149 1186
1150 } // namespace cc 1187 } // namespace cc
OLDNEW
« no previous file with comments | « cc/layers/layer.cc ('k') | cc/trees/layer_tree_host.cc » ('j') | cc/trees/layer_tree_host.cc » ('J')

Powered by Google App Engine
This is Rietveld 408576698