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 3 // found in the LICENSE file. 4 5 #include "cc/resources/tile.h" 6 7 #include <algorithm> 8 9 #include "base/debug/trace_event_argument.h" 10 #include "cc/base/math_util.h" 11 #include "cc/debug/traced_value.h" 12 #include "cc/resources/tile_manager.h" 13 #include "third_party/khronos/GLES2/gl2.h" 14 15 namespace cc { 16 17 Tile::Id Tile::s_next_id_ = 0; 18 19 Tile::Tile(TileManager* tile_manager, 20 PicturePileImpl* picture_pile, 21 const gfx::Size& tile_size, 22 const gfx::Rect& content_rect, 23 float contents_scale, 24 int layer_id, 25 int source_frame_number, 26 int flags) 27 : RefCountedManaged<Tile>(tile_manager), 28 tile_manager_(tile_manager), 29 size_(tile_size), 30 content_rect_(content_rect), 31 contents_scale_(contents_scale), 32 layer_id_(layer_id), 33 source_frame_number_(source_frame_number), 34 flags_(flags), 35 is_shared_(false), 36 id_(s_next_id_++) { 37 set_picture_pile(picture_pile); 38 for (int i = 0; i < NUM_TREES; i++) 39 is_occluded_[i] = false; 40 } 41 42 Tile::~Tile() { 43 TRACE_EVENT_OBJECT_DELETED_WITH_ID( 44 TRACE_DISABLED_BY_DEFAULT("cc.debug"), 45 "cc::Tile", this); 46 } 47 48 void Tile::SetPriority(WhichTree tree, const TilePriority& priority) { 49 if (priority == priority_[tree]) 50 return; 51 52 priority_[tree] = priority; 53 tile_manager_->DidChangeTilePriority(this); 54 } 55 56 void Tile::MarkRequiredForActivation() { 57 if (priority_[PENDING_TREE].required_for_activation) 58 return; 59 60 priority_[PENDING_TREE].required_for_activation = true; 61 tile_manager_->DidChangeTilePriority(this); 62 } 63 64 void Tile::AsValueInto(base::debug::TracedValue* res) const { 65 TracedValue::MakeDictIntoImplicitSnapshotWithCategory( 66 TRACE_DISABLED_BY_DEFAULT("cc.debug"), res, "cc::Tile", this); 67 TracedValue::SetIDRef(picture_pile_.get(), res, "picture_pile"); 68 res->SetDouble("contents_scale", contents_scale_); 69 70 res->BeginArray("content_rect"); 71 MathUtil::AddToTracedValue(content_rect_, res); 72 res->EndArray(); 73 74 res->SetInteger("layer_id", layer_id_); 75 76 res->BeginDictionary("active_priority"); 77 priority_[ACTIVE_TREE].AsValueInto(res); 78 res->EndDictionary(); 79 80 res->BeginDictionary("pending_priority"); 81 priority_[PENDING_TREE].AsValueInto(res); 82 res->EndDictionary(); 83 84 res->BeginDictionary("managed_state"); 85 managed_state_.AsValueInto(res); 86 res->EndDictionary(); 87 88 res->SetBoolean("use_picture_analysis", use_picture_analysis()); 89 90 res->SetInteger("gpu_memory_usage", GPUMemoryUsageInBytes()); 91 } 92 93 size_t Tile::GPUMemoryUsageInBytes() const { 94 size_t total_size = 0; 95 for (int mode = 0; mode < NUM_RASTER_MODES; ++mode) 96 total_size += managed_state_.tile_versions[mode].GPUMemoryUsageInBytes(); 97 return total_size; 98 } 99 100 RasterMode Tile::DetermineRasterModeForTree(WhichTree tree) const { 101 return DetermineRasterModeForResolution(priority(tree).resolution); 102 } 103 104 RasterMode Tile::DetermineOverallRasterMode() const { 105 return DetermineRasterModeForResolution(managed_state_.resolution); 106 } 107 108 RasterMode Tile::DetermineRasterModeForResolution( 109 TileResolution resolution) const { 110 RasterMode current_mode = managed_state_.raster_mode; 111 RasterMode raster_mode = resolution == LOW_RESOLUTION 112 ? LOW_QUALITY_RASTER_MODE 113 : HIGH_QUALITY_RASTER_MODE; 114 return std::min(raster_mode, current_mode); 115 } 116 117 bool Tile::HasRasterTask() const { 118 for (int mode = 0; mode < NUM_RASTER_MODES; ++mode) { 119 if (managed_state_.tile_versions[mode].raster_task_.get()) 120 return true; 121 } 122 return false; 123 } 124 125 } // namespace cc 126