blob: c6065f97895cd16b3ed2055b3078c76b0474e9d6 [file] [log] [blame]
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +00001// Copyright 2013 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#ifndef CC_RESOURCES_MANAGED_TILE_STATE_H_
6#define CC_RESOURCES_MANAGED_TILE_STATE_H_
7
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +00008#include "base/memory/scoped_ptr.h"
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +01009#include "cc/resources/platform_color.h"
Torne (Richard Coles)868fa2f2013-06-11 10:57:03 +010010#include "cc/resources/raster_worker_pool.h"
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +000011#include "cc/resources/resource_pool.h"
12#include "cc/resources/resource_provider.h"
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +000013
14namespace cc {
15
Ben Murdoch7dbb3d52013-07-17 14:55:54 +010016class TileManager;
17
18// Tile manager classifying tiles into a few basic bins:
19enum ManagedTileBin {
Ben Murdochbb1529c2013-08-08 10:24:53 +010020 NOW_AND_READY_TO_DRAW_BIN = 0, // Ready to draw and within viewport.
21 NOW_BIN = 1, // Needed ASAP.
22 SOON_BIN = 2, // Impl-side version of prepainting.
23 EVENTUALLY_AND_ACTIVE_BIN = 3, // Nice to have, and has a task or resource.
24 EVENTUALLY_BIN = 4, // Nice to have, if we've got memory and time.
25 NEVER_AND_ACTIVE_BIN = 5, // Dont bother, but has a task or resource.
26 NEVER_BIN = 6, // Dont bother.
27 NUM_BINS = 7
Torne (Richard Coles)a36e5922013-08-05 13:57:33 +010028 // NOTE: Be sure to update ManagedTileBinAsValue and kBinPolicyMap when adding
29 // or reordering fields.
Ben Murdoch7dbb3d52013-07-17 14:55:54 +010030};
31scoped_ptr<base::Value> ManagedTileBinAsValue(
32 ManagedTileBin bin);
33
34enum ManagedTileBinPriority {
35 HIGH_PRIORITY_BIN = 0,
36 LOW_PRIORITY_BIN = 1,
37 NUM_BIN_PRIORITIES = 2
38};
39scoped_ptr<base::Value> ManagedTileBinPriorityAsValue(
40 ManagedTileBinPriority bin);
41
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +000042// This is state that is specific to a tile that is
43// managed by the TileManager.
44class CC_EXPORT ManagedTileState {
45 public:
Torne (Richard Coles)90dce4d2013-05-29 14:40:03 +010046 class CC_EXPORT TileVersion {
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +000047 public:
48 enum Mode {
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +010049 RESOURCE_MODE,
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +000050 SOLID_COLOR_MODE,
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +000051 PICTURE_PILE_MODE,
52 NUM_MODES
53 };
54
Torne (Richard Coles)90dce4d2013-05-29 14:40:03 +010055 TileVersion();
56 ~TileVersion();
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +000057
58 Mode mode() const {
59 return mode_;
60 }
61
62 bool IsReadyToDraw() const;
63
64 ResourceProvider::ResourceId get_resource_id() const {
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +010065 DCHECK(mode_ == RESOURCE_MODE);
Torne (Richard Coles)7d4cd472013-06-19 11:58:07 +010066 DCHECK(resource_);
Torne (Richard Coles)868fa2f2013-06-11 10:57:03 +010067
Torne (Richard Coles)7d4cd472013-06-19 11:58:07 +010068 return resource_->id();
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +000069 }
70
71 SkColor get_solid_color() const {
72 DCHECK(mode_ == SOLID_COLOR_MODE);
73
74 return solid_color_;
75 }
76
77 bool contents_swizzled() const {
Torne (Richard Coles)7d4cd472013-06-19 11:58:07 +010078 DCHECK(resource_);
79 return !PlatformColor::SameComponentOrder(resource_->format());
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +000080 }
81
82 bool requires_resource() const {
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +010083 return mode_ == RESOURCE_MODE ||
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +000084 mode_ == PICTURE_PILE_MODE;
85 }
86
Torne (Richard Coles)90dce4d2013-05-29 14:40:03 +010087 size_t GPUMemoryUsageInBytes() const;
88
Torne (Richard Coles)868fa2f2013-06-11 10:57:03 +010089 void SetResourceForTesting(scoped_ptr<ResourcePool::Resource> resource) {
90 resource_ = resource.Pass();
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +000091 }
Torne (Richard Coles)7d4cd472013-06-19 11:58:07 +010092 const ResourcePool::Resource* GetResourceForTesting() const {
93 return resource_.get();
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +010094 }
Ben Murdocheb525c52013-07-10 11:40:50 +010095 void SetSolidColorForTesting(SkColor color) {
96 set_solid_color(color);
97 }
98 void SetHasTextForTesting(bool has_text) {
99 has_text_ = has_text;
100 }
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100101
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000102 private:
103 friend class TileManager;
Ben Murdochbb1529c2013-08-08 10:24:53 +0100104 friend class PrioritizedTileSet;
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100105 friend class Tile;
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000106 friend class ManagedTileState;
107
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100108 void set_use_resource() {
109 mode_ = RESOURCE_MODE;
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000110 }
111
112 void set_solid_color(const SkColor& color) {
113 mode_ = SOLID_COLOR_MODE;
114 solid_color_ = color;
Torne (Richard Coles)7d4cd472013-06-19 11:58:07 +0100115 }
116
117 void set_has_text(bool has_text) {
118 has_text_ = has_text;
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100119 }
120
121 void set_rasterize_on_demand() {
122 mode_ = PICTURE_PILE_MODE;
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000123 }
124
125 Mode mode_;
126 SkColor solid_color_;
Torne (Richard Coles)7d4cd472013-06-19 11:58:07 +0100127 bool has_text_;
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000128 scoped_ptr<ResourcePool::Resource> resource_;
Torne (Richard Coles)868fa2f2013-06-11 10:57:03 +0100129 RasterWorkerPool::RasterTask raster_task_;
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000130 };
131
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000132 ManagedTileState();
133 ~ManagedTileState();
Torne (Richard Coles)90dce4d2013-05-29 14:40:03 +0100134
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000135 scoped_ptr<base::Value> AsValue() const;
136
137 // Persisted state: valid all the time.
Torne (Richard Coles)868fa2f2013-06-11 10:57:03 +0100138 TileVersion tile_versions[NUM_RASTER_MODES];
Torne (Richard Coles)7d4cd472013-06-19 11:58:07 +0100139 RasterMode raster_mode;
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000140
141 // Ephemeral state, valid only during TileManager::ManageTiles.
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100142 bool is_in_never_bin_on_both_trees() const {
Ben Murdochbb1529c2013-08-08 10:24:53 +0100143 return (bin[HIGH_PRIORITY_BIN] == NEVER_BIN ||
144 bin[HIGH_PRIORITY_BIN] == NEVER_AND_ACTIVE_BIN) &&
145 (bin[LOW_PRIORITY_BIN] == NEVER_BIN ||
146 bin[LOW_PRIORITY_BIN] == NEVER_AND_ACTIVE_BIN);
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100147 }
148
Ben Murdoch7dbb3d52013-07-17 14:55:54 +0100149 ManagedTileBin bin[NUM_BIN_PRIORITIES];
150 ManagedTileBin tree_bin[NUM_TREES];
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000151
152 // The bin that the tile would have if the GPU memory manager had
153 // a maximally permissive policy, send to the GPU memory manager
154 // to determine policy.
Ben Murdoch7dbb3d52013-07-17 14:55:54 +0100155 ManagedTileBin gpu_memmgr_stats_bin;
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000156 TileResolution resolution;
Torne (Richard Coles)90dce4d2013-05-29 14:40:03 +0100157 bool required_for_activation;
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000158 float time_to_needed_in_seconds;
159 float distance_to_visible_in_pixels;
Ben Murdoch7dbb3d52013-07-17 14:55:54 +0100160 bool visible_and_ready_to_draw;
Ben Murdoch2385ea32013-08-06 11:01:04 +0100161
162 // Priority for this state from the last time we assigned memory.
163 unsigned scheduled_priority;
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000164};
165
166} // namespace cc
167
168#endif // CC_RESOURCES_MANAGED_TILE_STATE_H_