Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(104)

Side by Side Diff: cc/tiled_layer.cc

Issue 11189043: cc: Rename cc classes and members to match filenames (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 8 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright 2011 The Chromium Authors. All rights reserved. 1 // Copyright 2011 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "config.h" 5 #include "config.h"
6 6
7 #include "cc/tiled_layer.h" 7 #include "cc/tiled_layer.h"
8 8
9 #include "CCLayerImpl.h" 9 #include "CCLayerImpl.h"
10 #include "CCLayerTreeHost.h" 10 #include "CCLayerTreeHost.h"
11 #include "CCOverdrawMetrics.h" 11 #include "CCOverdrawMetrics.h"
12 #include "CCTextureUpdateQueue.h" 12 #include "CCTextureUpdateQueue.h"
13 #include "CCTiledLayerImpl.h" 13 #include "CCTiledLayerImpl.h"
14 #include "Region.h" 14 #include "Region.h"
15 #include "base/basictypes.h" 15 #include "base/basictypes.h"
16 16
17 using namespace std; 17 using namespace std;
18 using WebKit::WebTransformationMatrix; 18 using WebKit::WebTransformationMatrix;
19 19
20 namespace cc { 20 namespace cc {
21 21
22 class UpdatableTile : public CCLayerTilingData::Tile { 22 class UpdatableTile : public LayerTilingData::Tile {
23 public: 23 public:
24 static scoped_ptr<UpdatableTile> create(scoped_ptr<LayerTextureUpdater::Text ure> texture) 24 static scoped_ptr<UpdatableTile> create(scoped_ptr<LayerTextureUpdater::Text ure> texture)
25 { 25 {
26 return make_scoped_ptr(new UpdatableTile(texture.Pass())); 26 return make_scoped_ptr(new UpdatableTile(texture.Pass()));
27 } 27 }
28 28
29 LayerTextureUpdater::Texture* texture() { return m_texture.get(); } 29 LayerTextureUpdater::Texture* texture() { return m_texture.get(); }
30 CCPrioritizedTexture* managedTexture() { return m_texture->texture(); } 30 PrioritizedTexture* managedTexture() { return m_texture->texture(); }
31 31
32 bool isDirty() const { return !dirtyRect.isEmpty(); } 32 bool isDirty() const { return !dirtyRect.isEmpty(); }
33 33
34 // Reset update state for the current frame. This should occur before painti ng 34 // Reset update state for the current frame. This should occur before painti ng
35 // for all layers. Since painting one layer can invalidate another layer 35 // for all layers. Since painting one layer can invalidate another layer
36 // after it has already painted, mark all non-dirty tiles as valid before pa inting 36 // after it has already painted, mark all non-dirty tiles as valid before pa inting
37 // such that invalidations during painting won't prevent them from being pus hed. 37 // such that invalidations during painting won't prevent them from being pus hed.
38 void resetUpdateState() 38 void resetUpdateState()
39 { 39 {
40 updateRect = IntRect(); 40 updateRect = IntRect();
(...skipping 27 matching lines...) Expand all
68 , isInUseOnImpl(false) 68 , isInUseOnImpl(false)
69 , m_texture(texture.Pass()) 69 , m_texture(texture.Pass())
70 { 70 {
71 } 71 }
72 72
73 scoped_ptr<LayerTextureUpdater::Texture> m_texture; 73 scoped_ptr<LayerTextureUpdater::Texture> m_texture;
74 74
75 DISALLOW_COPY_AND_ASSIGN(UpdatableTile); 75 DISALLOW_COPY_AND_ASSIGN(UpdatableTile);
76 }; 76 };
77 77
78 TiledLayerChromium::TiledLayerChromium() 78 TiledLayer::TiledLayer()
79 : LayerChromium() 79 : Layer()
80 , m_textureFormat(GraphicsContext3D::INVALID_ENUM) 80 , m_textureFormat(GraphicsContext3D::INVALID_ENUM)
81 , m_skipsDraw(false) 81 , m_skipsDraw(false)
82 , m_failedUpdate(false) 82 , m_failedUpdate(false)
83 , m_sampledTexelFormat(LayerTextureUpdater::SampledTexelFormatInvalid) 83 , m_sampledTexelFormat(LayerTextureUpdater::SampledTexelFormatInvalid)
84 , m_tilingOption(AutoTile) 84 , m_tilingOption(AutoTile)
85 { 85 {
86 m_tiler = CCLayerTilingData::create(IntSize(), CCLayerTilingData::HasBorderT exels); 86 m_tiler = LayerTilingData::create(IntSize(), LayerTilingData::HasBorderTexel s);
87 } 87 }
88 88
89 TiledLayerChromium::~TiledLayerChromium() 89 TiledLayer::~TiledLayer()
90 { 90 {
91 } 91 }
92 92
93 scoped_ptr<CCLayerImpl> TiledLayerChromium::createCCLayerImpl() 93 scoped_ptr<LayerImpl> TiledLayer::createLayerImpl()
94 { 94 {
95 return CCTiledLayerImpl::create(id()).PassAs<CCLayerImpl>(); 95 return TiledLayerImpl::create(id()).PassAs<LayerImpl>();
96 } 96 }
97 97
98 void TiledLayerChromium::updateTileSizeAndTilingOption() 98 void TiledLayer::updateTileSizeAndTilingOption()
99 { 99 {
100 ASSERT(layerTreeHost()); 100 ASSERT(layerTreeHost());
101 101
102 const IntSize& defaultTileSize = layerTreeHost()->settings().defaultTileSize ; 102 const IntSize& defaultTileSize = layerTreeHost()->settings().defaultTileSize ;
103 const IntSize& maxUntiledLayerSize = layerTreeHost()->settings().maxUntiledL ayerSize; 103 const IntSize& maxUntiledLayerSize = layerTreeHost()->settings().maxUntiledL ayerSize;
104 int layerWidth = contentBounds().width(); 104 int layerWidth = contentBounds().width();
105 int layerHeight = contentBounds().height(); 105 int layerHeight = contentBounds().height();
106 106
107 const IntSize tileSize(min(defaultTileSize.width(), layerWidth), min(default TileSize.height(), layerHeight)); 107 const IntSize tileSize(min(defaultTileSize.width(), layerWidth), min(default TileSize.height(), layerHeight));
108 108
(...skipping 14 matching lines...) Expand all
123 isTiled = false; 123 isTiled = false;
124 else 124 else
125 isTiled = autoTiled; 125 isTiled = autoTiled;
126 126
127 IntSize requestedSize = isTiled ? tileSize : contentBounds(); 127 IntSize requestedSize = isTiled ? tileSize : contentBounds();
128 const int maxSize = layerTreeHost()->rendererCapabilities().maxTextureSize; 128 const int maxSize = layerTreeHost()->rendererCapabilities().maxTextureSize;
129 IntSize clampedSize = requestedSize.shrunkTo(IntSize(maxSize, maxSize)); 129 IntSize clampedSize = requestedSize.shrunkTo(IntSize(maxSize, maxSize));
130 setTileSize(clampedSize); 130 setTileSize(clampedSize);
131 } 131 }
132 132
133 void TiledLayerChromium::updateBounds() 133 void TiledLayer::updateBounds()
134 { 134 {
135 IntSize oldBounds = m_tiler->bounds(); 135 IntSize oldBounds = m_tiler->bounds();
136 IntSize newBounds = contentBounds(); 136 IntSize newBounds = contentBounds();
137 if (oldBounds == newBounds) 137 if (oldBounds == newBounds)
138 return; 138 return;
139 m_tiler->setBounds(newBounds); 139 m_tiler->setBounds(newBounds);
140 140
141 // Invalidate any areas that the new bounds exposes. 141 // Invalidate any areas that the new bounds exposes.
142 Region oldRegion(IntRect(IntPoint(), oldBounds)); 142 Region oldRegion(IntRect(IntPoint(), oldBounds));
143 Region newRegion(IntRect(IntPoint(), newBounds)); 143 Region newRegion(IntRect(IntPoint(), newBounds));
144 newRegion.subtract(oldRegion); 144 newRegion.subtract(oldRegion);
145 Vector<WebCore::IntRect> rects = newRegion.rects(); 145 Vector<WebCore::IntRect> rects = newRegion.rects();
146 for (size_t i = 0; i < rects.size(); ++i) 146 for (size_t i = 0; i < rects.size(); ++i)
147 invalidateContentRect(rects[i]); 147 invalidateContentRect(rects[i]);
148 } 148 }
149 149
150 void TiledLayerChromium::setTileSize(const IntSize& size) 150 void TiledLayer::setTileSize(const IntSize& size)
151 { 151 {
152 m_tiler->setTileSize(size); 152 m_tiler->setTileSize(size);
153 } 153 }
154 154
155 void TiledLayerChromium::setBorderTexelOption(CCLayerTilingData::BorderTexelOpti on borderTexelOption) 155 void TiledLayer::setBorderTexelOption(LayerTilingData::BorderTexelOption borderT exelOption)
156 { 156 {
157 m_tiler->setBorderTexelOption(borderTexelOption); 157 m_tiler->setBorderTexelOption(borderTexelOption);
158 } 158 }
159 159
160 bool TiledLayerChromium::drawsContent() const 160 bool TiledLayer::drawsContent() const
161 { 161 {
162 if (!LayerChromium::drawsContent()) 162 if (!Layer::drawsContent())
163 return false; 163 return false;
164 164
165 bool hasMoreThanOneTile = m_tiler->numTilesX() > 1 || m_tiler->numTilesY() > 1; 165 bool hasMoreThanOneTile = m_tiler->numTilesX() > 1 || m_tiler->numTilesY() > 1;
166 if (m_tilingOption == NeverTile && hasMoreThanOneTile) 166 if (m_tilingOption == NeverTile && hasMoreThanOneTile)
167 return false; 167 return false;
168 168
169 return true; 169 return true;
170 } 170 }
171 171
172 bool TiledLayerChromium::needsContentsScale() const 172 bool TiledLayer::needsContentsScale() const
173 { 173 {
174 return true; 174 return true;
175 } 175 }
176 176
177 IntSize TiledLayerChromium::contentBounds() const 177 IntSize TiledLayer::contentBounds() const
178 { 178 {
179 return IntSize(lroundf(bounds().width() * contentsScale()), lroundf(bounds() .height() * contentsScale())); 179 return IntSize(lroundf(bounds().width() * contentsScale()), lroundf(bounds() .height() * contentsScale()));
180 } 180 }
181 181
182 void TiledLayerChromium::setTilingOption(TilingOption tilingOption) 182 void TiledLayer::setTilingOption(TilingOption tilingOption)
183 { 183 {
184 m_tilingOption = tilingOption; 184 m_tilingOption = tilingOption;
185 } 185 }
186 186
187 void TiledLayerChromium::setIsMask(bool isMask) 187 void TiledLayer::setIsMask(bool isMask)
188 { 188 {
189 setTilingOption(isMask ? NeverTile : AutoTile); 189 setTilingOption(isMask ? NeverTile : AutoTile);
190 } 190 }
191 191
192 void TiledLayerChromium::pushPropertiesTo(CCLayerImpl* layer) 192 void TiledLayer::pushPropertiesTo(LayerImpl* layer)
193 { 193 {
194 LayerChromium::pushPropertiesTo(layer); 194 Layer::pushPropertiesTo(layer);
195 195
196 CCTiledLayerImpl* tiledLayer = static_cast<CCTiledLayerImpl*>(layer); 196 TiledLayerImpl* tiledLayer = static_cast<TiledLayerImpl*>(layer);
197 197
198 tiledLayer->setSkipsDraw(m_skipsDraw); 198 tiledLayer->setSkipsDraw(m_skipsDraw);
199 tiledLayer->setContentsSwizzled(m_sampledTexelFormat != LayerTextureUpdater: :SampledTexelFormatRGBA); 199 tiledLayer->setContentsSwizzled(m_sampledTexelFormat != LayerTextureUpdater: :SampledTexelFormatRGBA);
200 tiledLayer->setTilingData(*m_tiler); 200 tiledLayer->setTilingData(*m_tiler);
201 Vector<UpdatableTile*> invalidTiles; 201 Vector<UpdatableTile*> invalidTiles;
202 202
203 for (CCLayerTilingData::TileMap::const_iterator iter = m_tiler->tiles().begi n(); iter != m_tiler->tiles().end(); ++iter) { 203 for (LayerTilingData::TileMap::const_iterator iter = m_tiler->tiles().begin( ); iter != m_tiler->tiles().end(); ++iter) {
204 int i = iter->first.first; 204 int i = iter->first.first;
205 int j = iter->first.second; 205 int j = iter->first.second;
206 UpdatableTile* tile = static_cast<UpdatableTile*>(iter->second); 206 UpdatableTile* tile = static_cast<UpdatableTile*>(iter->second);
207 // FIXME: This should not ever be null. 207 // FIXME: This should not ever be null.
208 if (!tile) 208 if (!tile)
209 continue; 209 continue;
210 210
211 tile->isInUseOnImpl = false; 211 tile->isInUseOnImpl = false;
212 212
213 if (!tile->managedTexture()->haveBackingTexture()) { 213 if (!tile->managedTexture()->haveBackingTexture()) {
214 // Evicted tiles get deleted from both layers 214 // Evicted tiles get deleted from both layers
215 invalidTiles.append(tile); 215 invalidTiles.append(tile);
216 continue; 216 continue;
217 } 217 }
218 218
219 if (!tile->validForFrame) { 219 if (!tile->validForFrame) {
220 // Invalidated tiles are set so they can get different debug colors. 220 // Invalidated tiles are set so they can get different debug colors.
221 tiledLayer->pushInvalidTile(i, j); 221 tiledLayer->pushInvalidTile(i, j);
222 continue; 222 continue;
223 } 223 }
224 224
225 tiledLayer->pushTileProperties(i, j, tile->managedTexture()->resourceId( ), tile->opaqueRect()); 225 tiledLayer->pushTileProperties(i, j, tile->managedTexture()->resourceId( ), tile->opaqueRect());
226 tile->isInUseOnImpl = true; 226 tile->isInUseOnImpl = true;
227 } 227 }
228 for (Vector<UpdatableTile*>::const_iterator iter = invalidTiles.begin(); ite r != invalidTiles.end(); ++iter) 228 for (Vector<UpdatableTile*>::const_iterator iter = invalidTiles.begin(); ite r != invalidTiles.end(); ++iter)
229 m_tiler->takeTile((*iter)->i(), (*iter)->j()); 229 m_tiler->takeTile((*iter)->i(), (*iter)->j());
230 } 230 }
231 231
232 CCPrioritizedTextureManager* TiledLayerChromium::textureManager() const 232 PrioritizedTextureManager* TiledLayer::textureManager() const
233 { 233 {
234 if (!layerTreeHost()) 234 if (!layerTreeHost())
235 return 0; 235 return 0;
236 return layerTreeHost()->contentsTextureManager(); 236 return layerTreeHost()->contentsTextureManager();
237 } 237 }
238 238
239 void TiledLayerChromium::setLayerTreeHost(CCLayerTreeHost* host) 239 void TiledLayer::setLayerTreeHost(LayerTreeHost* host)
240 { 240 {
241 if (host && host != layerTreeHost()) { 241 if (host && host != layerTreeHost()) {
242 for (CCLayerTilingData::TileMap::const_iterator iter = m_tiler->tiles(). begin(); iter != m_tiler->tiles().end(); ++iter) { 242 for (LayerTilingData::TileMap::const_iterator iter = m_tiler->tiles().be gin(); iter != m_tiler->tiles().end(); ++iter) {
243 UpdatableTile* tile = static_cast<UpdatableTile*>(iter->second); 243 UpdatableTile* tile = static_cast<UpdatableTile*>(iter->second);
244 // FIXME: This should not ever be null. 244 // FIXME: This should not ever be null.
245 if (!tile) 245 if (!tile)
246 continue; 246 continue;
247 tile->managedTexture()->setTextureManager(host->contentsTextureManag er()); 247 tile->managedTexture()->setTextureManager(host->contentsTextureManag er());
248 } 248 }
249 } 249 }
250 LayerChromium::setLayerTreeHost(host); 250 Layer::setLayerTreeHost(host);
251 } 251 }
252 252
253 UpdatableTile* TiledLayerChromium::tileAt(int i, int j) const 253 UpdatableTile* TiledLayer::tileAt(int i, int j) const
254 { 254 {
255 return static_cast<UpdatableTile*>(m_tiler->tileAt(i, j)); 255 return static_cast<UpdatableTile*>(m_tiler->tileAt(i, j));
256 } 256 }
257 257
258 UpdatableTile* TiledLayerChromium::createTile(int i, int j) 258 UpdatableTile* TiledLayer::createTile(int i, int j)
259 { 259 {
260 createTextureUpdaterIfNeeded(); 260 createTextureUpdaterIfNeeded();
261 261
262 scoped_ptr<UpdatableTile> tile(UpdatableTile::create(textureUpdater()->creat eTexture(textureManager()))); 262 scoped_ptr<UpdatableTile> tile(UpdatableTile::create(textureUpdater()->creat eTexture(textureManager())));
263 tile->managedTexture()->setDimensions(m_tiler->tileSize(), m_textureFormat); 263 tile->managedTexture()->setDimensions(m_tiler->tileSize(), m_textureFormat);
264 264
265 UpdatableTile* addedTile = tile.get(); 265 UpdatableTile* addedTile = tile.get();
266 m_tiler->addTile(tile.PassAs<CCLayerTilingData::Tile>(), i, j); 266 m_tiler->addTile(tile.PassAs<LayerTilingData::Tile>(), i, j);
267 267
268 addedTile->dirtyRect = m_tiler->tileRect(addedTile); 268 addedTile->dirtyRect = m_tiler->tileRect(addedTile);
269 269
270 // Temporary diagnostic crash. 270 // Temporary diagnostic crash.
271 if (!addedTile) 271 if (!addedTile)
272 CRASH(); 272 CRASH();
273 if (!tileAt(i, j)) 273 if (!tileAt(i, j))
274 CRASH(); 274 CRASH();
275 275
276 return addedTile; 276 return addedTile;
277 } 277 }
278 278
279 void TiledLayerChromium::setNeedsDisplayRect(const FloatRect& dirtyRect) 279 void TiledLayer::setNeedsDisplayRect(const FloatRect& dirtyRect)
280 { 280 {
281 float contentsWidthScale = static_cast<float>(contentBounds().width()) / bou nds().width(); 281 float contentsWidthScale = static_cast<float>(contentBounds().width()) / bou nds().width();
282 float contentsHeightScale = static_cast<float>(contentBounds().height()) / b ounds().height(); 282 float contentsHeightScale = static_cast<float>(contentBounds().height()) / b ounds().height();
283 FloatRect scaledDirtyRect(dirtyRect); 283 FloatRect scaledDirtyRect(dirtyRect);
284 scaledDirtyRect.scale(contentsWidthScale, contentsHeightScale); 284 scaledDirtyRect.scale(contentsWidthScale, contentsHeightScale);
285 IntRect dirty = enclosingIntRect(scaledDirtyRect); 285 IntRect dirty = enclosingIntRect(scaledDirtyRect);
286 invalidateContentRect(dirty); 286 invalidateContentRect(dirty);
287 LayerChromium::setNeedsDisplayRect(dirtyRect); 287 Layer::setNeedsDisplayRect(dirtyRect);
288 } 288 }
289 289
290 void TiledLayerChromium::setUseLCDText(bool useLCDText) 290 void TiledLayer::setUseLCDText(bool useLCDText)
291 { 291 {
292 LayerChromium::setUseLCDText(useLCDText); 292 Layer::setUseLCDText(useLCDText);
293 293
294 CCLayerTilingData::BorderTexelOption borderTexelOption; 294 LayerTilingData::BorderTexelOption borderTexelOption;
295 #if OS(ANDROID) 295 #if OS(ANDROID)
296 // Always want border texels and GL_LINEAR due to pinch zoom. 296 // Always want border texels and GL_LINEAR due to pinch zoom.
297 borderTexelOption = CCLayerTilingData::HasBorderTexels; 297 borderTexelOption = LayerTilingData::HasBorderTexels;
298 #else 298 #else
299 borderTexelOption = useLCDText ? CCLayerTilingData::NoBorderTexels : CCLayer TilingData::HasBorderTexels; 299 borderTexelOption = useLCDText ? LayerTilingData::NoBorderTexels : LayerTili ngData::HasBorderTexels;
300 #endif 300 #endif
301 setBorderTexelOption(borderTexelOption); 301 setBorderTexelOption(borderTexelOption);
302 } 302 }
303 303
304 void TiledLayerChromium::invalidateContentRect(const IntRect& contentRect) 304 void TiledLayer::invalidateContentRect(const IntRect& contentRect)
305 { 305 {
306 updateBounds(); 306 updateBounds();
307 if (m_tiler->isEmpty() || contentRect.isEmpty() || m_skipsDraw) 307 if (m_tiler->isEmpty() || contentRect.isEmpty() || m_skipsDraw)
308 return; 308 return;
309 309
310 for (CCLayerTilingData::TileMap::const_iterator iter = m_tiler->tiles().begi n(); iter != m_tiler->tiles().end(); ++iter) { 310 for (LayerTilingData::TileMap::const_iterator iter = m_tiler->tiles().begin( ); iter != m_tiler->tiles().end(); ++iter) {
311 UpdatableTile* tile = static_cast<UpdatableTile*>(iter->second); 311 UpdatableTile* tile = static_cast<UpdatableTile*>(iter->second);
312 ASSERT(tile); 312 ASSERT(tile);
313 // FIXME: This should not ever be null. 313 // FIXME: This should not ever be null.
314 if (!tile) 314 if (!tile)
315 continue; 315 continue;
316 IntRect bound = m_tiler->tileRect(tile); 316 IntRect bound = m_tiler->tileRect(tile);
317 bound.intersect(contentRect); 317 bound.intersect(contentRect);
318 tile->dirtyRect.unite(bound); 318 tile->dirtyRect.unite(bound);
319 } 319 }
320 } 320 }
321 321
322 // Returns true if tile is dirty and only part of it needs to be updated. 322 // Returns true if tile is dirty and only part of it needs to be updated.
323 bool TiledLayerChromium::tileOnlyNeedsPartialUpdate(UpdatableTile* tile) 323 bool TiledLayer::tileOnlyNeedsPartialUpdate(UpdatableTile* tile)
324 { 324 {
325 return !tile->dirtyRect.contains(m_tiler->tileRect(tile)); 325 return !tile->dirtyRect.contains(m_tiler->tileRect(tile));
326 } 326 }
327 327
328 // Dirty tiles with valid textures needs buffered update to guarantee that 328 // Dirty tiles with valid textures needs buffered update to guarantee that
329 // we don't modify textures currently used for drawing by the impl thread. 329 // we don't modify textures currently used for drawing by the impl thread.
330 bool TiledLayerChromium::tileNeedsBufferedUpdate(UpdatableTile* tile) 330 bool TiledLayer::tileNeedsBufferedUpdate(UpdatableTile* tile)
331 { 331 {
332 if (!tile->managedTexture()->haveBackingTexture()) 332 if (!tile->managedTexture()->haveBackingTexture())
333 return false; 333 return false;
334 334
335 if (!tile->isDirty()) 335 if (!tile->isDirty())
336 return false; 336 return false;
337 337
338 if (!tile->isInUseOnImpl) 338 if (!tile->isInUseOnImpl)
339 return false; 339 return false;
340 340
341 return true; 341 return true;
342 } 342 }
343 343
344 344
345 bool TiledLayerChromium::updateTiles(int left, int top, int right, int bottom, C CTextureUpdateQueue& queue, const CCOcclusionTracker* occlusion, CCRenderingStat s& stats, bool& didPaint) 345 bool TiledLayer::updateTiles(int left, int top, int right, int bottom, TextureUp dateQueue& queue, const OcclusionTracker* occlusion, RenderingStats& stats, bool & didPaint)
346 { 346 {
347 didPaint = false; 347 didPaint = false;
348 createTextureUpdaterIfNeeded(); 348 createTextureUpdaterIfNeeded();
349 349
350 bool ignoreOcclusions = !occlusion; 350 bool ignoreOcclusions = !occlusion;
351 if (!haveTexturesForTiles(left, top, right, bottom, ignoreOcclusions)) { 351 if (!haveTexturesForTiles(left, top, right, bottom, ignoreOcclusions)) {
352 m_failedUpdate = true; 352 m_failedUpdate = true;
353 return false; 353 return false;
354 } 354 }
355 355
356 IntRect paintRect = markTilesForUpdate(left, top, right, bottom, ignoreOcclu sions); 356 IntRect paintRect = markTilesForUpdate(left, top, right, bottom, ignoreOcclu sions);
357 357
358 if (occlusion) 358 if (occlusion)
359 occlusion->overdrawMetrics().didPaint(paintRect); 359 occlusion->overdrawMetrics().didPaint(paintRect);
360 360
361 if (paintRect.isEmpty()) 361 if (paintRect.isEmpty())
362 return true; 362 return true;
363 363
364 didPaint = true; 364 didPaint = true;
365 updateTileTextures(paintRect, left, top, right, bottom, queue, occlusion, st ats); 365 updateTileTextures(paintRect, left, top, right, bottom, queue, occlusion, st ats);
366 return true; 366 return true;
367 } 367 }
368 368
369 void TiledLayerChromium::markOcclusionsAndRequestTextures(int left, int top, int right, int bottom, const CCOcclusionTracker* occlusion) 369 void TiledLayer::markOcclusionsAndRequestTextures(int left, int top, int right, int bottom, const OcclusionTracker* occlusion)
370 { 370 {
371 // There is some difficult dependancies between occlusions, recording occlus ion metrics 371 // There is some difficult dependancies between occlusions, recording occlus ion metrics
372 // and requesting memory so those are encapsulated in this function: 372 // and requesting memory so those are encapsulated in this function:
373 // - We only want to call requestLate on unoccluded textures (to preserve 373 // - We only want to call requestLate on unoccluded textures (to preserve
374 // memory for other layers when near OOM). 374 // memory for other layers when near OOM).
375 // - We only want to record occlusion metrics if all memory requests succeed . 375 // - We only want to record occlusion metrics if all memory requests succeed .
376 376
377 int occludedTileCount = 0; 377 int occludedTileCount = 0;
378 bool succeeded = true; 378 bool succeeded = true;
379 for (int j = top; j <= bottom; ++j) { 379 for (int j = top; j <= bottom; ++j) {
(...skipping 15 matching lines...) Expand all
395 } 395 }
396 396
397 if (!succeeded) 397 if (!succeeded)
398 return; 398 return;
399 399
400 // FIXME: Remove the loop and just pass the count! 400 // FIXME: Remove the loop and just pass the count!
401 for (int i = 0; i < occludedTileCount; i++) 401 for (int i = 0; i < occludedTileCount; i++)
402 occlusion->overdrawMetrics().didCullTileForUpload(); 402 occlusion->overdrawMetrics().didCullTileForUpload();
403 } 403 }
404 404
405 bool TiledLayerChromium::haveTexturesForTiles(int left, int top, int right, int bottom, bool ignoreOcclusions) 405 bool TiledLayer::haveTexturesForTiles(int left, int top, int right, int bottom, bool ignoreOcclusions)
406 { 406 {
407 for (int j = top; j <= bottom; ++j) { 407 for (int j = top; j <= bottom; ++j) {
408 for (int i = left; i <= right; ++i) { 408 for (int i = left; i <= right; ++i) {
409 UpdatableTile* tile = tileAt(i, j); 409 UpdatableTile* tile = tileAt(i, j);
410 ASSERT(tile); // Did setTexturePriorites get skipped? 410 ASSERT(tile); // Did setTexturePriorites get skipped?
411 // FIXME: This should not ever be null. 411 // FIXME: This should not ever be null.
412 if (!tile) 412 if (!tile)
413 continue; 413 continue;
414 414
415 // Ensure the entire tile is dirty if we don't have the texture. 415 // Ensure the entire tile is dirty if we don't have the texture.
416 if (!tile->managedTexture()->haveBackingTexture()) 416 if (!tile->managedTexture()->haveBackingTexture())
417 tile->dirtyRect = m_tiler->tileRect(tile); 417 tile->dirtyRect = m_tiler->tileRect(tile);
418 418
419 // If using occlusion and the visible region of the tile is occluded , 419 // If using occlusion and the visible region of the tile is occluded ,
420 // don't reserve a texture or update the tile. 420 // don't reserve a texture or update the tile.
421 if (tile->occluded && !ignoreOcclusions) 421 if (tile->occluded && !ignoreOcclusions)
422 continue; 422 continue;
423 423
424 if (!tile->managedTexture()->canAcquireBackingTexture()) 424 if (!tile->managedTexture()->canAcquireBackingTexture())
425 return false; 425 return false;
426 } 426 }
427 } 427 }
428 return true; 428 return true;
429 } 429 }
430 430
431 IntRect TiledLayerChromium::markTilesForUpdate(int left, int top, int right, int bottom, bool ignoreOcclusions) 431 IntRect TiledLayer::markTilesForUpdate(int left, int top, int right, int bottom, bool ignoreOcclusions)
432 { 432 {
433 IntRect paintRect; 433 IntRect paintRect;
434 for (int j = top; j <= bottom; ++j) { 434 for (int j = top; j <= bottom; ++j) {
435 for (int i = left; i <= right; ++i) { 435 for (int i = left; i <= right; ++i) {
436 UpdatableTile* tile = tileAt(i, j); 436 UpdatableTile* tile = tileAt(i, j);
437 ASSERT(tile); // Did setTexturePriorites get skipped? 437 ASSERT(tile); // Did setTexturePriorites get skipped?
438 // FIXME: This should not ever be null. 438 // FIXME: This should not ever be null.
439 if (!tile) 439 if (!tile)
440 continue; 440 continue;
441 if (tile->occluded && !ignoreOcclusions) 441 if (tile->occluded && !ignoreOcclusions)
442 continue; 442 continue;
443 paintRect.unite(tile->dirtyRect); 443 paintRect.unite(tile->dirtyRect);
444 tile->markForUpdate(); 444 tile->markForUpdate();
445 } 445 }
446 } 446 }
447 return paintRect; 447 return paintRect;
448 } 448 }
449 449
450 void TiledLayerChromium::updateTileTextures(const IntRect& paintRect, int left, int top, int right, int bottom, CCTextureUpdateQueue& queue, const CCOcclusionTr acker* occlusion, CCRenderingStats& stats) 450 void TiledLayer::updateTileTextures(const IntRect& paintRect, int left, int top, int right, int bottom, TextureUpdateQueue& queue, const OcclusionTracker* occlu sion, RenderingStats& stats)
451 { 451 {
452 // The updateRect should be in layer space. So we have to convert the paintR ect from content space to layer space. 452 // The updateRect should be in layer space. So we have to convert the paintR ect from content space to layer space.
453 m_updateRect = FloatRect(paintRect); 453 m_updateRect = FloatRect(paintRect);
454 float widthScale = bounds().width() / static_cast<float>(contentBounds().wid th()); 454 float widthScale = bounds().width() / static_cast<float>(contentBounds().wid th());
455 float heightScale = bounds().height() / static_cast<float>(contentBounds().h eight()); 455 float heightScale = bounds().height() / static_cast<float>(contentBounds().h eight());
456 m_updateRect.scale(widthScale, heightScale); 456 m_updateRect.scale(widthScale, heightScale);
457 457
458 // Calling prepareToUpdate() calls into WebKit to paint, which may have the side 458 // Calling prepareToUpdate() calls into WebKit to paint, which may have the side
459 // effect of disabling compositing, which causes our reference to the textur e updater to be deleted. 459 // effect of disabling compositing, which causes our reference to the textur e updater to be deleted.
460 // However, we can't free the memory backing the SkCanvas until the paint fi nishes, 460 // However, we can't free the memory backing the SkCanvas until the paint fi nishes,
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
528 occlusion->overdrawMetrics().didUpload(WebTransformationMatrix() , sourceRect, tile->opaqueRect()); 528 occlusion->overdrawMetrics().didUpload(WebTransformationMatrix() , sourceRect, tile->opaqueRect());
529 529
530 } 530 }
531 } 531 }
532 } 532 }
533 533
534 namespace { 534 namespace {
535 // This picks a small animated layer to be anything less than one viewport. This 535 // This picks a small animated layer to be anything less than one viewport. This
536 // is specifically for page transitions which are viewport-sized layers. The ext ra 536 // is specifically for page transitions which are viewport-sized layers. The ext ra
537 // 64 pixels is due to these layers being slightly larger than the viewport in s ome cases. 537 // 64 pixels is due to these layers being slightly larger than the viewport in s ome cases.
538 bool isSmallAnimatedLayer(TiledLayerChromium* layer) 538 bool isSmallAnimatedLayer(TiledLayer* layer)
539 { 539 {
540 if (!layer->drawTransformIsAnimating() && !layer->screenSpaceTransformIsAnim ating()) 540 if (!layer->drawTransformIsAnimating() && !layer->screenSpaceTransformIsAnim ating())
541 return false; 541 return false;
542 IntSize viewportSize = layer->layerTreeHost() ? layer->layerTreeHost()->devi ceViewportSize() : IntSize(); 542 IntSize viewportSize = layer->layerTreeHost() ? layer->layerTreeHost()->devi ceViewportSize() : IntSize();
543 IntRect contentRect(IntPoint::zero(), layer->contentBounds()); 543 IntRect contentRect(IntPoint::zero(), layer->contentBounds());
544 return contentRect.width() <= viewportSize.width() + 64 544 return contentRect.width() <= viewportSize.width() + 64
545 && contentRect.height() <= viewportSize.height() + 64; 545 && contentRect.height() <= viewportSize.height() + 64;
546 } 546 }
547 547
548 // FIXME: Remove this and make this based on distance once distance can be calcu lated 548 // FIXME: Remove this and make this based on distance once distance can be calcu lated
549 // for offscreen layers. For now, prioritize all small animated layers after 512 549 // for offscreen layers. For now, prioritize all small animated layers after 512
550 // pixels of pre-painting. 550 // pixels of pre-painting.
551 void setPriorityForTexture(const IntRect& visibleRect, 551 void setPriorityForTexture(const IntRect& visibleRect,
552 const IntRect& tileRect, 552 const IntRect& tileRect,
553 bool drawsToRoot, 553 bool drawsToRoot,
554 bool isSmallAnimatedLayer, 554 bool isSmallAnimatedLayer,
555 CCPrioritizedTexture* texture) 555 PrioritizedTexture* texture)
556 { 556 {
557 int priority = CCPriorityCalculator::lowestPriority(); 557 int priority = PriorityCalculator::lowestPriority();
558 if (!visibleRect.isEmpty()) 558 if (!visibleRect.isEmpty())
559 priority = CCPriorityCalculator::priorityFromDistance(visibleRect, tileR ect, drawsToRoot); 559 priority = PriorityCalculator::priorityFromDistance(visibleRect, tileRec t, drawsToRoot);
560 if (isSmallAnimatedLayer) 560 if (isSmallAnimatedLayer)
561 priority = CCPriorityCalculator::maxPriority(priority, CCPriorityCalcula tor::smallAnimatedLayerMinPriority()); 561 priority = PriorityCalculator::maxPriority(priority, PriorityCalculator: :smallAnimatedLayerMinPriority());
562 if (priority != CCPriorityCalculator::lowestPriority()) 562 if (priority != PriorityCalculator::lowestPriority())
563 texture->setRequestPriority(priority); 563 texture->setRequestPriority(priority);
564 } 564 }
565 } 565 }
566 566
567 void TiledLayerChromium::setTexturePriorities(const CCPriorityCalculator& priori tyCalc) 567 void TiledLayer::setTexturePriorities(const PriorityCalculator& priorityCalc)
568 { 568 {
569 updateBounds(); 569 updateBounds();
570 resetUpdateState(); 570 resetUpdateState();
571 571
572 if (m_tiler->hasEmptyBounds()) 572 if (m_tiler->hasEmptyBounds())
573 return; 573 return;
574 574
575 bool drawsToRoot = !renderTarget()->parent(); 575 bool drawsToRoot = !renderTarget()->parent();
576 bool smallAnimatedLayer = isSmallAnimatedLayer(this); 576 bool smallAnimatedLayer = isSmallAnimatedLayer(this);
577 577
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
613 continue; 613 continue;
614 if (tileOnlyNeedsPartialUpdate(tile) && layerTreeHost()->request PartialTextureUpdate()) { 614 if (tileOnlyNeedsPartialUpdate(tile) && layerTreeHost()->request PartialTextureUpdate()) {
615 tile->partialUpdate = true; 615 tile->partialUpdate = true;
616 continue; 616 continue;
617 } 617 }
618 618
619 IntRect tileRect = m_tiler->tileRect(tile); 619 IntRect tileRect = m_tiler->tileRect(tile);
620 tile->dirtyRect = tileRect; 620 tile->dirtyRect = tileRect;
621 LayerTextureUpdater::Texture* backBuffer = tile->texture(); 621 LayerTextureUpdater::Texture* backBuffer = tile->texture();
622 setPriorityForTexture(visibleContentRect(), tile->dirtyRect, dra wsToRoot, smallAnimatedLayer, backBuffer->texture()); 622 setPriorityForTexture(visibleContentRect(), tile->dirtyRect, dra wsToRoot, smallAnimatedLayer, backBuffer->texture());
623 scoped_ptr<CCPrioritizedTexture> frontBuffer = CCPrioritizedText ure::create(backBuffer->texture()->textureManager(), 623 scoped_ptr<PrioritizedTexture> frontBuffer = PrioritizedTexture: :create(backBuffer->texture()->textureManager(),
624 backBuffer->texture()->size(), 624 backBuffer->texture()->size(),
625 backBuffer->texture()->format()); 625 backBuffer->texture()->format());
626 // Swap backBuffer into frontBuffer and add it to delete after c ommit queue. 626 // Swap backBuffer into frontBuffer and add it to delete after c ommit queue.
627 backBuffer->swapTextureWith(frontBuffer); 627 backBuffer->swapTextureWith(frontBuffer);
628 layerTreeHost()->deleteTextureAfterCommit(frontBuffer.Pass()); 628 layerTreeHost()->deleteTextureAfterCommit(frontBuffer.Pass());
629 } 629 }
630 } 630 }
631 } 631 }
632 632
633 // Now update priorities on all tiles we have in the layer, no matter where they are. 633 // Now update priorities on all tiles we have in the layer, no matter where they are.
634 for (CCLayerTilingData::TileMap::const_iterator iter = m_tiler->tiles().begi n(); iter != m_tiler->tiles().end(); ++iter) { 634 for (LayerTilingData::TileMap::const_iterator iter = m_tiler->tiles().begin( ); iter != m_tiler->tiles().end(); ++iter) {
635 UpdatableTile* tile = static_cast<UpdatableTile*>(iter->second); 635 UpdatableTile* tile = static_cast<UpdatableTile*>(iter->second);
636 // FIXME: This should not ever be null. 636 // FIXME: This should not ever be null.
637 if (!tile) 637 if (!tile)
638 continue; 638 continue;
639 IntRect tileRect = m_tiler->tileRect(tile); 639 IntRect tileRect = m_tiler->tileRect(tile);
640 setPriorityForTexture(visibleContentRect(), tileRect, drawsToRoot, small AnimatedLayer, tile->managedTexture()); 640 setPriorityForTexture(visibleContentRect(), tileRect, drawsToRoot, small AnimatedLayer, tile->managedTexture());
641 } 641 }
642 } 642 }
643 643
644 Region TiledLayerChromium::visibleContentOpaqueRegion() const 644 Region TiledLayer::visibleContentOpaqueRegion() const
645 { 645 {
646 if (m_skipsDraw) 646 if (m_skipsDraw)
647 return Region(); 647 return Region();
648 if (contentsOpaque()) 648 if (contentsOpaque())
649 return visibleContentRect(); 649 return visibleContentRect();
650 return m_tiler->opaqueRegionInContentRect(visibleContentRect()); 650 return m_tiler->opaqueRegionInContentRect(visibleContentRect());
651 } 651 }
652 652
653 void TiledLayerChromium::resetUpdateState() 653 void TiledLayer::resetUpdateState()
654 { 654 {
655 m_skipsDraw = false; 655 m_skipsDraw = false;
656 m_failedUpdate = false; 656 m_failedUpdate = false;
657 657
658 CCLayerTilingData::TileMap::const_iterator end = m_tiler->tiles().end(); 658 LayerTilingData::TileMap::const_iterator end = m_tiler->tiles().end();
659 for (CCLayerTilingData::TileMap::const_iterator iter = m_tiler->tiles().begi n(); iter != end; ++iter) { 659 for (LayerTilingData::TileMap::const_iterator iter = m_tiler->tiles().begin( ); iter != end; ++iter) {
660 UpdatableTile* tile = static_cast<UpdatableTile*>(iter->second); 660 UpdatableTile* tile = static_cast<UpdatableTile*>(iter->second);
661 // FIXME: This should not ever be null. 661 // FIXME: This should not ever be null.
662 if (!tile) 662 if (!tile)
663 continue; 663 continue;
664 tile->resetUpdateState(); 664 tile->resetUpdateState();
665 } 665 }
666 } 666 }
667 667
668 void TiledLayerChromium::update(CCTextureUpdateQueue& queue, const CCOcclusionTr acker* occlusion, CCRenderingStats& stats) 668 void TiledLayer::update(TextureUpdateQueue& queue, const OcclusionTracker* occlu sion, RenderingStats& stats)
669 { 669 {
670 ASSERT(!m_skipsDraw && !m_failedUpdate); // Did resetUpdateState get skipped ? 670 ASSERT(!m_skipsDraw && !m_failedUpdate); // Did resetUpdateState get skipped ?
671 updateBounds(); 671 updateBounds();
672 if (m_tiler->hasEmptyBounds() || !drawsContent()) 672 if (m_tiler->hasEmptyBounds() || !drawsContent())
673 return; 673 return;
674 674
675 bool didPaint = false; 675 bool didPaint = false;
676 676
677 // Animation pre-paint. If the layer is small, try to paint it all 677 // Animation pre-paint. If the layer is small, try to paint it all
678 // immediately whether or not it is occluded, to avoid paint/upload 678 // immediately whether or not it is occluded, to avoid paint/upload
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
731 return; 731 return;
732 } 732 }
733 if (right < prepaintRight) { 733 if (right < prepaintRight) {
734 ++right; 734 ++right;
735 if (!updateTiles(right, top, right, bottom, queue, 0, stats, didPain t) || didPaint) 735 if (!updateTiles(right, top, right, bottom, queue, 0, stats, didPain t) || didPaint)
736 return; 736 return;
737 } 737 }
738 } 738 }
739 } 739 }
740 740
741 bool TiledLayerChromium::needsIdlePaint() 741 bool TiledLayer::needsIdlePaint()
742 { 742 {
743 // Don't trigger more paints if we failed (as we'll just fail again). 743 // Don't trigger more paints if we failed (as we'll just fail again).
744 if (m_failedUpdate || visibleContentRect().isEmpty() || m_tiler->hasEmptyBou nds() || !drawsContent()) 744 if (m_failedUpdate || visibleContentRect().isEmpty() || m_tiler->hasEmptyBou nds() || !drawsContent())
745 return false; 745 return false;
746 746
747 IntRect idlePaintContentRect = idlePaintRect(); 747 IntRect idlePaintContentRect = idlePaintRect();
748 if (idlePaintContentRect.isEmpty()) 748 if (idlePaintContentRect.isEmpty())
749 return false; 749 return false;
750 750
751 int left, top, right, bottom; 751 int left, top, right, bottom;
752 m_tiler->contentRectToTileIndices(idlePaintContentRect, left, top, right, bo ttom); 752 m_tiler->contentRectToTileIndices(idlePaintContentRect, left, top, right, bo ttom);
753 753
754 for (int j = top; j <= bottom; ++j) { 754 for (int j = top; j <= bottom; ++j) {
755 for (int i = left; i <= right; ++i) { 755 for (int i = left; i <= right; ++i) {
756 UpdatableTile* tile = tileAt(i, j); 756 UpdatableTile* tile = tileAt(i, j);
757 ASSERT(tile); // Did setTexturePriorities get skipped? 757 ASSERT(tile); // Did setTexturePriorities get skipped?
758 if (!tile) 758 if (!tile)
759 continue; 759 continue;
760 760
761 bool updated = !tile->updateRect.isEmpty(); 761 bool updated = !tile->updateRect.isEmpty();
762 bool canAcquire = tile->managedTexture()->canAcquireBackingTexture() ; 762 bool canAcquire = tile->managedTexture()->canAcquireBackingTexture() ;
763 bool dirty = tile->isDirty() || !tile->managedTexture()->haveBacking Texture(); 763 bool dirty = tile->isDirty() || !tile->managedTexture()->haveBacking Texture();
764 if (!updated && canAcquire && dirty) 764 if (!updated && canAcquire && dirty)
765 return true; 765 return true;
766 } 766 }
767 } 767 }
768 return false; 768 return false;
769 } 769 }
770 770
771 IntRect TiledLayerChromium::idlePaintRect() 771 IntRect TiledLayer::idlePaintRect()
772 { 772 {
773 // Don't inflate an empty rect. 773 // Don't inflate an empty rect.
774 if (visibleContentRect().isEmpty()) 774 if (visibleContentRect().isEmpty())
775 return IntRect(); 775 return IntRect();
776 776
777 // FIXME: This can be made a lot larger now! We should increase 777 // FIXME: This can be made a lot larger now! We should increase
778 // this slowly while insuring it doesn't cause any perf issues. 778 // this slowly while insuring it doesn't cause any perf issues.
779 IntRect prepaintRect = visibleContentRect(); 779 IntRect prepaintRect = visibleContentRect();
780 prepaintRect.inflateX(m_tiler->tileSize().width()); 780 prepaintRect.inflateX(m_tiler->tileSize().width());
781 prepaintRect.inflateY(m_tiler->tileSize().height() * 2); 781 prepaintRect.inflateY(m_tiler->tileSize().height() * 2);
782 IntRect contentRect(IntPoint::zero(), contentBounds()); 782 IntRect contentRect(IntPoint::zero(), contentBounds());
783 prepaintRect.intersect(contentRect); 783 prepaintRect.intersect(contentRect);
784 784
785 return prepaintRect; 785 return prepaintRect;
786 } 786 }
787 787
788 } 788 }
OLDNEW
« cc/active_animation.h ('K') | « cc/tiled_layer.h ('k') | cc/tiled_layer_impl.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698