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