OLD | NEW |
1 // Copyright 2012 The Chromium Authors. All rights reserved. | 1 // Copyright 2012 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/resources/picture_layer_tiling.h" | 5 #include "cc/resources/picture_layer_tiling.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 #include <cmath> | 8 #include <cmath> |
9 #include <limits> | 9 #include <limits> |
10 | 10 |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
53 client)); | 53 client)); |
54 } | 54 } |
55 | 55 |
56 PictureLayerTiling::PictureLayerTiling(float contents_scale, | 56 PictureLayerTiling::PictureLayerTiling(float contents_scale, |
57 const gfx::Size& layer_bounds, | 57 const gfx::Size& layer_bounds, |
58 PictureLayerTilingClient* client) | 58 PictureLayerTilingClient* client) |
59 : contents_scale_(contents_scale), | 59 : contents_scale_(contents_scale), |
60 layer_bounds_(layer_bounds), | 60 layer_bounds_(layer_bounds), |
61 resolution_(NON_IDEAL_RESOLUTION), | 61 resolution_(NON_IDEAL_RESOLUTION), |
62 client_(client), | 62 client_(client), |
63 tiling_data_(gfx::Size(), gfx::Size(), true), | 63 tiling_data_(gfx::Size(), gfx::Rect(), true), |
64 last_impl_frame_time_in_seconds_(0.0), | 64 last_impl_frame_time_in_seconds_(0.0), |
65 eviction_tiles_cache_valid_(false), | 65 eviction_tiles_cache_valid_(false), |
66 eviction_cache_tree_priority_(SAME_PRIORITY_FOR_BOTH_TREES) { | 66 eviction_cache_tree_priority_(SAME_PRIORITY_FOR_BOTH_TREES) { |
67 gfx::Size content_bounds = | 67 gfx::Size content_bounds = |
68 gfx::ToCeiledSize(gfx::ScaleSize(layer_bounds, contents_scale)); | 68 gfx::ToCeiledSize(gfx::ScaleSize(layer_bounds, contents_scale)); |
69 gfx::Size tile_size = client_->CalculateTileSize(content_bounds); | 69 gfx::Size tile_size = client_->CalculateTileSize(content_bounds); |
70 | 70 |
71 DCHECK(!gfx::ToFlooredSize( | 71 DCHECK(!gfx::ToFlooredSize( |
72 gfx::ScaleSize(layer_bounds, contents_scale)).IsEmpty()) << | 72 gfx::ScaleSize(layer_bounds, contents_scale)).IsEmpty()) << |
73 "Tiling created with scale too small as contents become empty." << | 73 "Tiling created with scale too small as contents become empty." << |
74 " Layer bounds: " << layer_bounds.ToString() << | 74 " Layer bounds: " << layer_bounds.ToString() << |
75 " Contents scale: " << contents_scale; | 75 " Contents scale: " << contents_scale; |
76 | 76 |
77 tiling_data_.SetTotalSize(content_bounds); | 77 tiling_data_.SetTilingRect(gfx::Rect(content_bounds)); |
78 tiling_data_.SetMaxTextureSize(tile_size); | 78 tiling_data_.SetMaxTextureSize(tile_size); |
79 } | 79 } |
80 | 80 |
81 PictureLayerTiling::~PictureLayerTiling() { | 81 PictureLayerTiling::~PictureLayerTiling() { |
82 } | 82 } |
83 | 83 |
84 void PictureLayerTiling::SetClient(PictureLayerTilingClient* client) { | 84 void PictureLayerTiling::SetClient(PictureLayerTilingClient* client) { |
85 client_ = client; | 85 client_ = client; |
86 } | 86 } |
87 | 87 |
88 gfx::Rect PictureLayerTiling::ContentRect() const { | 88 gfx::Rect PictureLayerTiling::TilingRect() const { |
89 return gfx::Rect(tiling_data_.total_size()); | 89 return tiling_data_.tiling_rect(); |
90 } | |
91 | |
92 gfx::SizeF PictureLayerTiling::ContentSizeF() const { | |
93 return gfx::ScaleSize(layer_bounds_, contents_scale_); | |
94 } | 90 } |
95 | 91 |
96 Tile* PictureLayerTiling::CreateTile(int i, | 92 Tile* PictureLayerTiling::CreateTile(int i, |
97 int j, | 93 int j, |
98 const PictureLayerTiling* twin_tiling) { | 94 const PictureLayerTiling* twin_tiling) { |
99 TileMapKey key(i, j); | 95 TileMapKey key(i, j); |
100 DCHECK(tiles_.find(key) == tiles_.end()); | 96 DCHECK(tiles_.find(key) == tiles_.end()); |
101 | 97 |
102 gfx::Rect paint_rect = tiling_data_.TileBoundsWithBorder(i, j); | 98 gfx::Rect paint_rect = tiling_data_.TileBoundsWithBorder(i, j); |
103 gfx::Rect tile_rect = paint_rect; | 99 gfx::Rect tile_rect = paint_rect; |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
152 } | 148 } |
153 | 149 |
154 void PictureLayerTiling::SetLayerBounds(const gfx::Size& layer_bounds) { | 150 void PictureLayerTiling::SetLayerBounds(const gfx::Size& layer_bounds) { |
155 if (layer_bounds_ == layer_bounds) | 151 if (layer_bounds_ == layer_bounds) |
156 return; | 152 return; |
157 | 153 |
158 DCHECK(!layer_bounds.IsEmpty()); | 154 DCHECK(!layer_bounds.IsEmpty()); |
159 | 155 |
160 gfx::Size old_layer_bounds = layer_bounds_; | 156 gfx::Size old_layer_bounds = layer_bounds_; |
161 layer_bounds_ = layer_bounds; | 157 layer_bounds_ = layer_bounds; |
162 gfx::Size old_content_bounds = tiling_data_.total_size(); | |
163 gfx::Size content_bounds = | 158 gfx::Size content_bounds = |
164 gfx::ToCeiledSize(gfx::ScaleSize(layer_bounds_, contents_scale_)); | 159 gfx::ToCeiledSize(gfx::ScaleSize(layer_bounds_, contents_scale_)); |
165 | 160 |
166 gfx::Size tile_size = client_->CalculateTileSize(content_bounds); | 161 gfx::Size tile_size = client_->CalculateTileSize(content_bounds); |
167 if (tile_size != tiling_data_.max_texture_size()) { | 162 if (tile_size != tiling_data_.max_texture_size()) { |
168 tiling_data_.SetTotalSize(content_bounds); | 163 tiling_data_.SetTilingRect(gfx::Rect(content_bounds)); |
169 tiling_data_.SetMaxTextureSize(tile_size); | 164 tiling_data_.SetMaxTextureSize(tile_size); |
170 Reset(); | 165 Reset(); |
171 return; | 166 return; |
172 } | 167 } |
173 | 168 |
174 // Any tiles outside our new bounds are invalid and should be dropped. | 169 // Any tiles outside our new bounds are invalid and should be dropped. |
175 gfx::Rect bounded_live_tiles_rect(live_tiles_rect_); | 170 gfx::Rect bounded_live_tiles_rect(live_tiles_rect_); |
176 bounded_live_tiles_rect.Intersect(gfx::Rect(content_bounds)); | 171 bounded_live_tiles_rect.Intersect(gfx::Rect(content_bounds)); |
177 SetLiveTilesRect(bounded_live_tiles_rect); | 172 SetLiveTilesRect(bounded_live_tiles_rect); |
178 tiling_data_.SetTotalSize(content_bounds); | 173 tiling_data_.SetTilingRect(gfx::Rect(content_bounds)); |
179 | 174 |
180 // Create tiles for newly exposed areas. | 175 // Create tiles for newly exposed areas. |
181 Region layer_region((gfx::Rect(layer_bounds_))); | 176 Region layer_region((gfx::Rect(layer_bounds_))); |
182 layer_region.Subtract(gfx::Rect(old_layer_bounds)); | 177 layer_region.Subtract(gfx::Rect(old_layer_bounds)); |
183 Invalidate(layer_region); | 178 Invalidate(layer_region); |
184 } | 179 } |
185 | 180 |
186 void PictureLayerTiling::RemoveTilesInRegion(const Region& layer_region) { | 181 void PictureLayerTiling::RemoveTilesInRegion(const Region& layer_region) { |
187 DoInvalidate(layer_region, false /* recreate_tiles */); | 182 DoInvalidate(layer_region, false /* recreate_tiles */); |
188 } | 183 } |
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
246 tile_j_(0), | 241 tile_j_(0), |
247 left_(0), | 242 left_(0), |
248 top_(0), | 243 top_(0), |
249 right_(-1), | 244 right_(-1), |
250 bottom_(-1) { | 245 bottom_(-1) { |
251 DCHECK(tiling_); | 246 DCHECK(tiling_); |
252 if (dest_rect_.IsEmpty()) | 247 if (dest_rect_.IsEmpty()) |
253 return; | 248 return; |
254 | 249 |
255 dest_to_content_scale_ = tiling_->contents_scale_ / dest_scale; | 250 dest_to_content_scale_ = tiling_->contents_scale_ / dest_scale; |
256 // This is the maximum size that the dest rect can be, given the content size. | |
257 gfx::Size dest_content_size = gfx::ToCeiledSize(gfx::ScaleSize( | |
258 tiling_->ContentRect().size(), | |
259 1 / dest_to_content_scale_, | |
260 1 / dest_to_content_scale_)); | |
261 | 251 |
262 gfx::Rect content_rect = | 252 gfx::Rect content_rect = |
263 gfx::ScaleToEnclosingRect(dest_rect_, | 253 gfx::ScaleToEnclosingRect(dest_rect_, |
264 dest_to_content_scale_, | 254 dest_to_content_scale_, |
265 dest_to_content_scale_); | 255 dest_to_content_scale_); |
266 // IndexFromSrcCoord clamps to valid tile ranges, so it's necessary to | 256 // IndexFromSrcCoord clamps to valid tile ranges, so it's necessary to |
267 // check for non-intersection first. | 257 // check for non-intersection first. |
268 content_rect.Intersect(gfx::Rect(tiling_->tiling_data_.total_size())); | 258 content_rect.Intersect(tiling_->TilingRect()); |
269 if (content_rect.IsEmpty()) | 259 if (content_rect.IsEmpty()) |
270 return; | 260 return; |
271 | 261 |
272 left_ = tiling_->tiling_data_.TileXIndexFromSrcCoord(content_rect.x()); | 262 left_ = tiling_->tiling_data_.TileXIndexFromSrcCoord(content_rect.x()); |
273 top_ = tiling_->tiling_data_.TileYIndexFromSrcCoord(content_rect.y()); | 263 top_ = tiling_->tiling_data_.TileYIndexFromSrcCoord(content_rect.y()); |
274 right_ = tiling_->tiling_data_.TileXIndexFromSrcCoord( | 264 right_ = tiling_->tiling_data_.TileXIndexFromSrcCoord( |
275 content_rect.right() - 1); | 265 content_rect.right() - 1); |
276 bottom_ = tiling_->tiling_data_.TileYIndexFromSrcCoord( | 266 bottom_ = tiling_->tiling_data_.TileYIndexFromSrcCoord( |
277 content_rect.bottom() - 1); | 267 content_rect.bottom() - 1); |
278 | 268 |
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
360 | 350 |
361 gfx::RectF PictureLayerTiling::CoverageIterator::texture_rect() const { | 351 gfx::RectF PictureLayerTiling::CoverageIterator::texture_rect() const { |
362 gfx::PointF tex_origin = | 352 gfx::PointF tex_origin = |
363 tiling_->tiling_data_.TileBoundsWithBorder(tile_i_, tile_j_).origin(); | 353 tiling_->tiling_data_.TileBoundsWithBorder(tile_i_, tile_j_).origin(); |
364 | 354 |
365 // Convert from dest space => content space => texture space. | 355 // Convert from dest space => content space => texture space. |
366 gfx::RectF texture_rect(current_geometry_rect_); | 356 gfx::RectF texture_rect(current_geometry_rect_); |
367 texture_rect.Scale(dest_to_content_scale_, | 357 texture_rect.Scale(dest_to_content_scale_, |
368 dest_to_content_scale_); | 358 dest_to_content_scale_); |
369 texture_rect.Offset(-tex_origin.OffsetFromOrigin()); | 359 texture_rect.Offset(-tex_origin.OffsetFromOrigin()); |
370 texture_rect.Intersect(tiling_->ContentRect()); | 360 texture_rect.Intersect(tiling_->TilingRect()); |
371 | 361 |
372 return texture_rect; | 362 return texture_rect; |
373 } | 363 } |
374 | 364 |
375 gfx::Size PictureLayerTiling::CoverageIterator::texture_size() const { | 365 gfx::Size PictureLayerTiling::CoverageIterator::texture_size() const { |
376 return tiling_->tiling_data_.max_texture_size(); | 366 return tiling_->tiling_data_.max_texture_size(); |
377 } | 367 } |
378 | 368 |
379 void PictureLayerTiling::Reset() { | 369 void PictureLayerTiling::Reset() { |
380 live_tiles_rect_ = gfx::Rect(); | 370 live_tiles_rect_ = gfx::Rect(); |
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
436 double current_frame_time_in_seconds) { | 426 double current_frame_time_in_seconds) { |
437 if (!NeedsUpdateForFrameAtTime(current_frame_time_in_seconds)) { | 427 if (!NeedsUpdateForFrameAtTime(current_frame_time_in_seconds)) { |
438 // This should never be zero for the purposes of has_ever_been_updated(). | 428 // This should never be zero for the purposes of has_ever_been_updated(). |
439 DCHECK_NE(current_frame_time_in_seconds, 0.0); | 429 DCHECK_NE(current_frame_time_in_seconds, 0.0); |
440 return; | 430 return; |
441 } | 431 } |
442 | 432 |
443 gfx::Rect visible_rect_in_content_space = | 433 gfx::Rect visible_rect_in_content_space = |
444 gfx::ScaleToEnclosingRect(visible_layer_rect, contents_scale_); | 434 gfx::ScaleToEnclosingRect(visible_layer_rect, contents_scale_); |
445 | 435 |
446 if (ContentRect().IsEmpty()) { | 436 if (TilingRect().IsEmpty()) { |
447 last_impl_frame_time_in_seconds_ = current_frame_time_in_seconds; | 437 last_impl_frame_time_in_seconds_ = current_frame_time_in_seconds; |
448 last_visible_rect_in_content_space_ = visible_rect_in_content_space; | 438 last_visible_rect_in_content_space_ = visible_rect_in_content_space; |
449 return; | 439 return; |
450 } | 440 } |
451 | 441 |
452 size_t max_tiles_for_interest_area = client_->GetMaxTilesForInterestArea(); | 442 size_t max_tiles_for_interest_area = client_->GetMaxTilesForInterestArea(); |
453 | 443 |
454 gfx::Size tile_size = tiling_data_.max_texture_size(); | 444 gfx::Size tile_size = tiling_data_.max_texture_size(); |
455 int64 eventually_rect_area = | 445 int64 eventually_rect_area = |
456 max_tiles_for_interest_area * tile_size.width() * tile_size.height(); | 446 max_tiles_for_interest_area * tile_size.width() * tile_size.height(); |
457 | 447 |
458 gfx::Rect skewport = ComputeSkewport(current_frame_time_in_seconds, | 448 gfx::Rect skewport = ComputeSkewport(current_frame_time_in_seconds, |
459 visible_rect_in_content_space); | 449 visible_rect_in_content_space); |
460 DCHECK(skewport.Contains(visible_rect_in_content_space)); | 450 DCHECK(skewport.Contains(visible_rect_in_content_space)); |
461 | 451 |
462 gfx::Rect eventually_rect = | 452 gfx::Rect eventually_rect = |
463 ExpandRectEquallyToAreaBoundedBy(visible_rect_in_content_space, | 453 ExpandRectEquallyToAreaBoundedBy(visible_rect_in_content_space, |
464 eventually_rect_area, | 454 eventually_rect_area, |
465 ContentRect(), | 455 TilingRect(), |
466 &expansion_cache_); | 456 &expansion_cache_); |
467 | 457 |
468 DCHECK(eventually_rect.IsEmpty() || ContentRect().Contains(eventually_rect)); | 458 DCHECK(eventually_rect.IsEmpty() || TilingRect().Contains(eventually_rect)); |
469 | 459 |
470 SetLiveTilesRect(eventually_rect); | 460 SetLiveTilesRect(eventually_rect); |
471 | 461 |
472 last_impl_frame_time_in_seconds_ = current_frame_time_in_seconds; | 462 last_impl_frame_time_in_seconds_ = current_frame_time_in_seconds; |
473 last_visible_rect_in_content_space_ = visible_rect_in_content_space; | 463 last_visible_rect_in_content_space_ = visible_rect_in_content_space; |
474 | 464 |
475 current_visible_rect_in_content_space_ = visible_rect_in_content_space; | 465 current_visible_rect_in_content_space_ = visible_rect_in_content_space; |
476 current_skewport_ = skewport; | 466 current_skewport_ = skewport; |
477 current_eventually_rect_ = eventually_rect; | 467 current_eventually_rect_ = eventually_rect; |
478 eviction_tiles_cache_valid_ = false; | 468 eviction_tiles_cache_valid_ = false; |
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
534 content_to_screen_scale; | 524 content_to_screen_scale; |
535 TilePriority priority( | 525 TilePriority priority( |
536 resolution_, TilePriority::EVENTUALLY, distance_to_visible); | 526 resolution_, TilePriority::EVENTUALLY, distance_to_visible); |
537 tile->SetPriority(tree, priority); | 527 tile->SetPriority(tree, priority); |
538 } | 528 } |
539 } | 529 } |
540 | 530 |
541 void PictureLayerTiling::SetLiveTilesRect( | 531 void PictureLayerTiling::SetLiveTilesRect( |
542 const gfx::Rect& new_live_tiles_rect) { | 532 const gfx::Rect& new_live_tiles_rect) { |
543 DCHECK(new_live_tiles_rect.IsEmpty() || | 533 DCHECK(new_live_tiles_rect.IsEmpty() || |
544 ContentRect().Contains(new_live_tiles_rect)); | 534 TilingRect().Contains(new_live_tiles_rect)); |
545 if (live_tiles_rect_ == new_live_tiles_rect) | 535 if (live_tiles_rect_ == new_live_tiles_rect) |
546 return; | 536 return; |
547 | 537 |
548 // Iterate to delete all tiles outside of our new live_tiles rect. | 538 // Iterate to delete all tiles outside of our new live_tiles rect. |
549 for (TilingData::DifferenceIterator iter(&tiling_data_, | 539 for (TilingData::DifferenceIterator iter(&tiling_data_, |
550 live_tiles_rect_, | 540 live_tiles_rect_, |
551 new_live_tiles_rect); | 541 new_live_tiles_rect); |
552 iter; | 542 iter; |
553 ++iter) { | 543 ++iter) { |
554 TileMapKey key(iter.index()); | 544 TileMapKey key(iter.index()); |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
602 void PictureLayerTiling::UpdateTilesToCurrentPile() { | 592 void PictureLayerTiling::UpdateTilesToCurrentPile() { |
603 for (TileMap::const_iterator it = tiles_.begin(); it != tiles_.end(); ++it) { | 593 for (TileMap::const_iterator it = tiles_.begin(); it != tiles_.end(); ++it) { |
604 client_->UpdatePile(it->second.get()); | 594 client_->UpdatePile(it->second.get()); |
605 } | 595 } |
606 } | 596 } |
607 | 597 |
608 scoped_ptr<base::Value> PictureLayerTiling::AsValue() const { | 598 scoped_ptr<base::Value> PictureLayerTiling::AsValue() const { |
609 scoped_ptr<base::DictionaryValue> state(new base::DictionaryValue()); | 599 scoped_ptr<base::DictionaryValue> state(new base::DictionaryValue()); |
610 state->SetInteger("num_tiles", tiles_.size()); | 600 state->SetInteger("num_tiles", tiles_.size()); |
611 state->SetDouble("content_scale", contents_scale_); | 601 state->SetDouble("content_scale", contents_scale_); |
612 state->Set("content_bounds", | 602 state->Set("tiling_rect", MathUtil::AsValue(TilingRect()).release()); |
613 MathUtil::AsValue(ContentRect().size()).release()); | |
614 return state.PassAs<base::Value>(); | 603 return state.PassAs<base::Value>(); |
615 } | 604 } |
616 | 605 |
617 size_t PictureLayerTiling::GPUMemoryUsageInBytes() const { | 606 size_t PictureLayerTiling::GPUMemoryUsageInBytes() const { |
618 size_t amount = 0; | 607 size_t amount = 0; |
619 for (TileMap::const_iterator it = tiles_.begin(); it != tiles_.end(); ++it) { | 608 for (TileMap::const_iterator it = tiles_.begin(); it != tiles_.end(); ++it) { |
620 const Tile* tile = it->second.get(); | 609 const Tile* tile = it->second.get(); |
621 amount += tile->GPUMemoryUsageInBytes(); | 610 amount += tile->GPUMemoryUsageInBytes(); |
622 } | 611 } |
623 return amount; | 612 return amount; |
(...skipping 308 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
932 tiling_->UpdateEvictionCacheIfNeeded(tree_priority_); | 921 tiling_->UpdateEvictionCacheIfNeeded(tree_priority_); |
933 tile_iterator_ = tiling_->eviction_tiles_cache_.begin(); | 922 tile_iterator_ = tiling_->eviction_tiles_cache_.begin(); |
934 is_valid_ = true; | 923 is_valid_ = true; |
935 if (tile_iterator_ != tiling_->eviction_tiles_cache_.end() && | 924 if (tile_iterator_ != tiling_->eviction_tiles_cache_.end() && |
936 !(*tile_iterator_)->HasResources()) { | 925 !(*tile_iterator_)->HasResources()) { |
937 ++(*this); | 926 ++(*this); |
938 } | 927 } |
939 } | 928 } |
940 | 929 |
941 } // namespace cc | 930 } // namespace cc |
OLD | NEW |