| Index: cc/tiled_layer.cc
|
| diff --git a/cc/tiled_layer.cc b/cc/tiled_layer.cc
|
| index 538b30cfd2d9c2042b523b4ac2f26e448c763d00..9b8d2d19e68fe9821ceb9a64183f2766ee4a15c4 100644
|
| --- a/cc/tiled_layer.cc
|
| +++ b/cc/tiled_layer.cc
|
| @@ -68,14 +68,12 @@ public:
|
| bool partialUpdate;
|
| bool validForFrame;
|
| bool occluded;
|
| - bool isInUseOnImpl;
|
|
|
| private:
|
| explicit UpdatableTile(scoped_ptr<LayerUpdater::Resource> updaterResource)
|
| : partialUpdate(false)
|
| , validForFrame(false)
|
| , occluded(false)
|
| - , isInUseOnImpl(false)
|
| , m_updaterResource(updaterResource.Pass())
|
| {
|
| }
|
| @@ -216,8 +214,6 @@ void TiledLayer::pushPropertiesTo(LayerImpl* layer)
|
| if (!tile)
|
| continue;
|
|
|
| - tile->isInUseOnImpl = false;
|
| -
|
| if (!tile->managedTexture()->haveBackingTexture()) {
|
| // Evicted tiles get deleted from both layers
|
| invalidTiles.append(tile);
|
| @@ -231,7 +227,6 @@ void TiledLayer::pushPropertiesTo(LayerImpl* layer)
|
| }
|
|
|
| tiledLayer->pushTileProperties(i, j, tile->managedTexture()->resourceId(), tile->opaqueRect(), tile->managedTexture()->contentsSwizzled());
|
| - tile->isInUseOnImpl = true;
|
| }
|
| for (Vector<UpdatableTile*>::const_iterator iter = invalidTiles.begin(); iter != invalidTiles.end(); ++iter)
|
| m_tiler->takeTile((*iter)->i(), (*iter)->j());
|
| @@ -330,26 +325,9 @@ void TiledLayer::invalidateContentRect(const IntRect& contentRect)
|
| // Returns true if tile is dirty and only part of it needs to be updated.
|
| bool TiledLayer::tileOnlyNeedsPartialUpdate(UpdatableTile* tile)
|
| {
|
| - return !tile->dirtyRect.contains(m_tiler->tileRect(tile));
|
| -}
|
| -
|
| -// Dirty tiles with valid textures needs buffered update to guarantee that
|
| -// we don't modify textures currently used for drawing by the impl thread.
|
| -bool TiledLayer::tileNeedsBufferedUpdate(UpdatableTile* tile)
|
| -{
|
| - if (!tile->managedTexture()->haveBackingTexture())
|
| - return false;
|
| -
|
| - if (!tile->isDirty())
|
| - return false;
|
| -
|
| - if (!tile->isInUseOnImpl)
|
| - return false;
|
| -
|
| - return true;
|
| + return !tile->dirtyRect.contains(m_tiler->tileRect(tile)) && tile->managedTexture()->haveBackingTexture();
|
| }
|
|
|
| -
|
| bool TiledLayer::updateTiles(int left, int top, int right, int bottom, TextureUpdateQueue& queue, const OcclusionTracker* occlusion, RenderingStats& stats, bool& didPaint)
|
| {
|
| didPaint = false;
|
| @@ -404,10 +382,8 @@ void TiledLayer::markOcclusionsAndRequestTextures(int left, int top, int right,
|
|
|
| if (!succeeded)
|
| return;
|
| -
|
| - // FIXME: Remove the loop and just pass the count!
|
| - for (int i = 0; i < occludedTileCount; i++)
|
| - occlusion->overdrawMetrics().didCullTileForUpload();
|
| + if (occlusion)
|
| + occlusion->overdrawMetrics().didCullTilesForUpload(occludedTileCount);
|
| }
|
|
|
| bool TiledLayer::haveTexturesForTiles(int left, int top, int right, int bottom, bool ignoreOcclusions)
|
| @@ -448,6 +424,21 @@ IntRect TiledLayer::markTilesForUpdate(int left, int top, int right, int bottom,
|
| continue;
|
| if (tile->occluded && !ignoreOcclusions)
|
| continue;
|
| + // FIXME: Decide if partial update should be allowed based on cost
|
| + // of update. https://bugs.webkit.org/show_bug.cgi?id=77376
|
| + if (tile->isDirty() && layerTreeHost() && layerTreeHost()->bufferedUpdates()) {
|
| + // If we get a partial update, we use the same texture, otherwise return the
|
| + // current texture backing, so we don't update visible textures non-atomically.
|
| + // If the current backing is in-use, it won't be deleted until after the commit
|
| + // as the texture manager will not allow deletion or recycling of in-use textures.
|
| + if (tileOnlyNeedsPartialUpdate(tile) && layerTreeHost()->requestPartialTextureUpdate())
|
| + tile->partialUpdate = true;
|
| + else {
|
| + tile->dirtyRect = m_tiler->tileRect(tile);
|
| + tile->managedTexture()->returnBackingTexture();
|
| + }
|
| + }
|
| +
|
| paintRect.unite(tile->dirtyRect);
|
| tile->markForUpdate();
|
| }
|
| @@ -586,6 +577,8 @@ void TiledLayer::setTexturePriorities(const PriorityCalculator& priorityCalc)
|
|
|
| // Minimally create the tiles in the desired pre-paint rect.
|
| IntRect createTilesRect = idlePaintRect();
|
| + if (smallAnimatedLayer)
|
| + createTilesRect = IntRect(IntPoint::zero(), contentBounds());
|
| if (!createTilesRect.isEmpty()) {
|
| int left, top, right, bottom;
|
| m_tiler->contentRectToTileIndices(createTilesRect, left, top, right, bottom);
|
| @@ -597,48 +590,6 @@ void TiledLayer::setTexturePriorities(const PriorityCalculator& priorityCalc)
|
| }
|
| }
|
|
|
| - // Also, minimally create all tiles for small animated layers and also
|
| - // double-buffer them since we have limited their size to be reasonable.
|
| - IntRect doubleBufferedRect = visibleContentRect();
|
| - if (smallAnimatedLayer)
|
| - doubleBufferedRect = IntRect(IntPoint::zero(), contentBounds());
|
| -
|
| - // Create additional textures for double-buffered updates when needed.
|
| - // These textures must stay alive while the updated textures are incrementally
|
| - // uploaded, swapped atomically via pushProperties, and finally deleted
|
| - // after the commit is complete, after which they can be recycled.
|
| - if (!doubleBufferedRect.isEmpty()) {
|
| - int left, top, right, bottom;
|
| - m_tiler->contentRectToTileIndices(doubleBufferedRect, left, top, right, bottom);
|
| - for (int j = top; j <= bottom; ++j) {
|
| - for (int i = left; i <= right; ++i) {
|
| - UpdatableTile* tile = tileAt(i, j);
|
| - if (!tile)
|
| - tile = createTile(i, j);
|
| - // We need an additional texture if the tile needs a buffered-update and it's not a partial update.
|
| - // FIXME: Decide if partial update should be allowed based on cost
|
| - // of update. https://bugs.webkit.org/show_bug.cgi?id=77376
|
| - if (!layerTreeHost() || !layerTreeHost()->bufferedUpdates() || !tileNeedsBufferedUpdate(tile))
|
| - continue;
|
| - if (tileOnlyNeedsPartialUpdate(tile) && layerTreeHost()->requestPartialTextureUpdate()) {
|
| - tile->partialUpdate = true;
|
| - continue;
|
| - }
|
| -
|
| - IntRect tileRect = m_tiler->tileRect(tile);
|
| - tile->dirtyRect = tileRect;
|
| - LayerUpdater::Resource* backBuffer = tile->updaterResource();
|
| - setPriorityForTexture(visibleContentRect(), tile->dirtyRect, drawsToRoot, smallAnimatedLayer, backBuffer->texture());
|
| - scoped_ptr<PrioritizedTexture> frontBuffer = PrioritizedTexture::create(backBuffer->texture()->textureManager(),
|
| - backBuffer->texture()->size(),
|
| - backBuffer->texture()->format());
|
| - // Swap backBuffer into frontBuffer and add it to delete after commit queue.
|
| - backBuffer->swapTextureWith(frontBuffer);
|
| - layerTreeHost()->deleteTextureAfterCommit(frontBuffer.Pass());
|
| - }
|
| - }
|
| - }
|
| -
|
| // Now update priorities on all tiles we have in the layer, no matter where they are.
|
| for (LayerTilingData::TileMap::const_iterator iter = m_tiler->tiles().begin(); iter != m_tiler->tiles().end(); ++iter) {
|
| UpdatableTile* tile = static_cast<UpdatableTile*>(iter->second);
|
|
|