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 "cc/base/math_util.h" 10#include "cc/debug/traced_value.h" 11#include "cc/resources/tile_manager.h" 12#include "third_party/khronos/GLES2/gl2.h" 13 14namespace cc { 15 16Tile::Id Tile::s_next_id_ = 0; 17 18Tile::Tile(TileManager* tile_manager, 19 PicturePileImpl* picture_pile, 20 const gfx::Size& tile_size, 21 const gfx::Rect& content_rect, 22 const gfx::Rect& opaque_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 tile_size_(tile_size), 30 content_rect_(content_rect), 31 contents_scale_(contents_scale), 32 opaque_rect_(opaque_rect), 33 layer_id_(layer_id), 34 source_frame_number_(source_frame_number), 35 flags_(flags), 36 id_(s_next_id_++) { 37 set_picture_pile(picture_pile); 38} 39 40Tile::~Tile() { 41 TRACE_EVENT_OBJECT_DELETED_WITH_ID( 42 TRACE_DISABLED_BY_DEFAULT("cc.debug"), 43 "cc::Tile", this); 44} 45 46void Tile::SetPriority(WhichTree tree, const TilePriority& priority) { 47 if (priority == priority_[tree]) 48 return; 49 50 priority_[tree] = priority; 51 tile_manager_->DidChangeTilePriority(this); 52} 53 54void Tile::MarkRequiredForActivation() { 55 if (priority_[PENDING_TREE].required_for_activation) 56 return; 57 58 priority_[PENDING_TREE].required_for_activation = true; 59 tile_manager_->DidChangeTilePriority(this); 60} 61 62scoped_ptr<base::Value> Tile::AsValue() const { 63 scoped_ptr<base::DictionaryValue> res(new base::DictionaryValue()); 64 TracedValue::MakeDictIntoImplicitSnapshotWithCategory( 65 TRACE_DISABLED_BY_DEFAULT("cc.debug"), res.get(), "cc::Tile", this); 66 res->Set("picture_pile", 67 TracedValue::CreateIDRef(picture_pile_.get()).release()); 68 res->SetDouble("contents_scale", contents_scale_); 69 res->Set("content_rect", MathUtil::AsValue(content_rect_).release()); 70 res->SetInteger("layer_id", layer_id_); 71 res->Set("active_priority", priority_[ACTIVE_TREE].AsValue().release()); 72 res->Set("pending_priority", priority_[PENDING_TREE].AsValue().release()); 73 res->Set("managed_state", managed_state_.AsValue().release()); 74 res->SetBoolean("use_picture_analysis", use_picture_analysis()); 75 res->SetInteger("gpu_memory_usage", GPUMemoryUsageInBytes()); 76 return res.PassAs<base::Value>(); 77} 78 79size_t Tile::GPUMemoryUsageInBytes() const { 80 size_t total_size = 0; 81 for (int mode = 0; mode < NUM_RASTER_MODES; ++mode) 82 total_size += managed_state_.tile_versions[mode].GPUMemoryUsageInBytes(); 83 return total_size; 84} 85 86RasterMode Tile::DetermineRasterModeForTree(WhichTree tree) const { 87 return DetermineRasterModeForResolution(priority(tree).resolution); 88} 89 90RasterMode Tile::DetermineOverallRasterMode() const { 91 return DetermineRasterModeForResolution(managed_state_.resolution); 92} 93 94RasterMode Tile::DetermineRasterModeForResolution( 95 TileResolution resolution) const { 96 RasterMode current_mode = managed_state_.raster_mode; 97 RasterMode raster_mode = resolution == LOW_RESOLUTION 98 ? LOW_QUALITY_RASTER_MODE 99 : HIGH_QUALITY_RASTER_MODE; 100 return std::min(raster_mode, current_mode); 101} 102 103} // namespace cc 104