diff options
author | Teng-Hui Zhu <ztenghui@google.com> | 2012-05-15 10:10:50 -0700 |
---|---|---|
committer | Teng-Hui Zhu <ztenghui@google.com> | 2012-05-15 11:04:08 -0700 |
commit | bbaf943fc6f340f257b9fce2ec802b1cf2deed36 (patch) | |
tree | 97b0766834bc4f2e436f404eabc244df0af64e2c | |
parent | eb4dd05cf87c2fcd52fa31fbfe0b110dea7e0cf0 (diff) | |
download | external_webkit-bbaf943fc6f340f257b9fce2ec802b1cf2deed36.zip external_webkit-bbaf943fc6f340f257b9fce2ec802b1cf2deed36.tar.gz external_webkit-bbaf943fc6f340f257b9fce2ec802b1cf2deed36.tar.bz2 |
ref count the surface to keep the tiles alive for transfer queue
bug:6317924
Change-Id: If0a56ee48247d924f5a4cbd2dcac2cbb3faf0adb
-rw-r--r-- | Source/WebCore/platform/graphics/android/rendering/TransferQueue.cpp | 37 | ||||
-rw-r--r-- | Source/WebCore/platform/graphics/android/rendering/TransferQueue.h | 5 |
2 files changed, 31 insertions, 11 deletions
diff --git a/Source/WebCore/platform/graphics/android/rendering/TransferQueue.cpp b/Source/WebCore/platform/graphics/android/rendering/TransferQueue.cpp index 41d6709..f273091 100644 --- a/Source/WebCore/platform/graphics/android/rendering/TransferQueue.cpp +++ b/Source/WebCore/platform/graphics/android/rendering/TransferQueue.cpp @@ -265,9 +265,9 @@ void TransferQueue::setHasGLContext(bool hasContext) void TransferQueue::emptyAndAbandonQueue() { for (int i = 0 ; i < m_transferQueueSize; i++) - m_transferQueue[i].status = emptyItem; + clearItemInTranferQueue(i); m_emptyItemCount = m_transferQueueSize; - m_pureColorTileQueue.clear(); + clearPureColorQueue(); if (m_sharedSurfaceTexture.get()) { m_sharedSurfaceTexture->abandon(); @@ -295,7 +295,7 @@ void TransferQueue::setPendingDiscard() if (m_transferQueue[i].status == pendingBlit) m_transferQueue[i].status = pendingDiscard; - m_pureColorTileQueue.clear(); + clearPureColorQueue(); bool GLContextExisted = getHasGLContext(); // Unblock the Tex Gen thread first before Tile Page deletion. @@ -307,6 +307,15 @@ void TransferQueue::setPendingDiscard() m_transferQueueItemCond.signal(); } +void TransferQueue::clearPureColorQueue() +{ + for (unsigned int i = 0 ; i < m_pureColorTileQueue.size(); i++) { + SkSafeUnref(m_pureColorTileQueue[i].savedTilePainter); + m_pureColorTileQueue[i].savedTilePainter = 0; + } + m_pureColorTileQueue.clear(); +} + void TransferQueue::updatePureColorTiles() { for (unsigned int i = 0 ; i < m_pureColorTileQueue.size(); i++) { @@ -324,7 +333,7 @@ void TransferQueue::updatePureColorTiles() ALOGV("Warning: Don't expect an emptyItem here."); } } - m_pureColorTileQueue.clear(); + clearPureColorQueue(); } // Call on UI thread to copy from the shared Surface Texture to the Tile's texture. @@ -363,8 +372,7 @@ void TransferQueue::updateDirtyTiles() if (result != OK) ALOGE("unexpected error: updateTexImage return %d", result); } - m_transferQueue[index].savedTilePtr = 0; - m_transferQueue[index].status = emptyItem; + if (obsoleteTile) { ALOGV("Warning: the texture is obsolete for this baseTile"); index = (index + 1) % m_transferQueueSize; @@ -391,7 +399,7 @@ void TransferQueue::updateDirtyTiles() destTexture->setPure(false); destTexture->transferComplete(); - + clearItemInTranferQueue(index); ALOGV("Blit tile x, y %d %d with dest texture %p to destTexture->m_ownTextureId %d", m_transferQueue[index].savedTilePtr, destTexture, @@ -469,6 +477,14 @@ void TransferQueue::addItemInPureColorQueue(const TileRenderInfo* renderInfo) m_pureColorTileQueue.append(data); } +void TransferQueue::clearItemInTranferQueue(int index) +{ + m_transferQueue[index].savedTilePtr = 0; + SkSafeUnref(m_transferQueue[index].savedTilePainter); + m_transferQueue[index].savedTilePainter = 0; + m_transferQueue[index].status = emptyItem; +} + // Translates the info from TileRenderInfo and others to TileTransferData. // This is used by pure color tiles and normal tiles. void TransferQueue::addItemCommon(const TileRenderInfo* renderInfo, @@ -476,6 +492,8 @@ void TransferQueue::addItemCommon(const TileRenderInfo* renderInfo, TileTransferData* data) { data->savedTileTexturePtr = renderInfo->baseTile->backTexture(); + data->savedTilePainter = renderInfo->tilePainter; + SkSafeRef(data->savedTilePainter); data->savedTilePtr = renderInfo->baseTile; data->status = pendingBlit; data->uploadType = type; @@ -552,10 +570,7 @@ void TransferQueue::cleanupPendingDiscard() tile->discardBackTexture(); ALOGV("transfer queue discarded tile %p, removed texture", tile); } - - m_transferQueue[index].savedTilePtr = 0; - m_transferQueue[index].savedTileTexturePtr = 0; - m_transferQueue[index].status = emptyItem; + clearItemInTranferQueue(index); } index = (index + 1) % m_transferQueueSize; } diff --git a/Source/WebCore/platform/graphics/android/rendering/TransferQueue.h b/Source/WebCore/platform/graphics/android/rendering/TransferQueue.h index 44d3c37..9d33ff5 100644 --- a/Source/WebCore/platform/graphics/android/rendering/TransferQueue.h +++ b/Source/WebCore/platform/graphics/android/rendering/TransferQueue.h @@ -37,6 +37,7 @@ namespace WebCore { class Tile; +class TilePainter; class TileTexture; struct GLState { @@ -75,6 +76,7 @@ public: TileTransferData() : status(emptyItem) , savedTilePtr(0) + , savedTilePainter(0) , savedTileTexturePtr(0) , uploadType(DEFAULT_UPLOAD_TYPE) , bitmap(0) @@ -90,6 +92,7 @@ public: TransferItemStatus status; Tile* savedTilePtr; + TilePainter* savedTilePainter; // Ref count the tilePainter to keep the tile alive. TileTexture* savedTileTexturePtr; TextureUploadType uploadType; // This is only useful in Cpu upload code path, so it will be dynamically @@ -178,10 +181,12 @@ private: GLuint srcTexId, GLenum srcTexTarget, int index); + void clearItemInTranferQueue(int index); void addItemCommon(const TileRenderInfo* renderInfo, TextureUploadType type, TileTransferData* data); void updatePureColorTiles(); + void clearPureColorQueue(); // Note that the m_transferQueueIndex only changed in the TexGen thread // where we are going to move on to update the next item in the queue. int m_transferQueueIndex; |