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

Side by Side Diff: cc/trees/layer_tree_host_impl.cc

Issue 23171014: Fix UpdateTilePriorities viewport in Android WebView. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Add tests Created 7 years, 3 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
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/trees/layer_tree_host_impl.h" 5 #include "cc/trees/layer_tree_host_impl.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 8
9 #include "base/basictypes.h" 9 #include "base/basictypes.h"
10 #include "base/containers/hash_tables.h" 10 #include "base/containers/hash_tables.h"
(...skipping 177 matching lines...) Expand 10 before | Expand all | Expand 10 after
188 paint_time_counter_(PaintTimeCounter::Create()), 188 paint_time_counter_(PaintTimeCounter::Create()),
189 memory_history_(MemoryHistory::Create()), 189 memory_history_(MemoryHistory::Create()),
190 debug_rect_history_(DebugRectHistory::Create()), 190 debug_rect_history_(DebugRectHistory::Create()),
191 max_memory_needed_bytes_(0), 191 max_memory_needed_bytes_(0),
192 last_sent_memory_visible_bytes_(0), 192 last_sent_memory_visible_bytes_(0),
193 last_sent_memory_visible_and_nearby_bytes_(0), 193 last_sent_memory_visible_and_nearby_bytes_(0),
194 last_sent_memory_use_bytes_(0), 194 last_sent_memory_use_bytes_(0),
195 zero_budget_(false), 195 zero_budget_(false),
196 device_scale_factor_(1.f), 196 device_scale_factor_(1.f),
197 overdraw_bottom_height_(0.f), 197 overdraw_bottom_height_(0.f),
198 device_viewport_valid_for_tile_management_(true),
198 external_stencil_test_enabled_(false), 199 external_stencil_test_enabled_(false),
199 animation_registrar_(AnimationRegistrar::Create()), 200 animation_registrar_(AnimationRegistrar::Create()),
200 rendering_stats_instrumentation_(rendering_stats_instrumentation), 201 rendering_stats_instrumentation_(rendering_stats_instrumentation),
201 need_to_update_visible_tiles_before_draw_(false) { 202 need_to_update_visible_tiles_before_draw_(false) {
202 DCHECK(proxy_->IsImplThread()); 203 DCHECK(proxy_->IsImplThread());
203 DidVisibilityChange(this, visible_); 204 DidVisibilityChange(this, visible_);
204 205
205 SetDebugState(settings.initial_debug_state); 206 SetDebugState(settings.initial_debug_state);
206 207
207 if (settings.calculate_top_controls_position) { 208 if (settings.calculate_top_controls_position) {
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after
284 // draw_and_swap_full_viewport_every_frame check. Tracked in crbug.com/264967. 285 // draw_and_swap_full_viewport_every_frame check. Tracked in crbug.com/264967.
285 if (!active_tree_->root_layer()) { 286 if (!active_tree_->root_layer()) {
286 TRACE_EVENT_INSTANT0("cc", "LayerTreeHostImpl::CanDraw no root layer", 287 TRACE_EVENT_INSTANT0("cc", "LayerTreeHostImpl::CanDraw no root layer",
287 TRACE_EVENT_SCOPE_THREAD); 288 TRACE_EVENT_SCOPE_THREAD);
288 return false; 289 return false;
289 } 290 }
290 291
291 if (output_surface_->capabilities().draw_and_swap_full_viewport_every_frame) 292 if (output_surface_->capabilities().draw_and_swap_full_viewport_every_frame)
292 return true; 293 return true;
293 294
294 if (device_viewport_size_.IsEmpty()) { 295 if (DeviceViewport().IsEmpty()) {
295 TRACE_EVENT_INSTANT0("cc", "LayerTreeHostImpl::CanDraw empty viewport", 296 TRACE_EVENT_INSTANT0("cc", "LayerTreeHostImpl::CanDraw empty viewport",
296 TRACE_EVENT_SCOPE_THREAD); 297 TRACE_EVENT_SCOPE_THREAD);
297 return false; 298 return false;
298 } 299 }
299 if (active_tree_->ViewportSizeInvalid()) { 300 if (active_tree_->ViewportSizeInvalid()) {
300 TRACE_EVENT_INSTANT0( 301 TRACE_EVENT_INSTANT0(
301 "cc", "LayerTreeHostImpl::CanDraw viewport size recently changed", 302 "cc", "LayerTreeHostImpl::CanDraw viewport size recently changed",
302 TRACE_EVENT_SCOPE_THREAD); 303 TRACE_EVENT_SCOPE_THREAD);
303 return false; 304 return false;
304 } 305 }
(...skipping 14 matching lines...) Expand all
319 AnimateLayers(monotonic_time, wall_clock_time); 320 AnimateLayers(monotonic_time, wall_clock_time);
320 AnimateScrollbars(monotonic_time); 321 AnimateScrollbars(monotonic_time);
321 AnimateTopControls(monotonic_time); 322 AnimateTopControls(monotonic_time);
322 } 323 }
323 324
324 void LayerTreeHostImpl::ManageTiles() { 325 void LayerTreeHostImpl::ManageTiles() {
325 if (!tile_manager_) 326 if (!tile_manager_)
326 return; 327 return;
327 if (!manage_tiles_needed_) 328 if (!manage_tiles_needed_)
328 return; 329 return;
330 if (!device_viewport_valid_for_tile_management_)
331 return;
332
329 manage_tiles_needed_ = false; 333 manage_tiles_needed_ = false;
330 tile_manager_->ManageTiles(); 334 tile_manager_->ManageTiles();
331 335
332 size_t memory_required_bytes; 336 size_t memory_required_bytes;
333 size_t memory_nice_to_have_bytes; 337 size_t memory_nice_to_have_bytes;
334 size_t memory_allocated_bytes; 338 size_t memory_allocated_bytes;
335 size_t memory_used_bytes; 339 size_t memory_used_bytes;
336 tile_manager_->GetMemoryStats(&memory_required_bytes, 340 tile_manager_->GetMemoryStats(&memory_required_bytes,
337 &memory_nice_to_have_bytes, 341 &memory_nice_to_have_bytes,
338 &memory_allocated_bytes, 342 &memory_allocated_bytes,
339 &memory_used_bytes); 343 &memory_used_bytes);
340 SendManagedMemoryStats(memory_required_bytes, 344 SendManagedMemoryStats(memory_required_bytes,
341 memory_nice_to_have_bytes, 345 memory_nice_to_have_bytes,
342 memory_used_bytes); 346 memory_used_bytes);
343 } 347 }
344 348
345 void LayerTreeHostImpl::StartPageScaleAnimation(gfx::Vector2d target_offset, 349 void LayerTreeHostImpl::StartPageScaleAnimation(gfx::Vector2d target_offset,
346 bool anchor_point, 350 bool anchor_point,
347 float page_scale, 351 float page_scale,
348 base::TimeTicks start_time, 352 base::TimeTicks start_time,
349 base::TimeDelta duration) { 353 base::TimeDelta duration) {
350 if (!RootScrollLayer()) 354 if (!RootScrollLayer())
351 return; 355 return;
352 356
353 gfx::Vector2dF scroll_total = 357 gfx::Vector2dF scroll_total =
354 RootScrollLayer()->scroll_offset() + RootScrollLayer()->ScrollDelta(); 358 RootScrollLayer()->scroll_offset() + RootScrollLayer()->ScrollDelta();
355 gfx::SizeF scaled_scrollable_size = active_tree_->ScrollableSize(); 359 gfx::SizeF scaled_scrollable_size = active_tree_->ScrollableSize();
356 gfx::SizeF viewport_size = VisibleViewportSize(); 360 gfx::SizeF viewport_size = UnscaledScrollableViewportSize();
357 361
358 double start_time_seconds = (start_time - base::TimeTicks()).InSecondsF(); 362 double start_time_seconds = (start_time - base::TimeTicks()).InSecondsF();
359 363
360 // Easing constants experimentally determined. 364 // Easing constants experimentally determined.
361 scoped_ptr<TimingFunction> timing_function = 365 scoped_ptr<TimingFunction> timing_function =
362 CubicBezierTimingFunction::Create(.8, 0, .3, .9).PassAs<TimingFunction>(); 366 CubicBezierTimingFunction::Create(.8, 0, .3, .9).PassAs<TimingFunction>();
363 367
364 page_scale_animation_ = 368 page_scale_animation_ =
365 PageScaleAnimation::Create(scroll_total, 369 PageScaleAnimation::Create(scroll_total,
366 active_tree_->total_page_scale_factor(), 370 active_tree_->total_page_scale_factor(),
(...skipping 786 matching lines...) Expand 10 before | Expand all | Expand 10 after
1153 old_policy.priority_cutoff_when_visible) { 1157 old_policy.priority_cutoff_when_visible) {
1154 needs_commit = false; 1158 needs_commit = false;
1155 } 1159 }
1156 1160
1157 if (needs_commit) 1161 if (needs_commit)
1158 client_->SetNeedsCommitOnImplThread(); 1162 client_->SetNeedsCommitOnImplThread();
1159 } 1163 }
1160 1164
1161 void LayerTreeHostImpl::SetExternalDrawConstraints( 1165 void LayerTreeHostImpl::SetExternalDrawConstraints(
1162 const gfx::Transform& transform, 1166 const gfx::Transform& transform,
1163 gfx::Rect viewport) { 1167 gfx::Rect viewport,
1168 gfx::Rect clip,
1169 bool valid_for_tile_management) {
1164 external_transform_ = transform; 1170 external_transform_ = transform;
1165 external_viewport_ = viewport; 1171 external_viewport_ = viewport;
1172 external_clip_ = clip;
1173 device_viewport_valid_for_tile_management_ = valid_for_tile_management;
1166 } 1174 }
1167 1175
1168 void LayerTreeHostImpl::SetExternalStencilTest(bool enabled) { 1176 void LayerTreeHostImpl::SetExternalStencilTest(bool enabled) {
1169 external_stencil_test_enabled_ = enabled; 1177 external_stencil_test_enabled_ = enabled;
1170 } 1178 }
1171 1179
1172 void LayerTreeHostImpl::SetNeedsRedrawRect(gfx::Rect damage_rect) { 1180 void LayerTreeHostImpl::SetNeedsRedrawRect(gfx::Rect damage_rect) {
1173 client_->SetNeedsRedrawRectOnImplThread(damage_rect); 1181 client_->SetNeedsRedrawRectOnImplThread(damage_rect);
1174 } 1182 }
1175 1183
(...skipping 180 matching lines...) Expand 10 before | Expand all | Expand 10 after
1356 1364
1357 void LayerTreeHostImpl::SetNeedsBeginFrame(bool enable) { 1365 void LayerTreeHostImpl::SetNeedsBeginFrame(bool enable) {
1358 if (output_surface_) 1366 if (output_surface_)
1359 output_surface_->SetNeedsBeginFrame(enable); 1367 output_surface_->SetNeedsBeginFrame(enable);
1360 } 1368 }
1361 1369
1362 float LayerTreeHostImpl::DeviceScaleFactor() const { 1370 float LayerTreeHostImpl::DeviceScaleFactor() const {
1363 return device_scale_factor_; 1371 return device_scale_factor_;
1364 } 1372 }
1365 1373
1366 gfx::SizeF LayerTreeHostImpl::VisibleViewportSize() const { 1374 gfx::SizeF LayerTreeHostImpl::UnscaledScrollableViewportSize() const {
1367 // The container layer bounds should be used if non-overlay scrollbars may 1375 // The container layer bounds should be used if non-overlay scrollbars may
1368 // exist since it adjusts for them. 1376 // exist since it adjusts for them.
1369 LayerImpl* container_layer = active_tree_->RootContainerLayer(); 1377 LayerImpl* container_layer = active_tree_->RootContainerLayer();
1370 if (!Settings().solid_color_scrollbars && container_layer) { 1378 if (!Settings().solid_color_scrollbars && container_layer) {
1371 DCHECK(!top_controls_manager_); 1379 DCHECK(!top_controls_manager_);
1372 DCHECK_EQ(0, overdraw_bottom_height_); 1380 DCHECK_EQ(0, overdraw_bottom_height_);
1373 return container_layer->bounds(); 1381 return container_layer->bounds();
1374 } 1382 }
1375 1383
1376 gfx::SizeF dip_size = 1384 gfx::SizeF dip_size =
1377 gfx::ScaleSize(device_viewport_size(), 1.f / device_scale_factor()); 1385 gfx::ScaleSize(device_viewport_size_, 1.f / device_scale_factor());
1378 1386
1379 float top_offset = 1387 float top_offset =
1380 top_controls_manager_ ? top_controls_manager_->content_top_offset() : 0.f; 1388 top_controls_manager_ ? top_controls_manager_->content_top_offset() : 0.f;
1381 return gfx::SizeF(dip_size.width(), 1389 return gfx::SizeF(dip_size.width(),
1382 dip_size.height() - top_offset - overdraw_bottom_height_); 1390 dip_size.height() - top_offset - overdraw_bottom_height_);
1383 } 1391 }
1384 1392
1385 const LayerTreeSettings& LayerTreeHostImpl::Settings() const { 1393 const LayerTreeSettings& LayerTreeHostImpl::Settings() const {
1386 return settings(); 1394 return settings();
1387 } 1395 }
(...skipping 416 matching lines...) Expand 10 before | Expand all | Expand 10 after
1804 SetFullRootLayerDamage(); 1812 SetFullRootLayerDamage();
1805 } 1813 }
1806 1814
1807 gfx::Rect LayerTreeHostImpl::DeviceViewport() const { 1815 gfx::Rect LayerTreeHostImpl::DeviceViewport() const {
1808 if (external_viewport_.IsEmpty()) 1816 if (external_viewport_.IsEmpty())
1809 return gfx::Rect(device_viewport_size_); 1817 return gfx::Rect(device_viewport_size_);
1810 1818
1811 return external_viewport_; 1819 return external_viewport_;
1812 } 1820 }
1813 1821
1822 gfx::Rect LayerTreeHostImpl::DeviceClip() const {
1823 if (external_clip_.IsEmpty())
1824 return DeviceViewport();
1825
1826 return external_clip_;
1827 }
1828
1814 const gfx::Transform& LayerTreeHostImpl::DeviceTransform() const { 1829 const gfx::Transform& LayerTreeHostImpl::DeviceTransform() const {
1815 return external_transform_; 1830 return external_transform_;
1816 } 1831 }
1817 1832
1818 void LayerTreeHostImpl::UpdateMaxScrollOffset() { 1833 void LayerTreeHostImpl::UpdateMaxScrollOffset() {
1819 active_tree_->UpdateMaxScrollOffset(); 1834 active_tree_->UpdateMaxScrollOffset();
1820 } 1835 }
1821 1836
1822 void LayerTreeHostImpl::DidChangeTopControlsPosition() { 1837 void LayerTreeHostImpl::DidChangeTopControlsPosition() {
1823 client_->SetNeedsRedrawOnImplThread(); 1838 client_->SetNeedsRedrawOnImplThread();
(...skipping 433 matching lines...) Expand 10 before | Expand all | Expand 10 after
2257 scoped_ptr<ScrollAndScaleSet> scroll_info(new ScrollAndScaleSet()); 2272 scoped_ptr<ScrollAndScaleSet> scroll_info(new ScrollAndScaleSet());
2258 2273
2259 CollectScrollDeltas(scroll_info.get(), active_tree_->root_layer()); 2274 CollectScrollDeltas(scroll_info.get(), active_tree_->root_layer());
2260 scroll_info->page_scale_delta = active_tree_->page_scale_delta(); 2275 scroll_info->page_scale_delta = active_tree_->page_scale_delta();
2261 active_tree_->set_sent_page_scale_delta(scroll_info->page_scale_delta); 2276 active_tree_->set_sent_page_scale_delta(scroll_info->page_scale_delta);
2262 2277
2263 return scroll_info.Pass(); 2278 return scroll_info.Pass();
2264 } 2279 }
2265 2280
2266 void LayerTreeHostImpl::SetFullRootLayerDamage() { 2281 void LayerTreeHostImpl::SetFullRootLayerDamage() {
2267 SetViewportDamage(gfx::Rect(device_viewport_size_)); 2282 SetViewportDamage(gfx::Rect(DeviceViewport().size()));
2268 } 2283 }
2269 2284
2270 void LayerTreeHostImpl::AnimatePageScale(base::TimeTicks time) { 2285 void LayerTreeHostImpl::AnimatePageScale(base::TimeTicks time) {
2271 if (!page_scale_animation_ || !RootScrollLayer()) 2286 if (!page_scale_animation_ || !RootScrollLayer())
2272 return; 2287 return;
2273 2288
2274 double monotonic_time = (time - base::TimeTicks()).InSecondsF(); 2289 double monotonic_time = (time - base::TimeTicks()).InSecondsF();
2275 gfx::Vector2dF scroll_total = RootScrollLayer()->scroll_offset() + 2290 gfx::Vector2dF scroll_total = RootScrollLayer()->scroll_offset() +
2276 RootScrollLayer()->ScrollDelta(); 2291 RootScrollLayer()->ScrollDelta();
2277 2292
(...skipping 299 matching lines...) Expand 10 before | Expand all | Expand 10 after
2577 2592
2578 ResourceProvider::ResourceId LayerTreeHostImpl::ResourceIdForUIResource( 2593 ResourceProvider::ResourceId LayerTreeHostImpl::ResourceIdForUIResource(
2579 UIResourceId uid) const { 2594 UIResourceId uid) const {
2580 UIResourceMap::const_iterator iter = ui_resource_map_.find(uid); 2595 UIResourceMap::const_iterator iter = ui_resource_map_.find(uid);
2581 if (iter != ui_resource_map_.end()) 2596 if (iter != ui_resource_map_.end())
2582 return iter->second; 2597 return iter->second;
2583 return 0; 2598 return 0;
2584 } 2599 }
2585 2600
2586 } // namespace cc 2601 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698