OLD | NEW |
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 "TiledLayerChromium.h" | 7 #include "TiledLayerChromium.h" |
8 | 8 |
9 #include "base/basictypes.h" | 9 #include "base/basictypes.h" |
10 #include "CCLayerImpl.h" | 10 #include "CCLayerImpl.h" |
11 #include "CCLayerTreeHost.h" | 11 #include "CCLayerTreeHost.h" |
12 #include "CCOverdrawMetrics.h" | 12 #include "CCOverdrawMetrics.h" |
13 #include "CCTextureUpdateQueue.h" | 13 #include "CCTextureUpdateQueue.h" |
14 #include "CCTiledLayerImpl.h" | 14 #include "CCTiledLayerImpl.h" |
15 #include "GraphicsContext3D.h" | |
16 #include "Region.h" | 15 #include "Region.h" |
17 #include <wtf/CurrentTime.h> | |
18 #include <wtf/MathExtras.h> | |
19 | 16 |
20 using namespace std; | 17 using namespace std; |
21 using WebKit::WebTransformationMatrix; | 18 using WebKit::WebTransformationMatrix; |
22 | 19 |
23 namespace cc { | 20 namespace cc { |
24 | 21 |
25 class UpdatableTile : public CCLayerTilingData::Tile { | 22 class UpdatableTile : public CCLayerTilingData::Tile { |
26 public: | 23 public: |
27 static PassOwnPtr<UpdatableTile> create(PassOwnPtr<LayerTextureUpdater::Text
ure> texture) | 24 static scoped_ptr<UpdatableTile> create(PassOwnPtr<LayerTextureUpdater::Text
ure> texture) |
28 { | 25 { |
29 return adoptPtr(new UpdatableTile(texture)); | 26 return make_scoped_ptr(new UpdatableTile(texture)); |
30 } | 27 } |
31 | 28 |
32 LayerTextureUpdater::Texture* texture() { return m_texture.get(); } | 29 LayerTextureUpdater::Texture* texture() { return m_texture.get(); } |
33 CCPrioritizedTexture* managedTexture() { return m_texture->texture(); } | 30 CCPrioritizedTexture* managedTexture() { return m_texture->texture(); } |
34 | 31 |
35 bool isDirty() const { return !dirtyRect.isEmpty(); } | 32 bool isDirty() const { return !dirtyRect.isEmpty(); } |
36 | 33 |
37 // 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 |
38 // for all layers. Since painting one layer can invalidate another layer | 35 // for all layers. Since painting one layer can invalidate another layer |
39 // 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 |
(...skipping 156 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
196 LayerChromium::pushPropertiesTo(layer); | 193 LayerChromium::pushPropertiesTo(layer); |
197 | 194 |
198 CCTiledLayerImpl* tiledLayer = static_cast<CCTiledLayerImpl*>(layer); | 195 CCTiledLayerImpl* tiledLayer = static_cast<CCTiledLayerImpl*>(layer); |
199 | 196 |
200 tiledLayer->setSkipsDraw(m_skipsDraw); | 197 tiledLayer->setSkipsDraw(m_skipsDraw); |
201 tiledLayer->setContentsSwizzled(m_sampledTexelFormat != LayerTextureUpdater:
:SampledTexelFormatRGBA); | 198 tiledLayer->setContentsSwizzled(m_sampledTexelFormat != LayerTextureUpdater:
:SampledTexelFormatRGBA); |
202 tiledLayer->setTilingData(*m_tiler); | 199 tiledLayer->setTilingData(*m_tiler); |
203 Vector<UpdatableTile*> invalidTiles; | 200 Vector<UpdatableTile*> invalidTiles; |
204 | 201 |
205 for (CCLayerTilingData::TileMap::const_iterator iter = m_tiler->tiles().begi
n(); iter != m_tiler->tiles().end(); ++iter) { | 202 for (CCLayerTilingData::TileMap::const_iterator iter = m_tiler->tiles().begi
n(); iter != m_tiler->tiles().end(); ++iter) { |
206 #if WTF_NEW_HASHMAP_ITERATORS_INTERFACE | |
207 int i = iter->key.first; | |
208 int j = iter->key.second; | |
209 UpdatableTile* tile = static_cast<UpdatableTile*>(iter->value.get()); | |
210 #else | |
211 int i = iter->first.first; | 203 int i = iter->first.first; |
212 int j = iter->first.second; | 204 int j = iter->first.second; |
213 UpdatableTile* tile = static_cast<UpdatableTile*>(iter->second.get()); | 205 UpdatableTile* tile = static_cast<UpdatableTile*>(iter->second); |
214 #endif | |
215 // FIXME: This should not ever be null. | 206 // FIXME: This should not ever be null. |
216 if (!tile) | 207 if (!tile) |
217 continue; | 208 continue; |
218 | 209 |
219 tile->isInUseOnImpl = false; | 210 tile->isInUseOnImpl = false; |
220 | 211 |
221 if (!tile->managedTexture()->haveBackingTexture()) { | 212 if (!tile->managedTexture()->haveBackingTexture()) { |
222 // Evicted tiles get deleted from both layers | 213 // Evicted tiles get deleted from both layers |
223 invalidTiles.append(tile); | 214 invalidTiles.append(tile); |
224 continue; | 215 continue; |
(...skipping 16 matching lines...) Expand all Loading... |
241 { | 232 { |
242 if (!layerTreeHost()) | 233 if (!layerTreeHost()) |
243 return 0; | 234 return 0; |
244 return layerTreeHost()->contentsTextureManager(); | 235 return layerTreeHost()->contentsTextureManager(); |
245 } | 236 } |
246 | 237 |
247 void TiledLayerChromium::setLayerTreeHost(CCLayerTreeHost* host) | 238 void TiledLayerChromium::setLayerTreeHost(CCLayerTreeHost* host) |
248 { | 239 { |
249 if (host && host != layerTreeHost()) { | 240 if (host && host != layerTreeHost()) { |
250 for (CCLayerTilingData::TileMap::const_iterator iter = m_tiler->tiles().
begin(); iter != m_tiler->tiles().end(); ++iter) { | 241 for (CCLayerTilingData::TileMap::const_iterator iter = m_tiler->tiles().
begin(); iter != m_tiler->tiles().end(); ++iter) { |
251 #if WTF_NEW_HASHMAP_ITERATORS_INTERFACE | 242 UpdatableTile* tile = static_cast<UpdatableTile*>(iter->second); |
252 UpdatableTile* tile = static_cast<UpdatableTile*>(iter->value.get())
; | |
253 #else | |
254 UpdatableTile* tile = static_cast<UpdatableTile*>(iter->second.get()
); | |
255 #endif | |
256 // FIXME: This should not ever be null. | 243 // FIXME: This should not ever be null. |
257 if (!tile) | 244 if (!tile) |
258 continue; | 245 continue; |
259 tile->managedTexture()->setTextureManager(host->contentsTextureManag
er()); | 246 tile->managedTexture()->setTextureManager(host->contentsTextureManag
er()); |
260 } | 247 } |
261 } | 248 } |
262 LayerChromium::setLayerTreeHost(host); | 249 LayerChromium::setLayerTreeHost(host); |
263 } | 250 } |
264 | 251 |
265 UpdatableTile* TiledLayerChromium::tileAt(int i, int j) const | 252 UpdatableTile* TiledLayerChromium::tileAt(int i, int j) const |
266 { | 253 { |
267 return static_cast<UpdatableTile*>(m_tiler->tileAt(i, j)); | 254 return static_cast<UpdatableTile*>(m_tiler->tileAt(i, j)); |
268 } | 255 } |
269 | 256 |
270 UpdatableTile* TiledLayerChromium::createTile(int i, int j) | 257 UpdatableTile* TiledLayerChromium::createTile(int i, int j) |
271 { | 258 { |
272 createTextureUpdaterIfNeeded(); | 259 createTextureUpdaterIfNeeded(); |
273 | 260 |
274 OwnPtr<UpdatableTile> tile(UpdatableTile::create(textureUpdater()->createTex
ture(textureManager()))); | 261 scoped_ptr<UpdatableTile> tile(UpdatableTile::create(textureUpdater()->creat
eTexture(textureManager()))); |
275 tile->managedTexture()->setDimensions(m_tiler->tileSize(), m_textureFormat); | 262 tile->managedTexture()->setDimensions(m_tiler->tileSize(), m_textureFormat); |
276 | 263 |
277 UpdatableTile* addedTile = tile.get(); | 264 UpdatableTile* addedTile = tile.get(); |
278 m_tiler->addTile(tile.release(), i, j); | 265 m_tiler->addTile(tile.PassAs<CCLayerTilingData::Tile>(), i, j); |
279 | 266 |
280 addedTile->dirtyRect = m_tiler->tileRect(addedTile); | 267 addedTile->dirtyRect = m_tiler->tileRect(addedTile); |
281 | 268 |
282 // Temporary diagnostic crash. | 269 // Temporary diagnostic crash. |
283 if (!addedTile) | 270 if (!addedTile) |
284 CRASH(); | 271 CRASH(); |
285 if (!tileAt(i, j)) | 272 if (!tileAt(i, j)) |
286 CRASH(); | 273 CRASH(); |
287 | 274 |
288 return addedTile; | 275 return addedTile; |
(...skipping 24 matching lines...) Expand all Loading... |
313 setBorderTexelOption(borderTexelOption); | 300 setBorderTexelOption(borderTexelOption); |
314 } | 301 } |
315 | 302 |
316 void TiledLayerChromium::invalidateContentRect(const IntRect& contentRect) | 303 void TiledLayerChromium::invalidateContentRect(const IntRect& contentRect) |
317 { | 304 { |
318 updateBounds(); | 305 updateBounds(); |
319 if (m_tiler->isEmpty() || contentRect.isEmpty() || m_skipsDraw) | 306 if (m_tiler->isEmpty() || contentRect.isEmpty() || m_skipsDraw) |
320 return; | 307 return; |
321 | 308 |
322 for (CCLayerTilingData::TileMap::const_iterator iter = m_tiler->tiles().begi
n(); iter != m_tiler->tiles().end(); ++iter) { | 309 for (CCLayerTilingData::TileMap::const_iterator iter = m_tiler->tiles().begi
n(); iter != m_tiler->tiles().end(); ++iter) { |
323 #if WTF_NEW_HASHMAP_ITERATORS_INTERFACE | 310 UpdatableTile* tile = static_cast<UpdatableTile*>(iter->second); |
324 UpdatableTile* tile = static_cast<UpdatableTile*>(iter->value.get()); | |
325 #else | |
326 UpdatableTile* tile = static_cast<UpdatableTile*>(iter->second.get()); | |
327 #endif | |
328 ASSERT(tile); | 311 ASSERT(tile); |
329 // FIXME: This should not ever be null. | 312 // FIXME: This should not ever be null. |
330 if (!tile) | 313 if (!tile) |
331 continue; | 314 continue; |
332 IntRect bound = m_tiler->tileRect(tile); | 315 IntRect bound = m_tiler->tileRect(tile); |
333 bound.intersect(contentRect); | 316 bound.intersect(contentRect); |
334 tile->dirtyRect.unite(bound); | 317 tile->dirtyRect.unite(bound); |
335 } | 318 } |
336 } | 319 } |
337 | 320 |
(...skipping 303 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
641
backBuffer->texture()->format()); | 624
backBuffer->texture()->format()); |
642 // Swap backBuffer into frontBuffer and add it to delete after c
ommit queue. | 625 // Swap backBuffer into frontBuffer and add it to delete after c
ommit queue. |
643 backBuffer->swapTextureWith(frontBuffer); | 626 backBuffer->swapTextureWith(frontBuffer); |
644 layerTreeHost()->deleteTextureAfterCommit(frontBuffer.Pass()); | 627 layerTreeHost()->deleteTextureAfterCommit(frontBuffer.Pass()); |
645 } | 628 } |
646 } | 629 } |
647 } | 630 } |
648 | 631 |
649 // Now update priorities on all tiles we have in the layer, no matter where
they are. | 632 // Now update priorities on all tiles we have in the layer, no matter where
they are. |
650 for (CCLayerTilingData::TileMap::const_iterator iter = m_tiler->tiles().begi
n(); iter != m_tiler->tiles().end(); ++iter) { | 633 for (CCLayerTilingData::TileMap::const_iterator iter = m_tiler->tiles().begi
n(); iter != m_tiler->tiles().end(); ++iter) { |
651 #if WTF_NEW_HASHMAP_ITERATORS_INTERFACE | 634 UpdatableTile* tile = static_cast<UpdatableTile*>(iter->second); |
652 UpdatableTile* tile = static_cast<UpdatableTile*>(iter->value.get()); | |
653 #else | |
654 UpdatableTile* tile = static_cast<UpdatableTile*>(iter->second.get()); | |
655 #endif | |
656 // FIXME: This should not ever be null. | 635 // FIXME: This should not ever be null. |
657 if (!tile) | 636 if (!tile) |
658 continue; | 637 continue; |
659 IntRect tileRect = m_tiler->tileRect(tile); | 638 IntRect tileRect = m_tiler->tileRect(tile); |
660 setPriorityForTexture(visibleContentRect(), tileRect, drawsToRoot, small
AnimatedLayer, tile->managedTexture()); | 639 setPriorityForTexture(visibleContentRect(), tileRect, drawsToRoot, small
AnimatedLayer, tile->managedTexture()); |
661 } | 640 } |
662 } | 641 } |
663 | 642 |
664 Region TiledLayerChromium::visibleContentOpaqueRegion() const | 643 Region TiledLayerChromium::visibleContentOpaqueRegion() const |
665 { | 644 { |
666 if (m_skipsDraw) | 645 if (m_skipsDraw) |
667 return Region(); | 646 return Region(); |
668 if (contentsOpaque()) | 647 if (contentsOpaque()) |
669 return visibleContentRect(); | 648 return visibleContentRect(); |
670 return m_tiler->opaqueRegionInContentRect(visibleContentRect()); | 649 return m_tiler->opaqueRegionInContentRect(visibleContentRect()); |
671 } | 650 } |
672 | 651 |
673 void TiledLayerChromium::resetUpdateState() | 652 void TiledLayerChromium::resetUpdateState() |
674 { | 653 { |
675 m_skipsDraw = false; | 654 m_skipsDraw = false; |
676 m_failedUpdate = false; | 655 m_failedUpdate = false; |
677 | 656 |
678 CCLayerTilingData::TileMap::const_iterator end = m_tiler->tiles().end(); | 657 CCLayerTilingData::TileMap::const_iterator end = m_tiler->tiles().end(); |
679 for (CCLayerTilingData::TileMap::const_iterator iter = m_tiler->tiles().begi
n(); iter != end; ++iter) { | 658 for (CCLayerTilingData::TileMap::const_iterator iter = m_tiler->tiles().begi
n(); iter != end; ++iter) { |
680 #if WTF_NEW_HASHMAP_ITERATORS_INTERFACE | 659 UpdatableTile* tile = static_cast<UpdatableTile*>(iter->second); |
681 UpdatableTile* tile = static_cast<UpdatableTile*>(iter->value.get()); | |
682 #else | |
683 UpdatableTile* tile = static_cast<UpdatableTile*>(iter->second.get()); | |
684 #endif | |
685 // FIXME: This should not ever be null. | 660 // FIXME: This should not ever be null. |
686 if (!tile) | 661 if (!tile) |
687 continue; | 662 continue; |
688 tile->resetUpdateState(); | 663 tile->resetUpdateState(); |
689 } | 664 } |
690 } | 665 } |
691 | 666 |
692 void TiledLayerChromium::update(CCTextureUpdateQueue& queue, const CCOcclusionTr
acker* occlusion, CCRenderingStats& stats) | 667 void TiledLayerChromium::update(CCTextureUpdateQueue& queue, const CCOcclusionTr
acker* occlusion, CCRenderingStats& stats) |
693 { | 668 { |
694 ASSERT(!m_skipsDraw && !m_failedUpdate); // Did resetUpdateState get skipped
? | 669 ASSERT(!m_skipsDraw && !m_failedUpdate); // Did resetUpdateState get skipped
? |
(...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
803 IntRect prepaintRect = visibleContentRect(); | 778 IntRect prepaintRect = visibleContentRect(); |
804 prepaintRect.inflateX(m_tiler->tileSize().width()); | 779 prepaintRect.inflateX(m_tiler->tileSize().width()); |
805 prepaintRect.inflateY(m_tiler->tileSize().height() * 2); | 780 prepaintRect.inflateY(m_tiler->tileSize().height() * 2); |
806 IntRect contentRect(IntPoint::zero(), contentBounds()); | 781 IntRect contentRect(IntPoint::zero(), contentBounds()); |
807 prepaintRect.intersect(contentRect); | 782 prepaintRect.intersect(contentRect); |
808 | 783 |
809 return prepaintRect; | 784 return prepaintRect; |
810 } | 785 } |
811 | 786 |
812 } | 787 } |
OLD | NEW |