summaryrefslogtreecommitdiffstats
path: root/Source/WebCore/platform/graphics/android/rendering/TransferQueue.cpp
diff options
context:
space:
mode:
authorTeng-Hui Zhu <ztenghui@google.com>2012-05-15 10:10:50 -0700
committerTeng-Hui Zhu <ztenghui@google.com>2012-05-15 11:04:08 -0700
commitbbaf943fc6f340f257b9fce2ec802b1cf2deed36 (patch)
tree97b0766834bc4f2e436f404eabc244df0af64e2c /Source/WebCore/platform/graphics/android/rendering/TransferQueue.cpp
parenteb4dd05cf87c2fcd52fa31fbfe0b110dea7e0cf0 (diff)
downloadexternal_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
Diffstat (limited to 'Source/WebCore/platform/graphics/android/rendering/TransferQueue.cpp')
-rw-r--r--Source/WebCore/platform/graphics/android/rendering/TransferQueue.cpp37
1 files changed, 26 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;
}