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
15namespace cc {
16
17Tile::Id Tile::s_next_id_ = 0;
18
19Tile::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
42Tile::~Tile() {
43  TRACE_EVENT_OBJECT_DELETED_WITH_ID(
44      TRACE_DISABLED_BY_DEFAULT("cc.debug"),
45      "cc::Tile", this);
46}
47
48void 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
56void 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
64void 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
93size_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
100RasterMode Tile::DetermineRasterModeForTree(WhichTree tree) const {
101  return DetermineRasterModeForResolution(priority(tree).resolution);
102}
103
104RasterMode Tile::DetermineOverallRasterMode() const {
105  return DetermineRasterModeForResolution(managed_state_.resolution);
106}
107
108RasterMode 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
117bool 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