| 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 #include <set> | 10 #include <set> |
| 11 | 11 |
| 12 #include "base/logging.h" | 12 #include "base/logging.h" |
| 13 #include "base/trace_event/trace_event.h" | 13 #include "base/trace_event/trace_event.h" |
| 14 #include "base/trace_event/trace_event_argument.h" | 14 #include "base/trace_event/trace_event_argument.h" |
| 15 #include "cc/base/math_util.h" | 15 #include "cc/base/math_util.h" |
| 16 #include "cc/resources/tile.h" | 16 #include "cc/resources/tile.h" |
| 17 #include "cc/resources/tile_priority.h" | 17 #include "cc/resources/tile_priority.h" |
| 18 #include "ui/gfx/geometry/point_conversions.h" | 18 #include "ui/gfx/geometry/point_conversions.h" |
| 19 #include "ui/gfx/geometry/rect_conversions.h" | 19 #include "ui/gfx/geometry/rect_conversions.h" |
| 20 #include "ui/gfx/geometry/safe_integer_conversions.h" | 20 #include "ui/gfx/geometry/safe_integer_conversions.h" |
| 21 #include "ui/gfx/geometry/size_conversions.h" | 21 #include "ui/gfx/geometry/size_conversions.h" |
| 22 | 22 |
| 23 namespace cc { | 23 namespace cc { |
| 24 namespace { | 24 namespace { |
| 25 | 25 |
| 26 const float kSoonBorderDistanceInScreenPixels = 312.f; | 26 const float kSoonBorderDistanceViewportPercentage = 0.15f; |
| 27 const float kMaxSoonBorderDistanceInScreenPixels = 312.f; |
| 27 | 28 |
| 28 } // namespace | 29 } // namespace |
| 29 | 30 |
| 30 scoped_ptr<PictureLayerTiling> PictureLayerTiling::Create( | 31 scoped_ptr<PictureLayerTiling> PictureLayerTiling::Create( |
| 31 float contents_scale, | 32 float contents_scale, |
| 32 scoped_refptr<RasterSource> raster_source, | 33 scoped_refptr<RasterSource> raster_source, |
| 33 PictureLayerTilingClient* client, | 34 PictureLayerTilingClient* client, |
| 34 size_t max_tiles_for_interest_area, | 35 size_t max_tiles_for_interest_area, |
| 35 float skewport_target_time_in_seconds, | 36 float skewport_target_time_in_seconds, |
| 36 int skewport_extrapolation_limit_in_content_pixels) { | 37 int skewport_extrapolation_limit_in_content_pixels) { |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 76 | 77 |
| 77 tiling_data_.SetTilingSize(content_bounds); | 78 tiling_data_.SetTilingSize(content_bounds); |
| 78 tiling_data_.SetMaxTextureSize(tile_size); | 79 tiling_data_.SetMaxTextureSize(tile_size); |
| 79 } | 80 } |
| 80 | 81 |
| 81 PictureLayerTiling::~PictureLayerTiling() { | 82 PictureLayerTiling::~PictureLayerTiling() { |
| 82 for (TileMap::const_iterator it = tiles_.begin(); it != tiles_.end(); ++it) | 83 for (TileMap::const_iterator it = tiles_.begin(); it != tiles_.end(); ++it) |
| 83 it->second->set_shared(false); | 84 it->second->set_shared(false); |
| 84 } | 85 } |
| 85 | 86 |
| 87 // static |
| 88 float PictureLayerTiling::CalculateSoonBorderDistance( |
| 89 const gfx::Rect& visible_rect_in_content_space, |
| 90 float content_to_screen_scale) { |
| 91 float max_dimension = std::max(visible_rect_in_content_space.width(), |
| 92 visible_rect_in_content_space.height()); |
| 93 return std::min( |
| 94 kMaxSoonBorderDistanceInScreenPixels / content_to_screen_scale, |
| 95 max_dimension * kSoonBorderDistanceViewportPercentage); |
| 96 } |
| 97 |
| 86 Tile* PictureLayerTiling::CreateTile(int i, | 98 Tile* PictureLayerTiling::CreateTile(int i, |
| 87 int j, | 99 int j, |
| 88 const PictureLayerTiling* twin_tiling, | 100 const PictureLayerTiling* twin_tiling, |
| 89 PictureLayerTiling* recycled_twin) { | 101 PictureLayerTiling* recycled_twin) { |
| 90 // Can't have both a (pending or active) twin and a recycled twin tiling. | 102 // Can't have both a (pending or active) twin and a recycled twin tiling. |
| 91 DCHECK_IMPLIES(twin_tiling, !recycled_twin); | 103 DCHECK_IMPLIES(twin_tiling, !recycled_twin); |
| 92 DCHECK_IMPLIES(recycled_twin, !twin_tiling); | 104 DCHECK_IMPLIES(recycled_twin, !twin_tiling); |
| 93 TileMapKey key(i, j); | 105 TileMapKey key(i, j); |
| 94 DCHECK(tiles_.find(key) == tiles_.end()); | 106 DCHECK(tiles_.find(key) == tiles_.end()); |
| 95 | 107 |
| (...skipping 502 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 598 &expansion_cache_); | 610 &expansion_cache_); |
| 599 | 611 |
| 600 DCHECK(eventually_rect.IsEmpty() || | 612 DCHECK(eventually_rect.IsEmpty() || |
| 601 gfx::Rect(tiling_size()).Contains(eventually_rect)) | 613 gfx::Rect(tiling_size()).Contains(eventually_rect)) |
| 602 << "tiling_size: " << tiling_size().ToString() | 614 << "tiling_size: " << tiling_size().ToString() |
| 603 << " eventually_rect: " << eventually_rect.ToString(); | 615 << " eventually_rect: " << eventually_rect.ToString(); |
| 604 | 616 |
| 605 // Calculate the soon border rect. | 617 // Calculate the soon border rect. |
| 606 float content_to_screen_scale = ideal_contents_scale / contents_scale_; | 618 float content_to_screen_scale = ideal_contents_scale / contents_scale_; |
| 607 gfx::Rect soon_border_rect = visible_rect_in_content_space; | 619 gfx::Rect soon_border_rect = visible_rect_in_content_space; |
| 608 float border = kSoonBorderDistanceInScreenPixels / content_to_screen_scale; | 620 float border = CalculateSoonBorderDistance(visible_rect_in_content_space, |
| 621 content_to_screen_scale); |
| 609 soon_border_rect.Inset(-border, -border, -border, -border); | 622 soon_border_rect.Inset(-border, -border, -border, -border); |
| 610 | 623 |
| 611 last_impl_frame_time_in_seconds_ = current_frame_time_in_seconds; | 624 last_impl_frame_time_in_seconds_ = current_frame_time_in_seconds; |
| 612 last_viewport_in_layer_space_ = viewport_in_layer_space; | 625 last_viewport_in_layer_space_ = viewport_in_layer_space; |
| 613 last_visible_rect_in_content_space_ = visible_rect_in_content_space; | 626 last_visible_rect_in_content_space_ = visible_rect_in_content_space; |
| 614 | 627 |
| 615 SetLiveTilesRect(eventually_rect); | 628 SetLiveTilesRect(eventually_rect); |
| 616 UpdateTilePriorityRects( | 629 UpdateTilePriorityRects( |
| 617 content_to_screen_scale, visible_rect_in_content_space, skewport, | 630 content_to_screen_scale, visible_rect_in_content_space, skewport, |
| 618 soon_border_rect, eventually_rect, occlusion_in_layer_space); | 631 soon_border_rect, eventually_rect, occlusion_in_layer_space); |
| (...skipping 240 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 859 tree, | 872 tree, |
| 860 TilePriority(resolution_, TilePriority::EVENTUALLY, distance_to_visible)); | 873 TilePriority(resolution_, TilePriority::EVENTUALLY, distance_to_visible)); |
| 861 } | 874 } |
| 862 | 875 |
| 863 void PictureLayerTiling::GetAllTilesForTracing( | 876 void PictureLayerTiling::GetAllTilesForTracing( |
| 864 std::set<const Tile*>* tiles) const { | 877 std::set<const Tile*>* tiles) const { |
| 865 for (TileMap::const_iterator it = tiles_.begin(); it != tiles_.end(); ++it) | 878 for (TileMap::const_iterator it = tiles_.begin(); it != tiles_.end(); ++it) |
| 866 tiles->insert(it->second.get()); | 879 tiles->insert(it->second.get()); |
| 867 } | 880 } |
| 868 | 881 |
| 869 void PictureLayerTiling::AsValueInto(base::debug::TracedValue* state) const { | 882 void PictureLayerTiling::AsValueInto( |
| 883 base::trace_event::TracedValue* state) const { |
| 870 state->SetInteger("num_tiles", tiles_.size()); | 884 state->SetInteger("num_tiles", tiles_.size()); |
| 871 state->SetDouble("content_scale", contents_scale_); | 885 state->SetDouble("content_scale", contents_scale_); |
| 872 MathUtil::AddToTracedValue("tiling_size", tiling_size(), state); | 886 MathUtil::AddToTracedValue("tiling_size", tiling_size(), state); |
| 873 } | 887 } |
| 874 | 888 |
| 875 size_t PictureLayerTiling::GPUMemoryUsageInBytes() const { | 889 size_t PictureLayerTiling::GPUMemoryUsageInBytes() const { |
| 876 size_t amount = 0; | 890 size_t amount = 0; |
| 877 for (TileMap::const_iterator it = tiles_.begin(); it != tiles_.end(); ++it) { | 891 for (TileMap::const_iterator it = tiles_.begin(); it != tiles_.end(); ++it) { |
| 878 const Tile* tile = it->second.get(); | 892 const Tile* tile = it->second.get(); |
| 879 amount += tile->GPUMemoryUsageInBytes(); | 893 amount += tile->GPUMemoryUsageInBytes(); |
| (...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1026 break; | 1040 break; |
| 1027 } | 1041 } |
| 1028 | 1042 |
| 1029 gfx::Rect result(origin_x, origin_y, width, height); | 1043 gfx::Rect result(origin_x, origin_y, width, height); |
| 1030 if (cache) | 1044 if (cache) |
| 1031 cache->previous_result = result; | 1045 cache->previous_result = result; |
| 1032 return result; | 1046 return result; |
| 1033 } | 1047 } |
| 1034 | 1048 |
| 1035 } // namespace cc | 1049 } // namespace cc |
| OLD | NEW |