diff options
author | Teng-Hui Zhu <ztenghui@google.com> | 2012-06-26 16:36:47 -0700 |
---|---|---|
committer | Teng-Hui Zhu <ztenghui@google.com> | 2012-06-26 17:04:53 -0700 |
commit | d823574f92be4f91c0127b48386bc4df2baa7984 (patch) | |
tree | da62ebb5e9bb742a38542c6f2b56fccbe9c170f6 /Source/WebCore/platform/graphics/android/rendering/TransferQueue.cpp | |
parent | 53f84f58d9ffe86a4932c979b9863acadb5769ef (diff) | |
download | external_webkit-d823574f92be4f91c0127b48386bc4df2baa7984.zip external_webkit-d823574f92be4f91c0127b48386bc4df2baa7984.tar.gz external_webkit-d823574f92be4f91c0127b48386bc4df2baa7984.tar.bz2 |
Improve the CPU upload path.
Swap the SkBitmap instead of a copy to save the memory bandwidth.
Change-Id: I0998248a9a87ce4058898e66a4739995da9c003c
Diffstat (limited to 'Source/WebCore/platform/graphics/android/rendering/TransferQueue.cpp')
-rw-r--r-- | Source/WebCore/platform/graphics/android/rendering/TransferQueue.cpp | 21 |
1 files changed, 12 insertions, 9 deletions
diff --git a/Source/WebCore/platform/graphics/android/rendering/TransferQueue.cpp b/Source/WebCore/platform/graphics/android/rendering/TransferQueue.cpp index e329191..b15fa6d 100644 --- a/Source/WebCore/platform/graphics/android/rendering/TransferQueue.cpp +++ b/Source/WebCore/platform/graphics/android/rendering/TransferQueue.cpp @@ -390,7 +390,7 @@ void TransferQueue::updateDirtyTiles() } void TransferQueue::updateQueueWithBitmap(const TileRenderInfo* renderInfo, - const SkBitmap& bitmap) + SkBitmap& bitmap) { TRACE_METHOD(); if (!tryUpdateQueueWithBitmap(renderInfo, bitmap)) { @@ -403,7 +403,7 @@ void TransferQueue::updateQueueWithBitmap(const TileRenderInfo* renderInfo, } bool TransferQueue::tryUpdateQueueWithBitmap(const TileRenderInfo* renderInfo, - const SkBitmap& bitmap) + SkBitmap& bitmap) { // This lock need to cover the full update since it is possible that queue // will be cleaned up in the middle of this update without the lock. @@ -429,7 +429,7 @@ bool TransferQueue::tryUpdateQueueWithBitmap(const TileRenderInfo* renderInfo, } // b) After update the Surface Texture, now udpate the transfer queue info. - addItemInTransferQueue(renderInfo, currentUploadType, &bitmap); + addItemInTransferQueue(renderInfo, currentUploadType, bitmap); ALOGV("Bitmap updated x, y %d %d, baseTile %p", renderInfo->x, renderInfo->y, renderInfo->baseTile); @@ -475,7 +475,7 @@ void TransferQueue::addItemCommon(const TileRenderInfo* renderInfo, // Currently only called by GLUtils::updateSharedSurfaceTextureWithBitmap. void TransferQueue::addItemInTransferQueue(const TileRenderInfo* renderInfo, TextureUploadType type, - const SkBitmap* bitmap) + SkBitmap& bitmap) { m_transferQueueIndex = (m_transferQueueIndex + 1) % m_transferQueueSize; @@ -487,15 +487,18 @@ void TransferQueue::addItemInTransferQueue(const TileRenderInfo* renderInfo, TileTransferData* data = &m_transferQueue[index]; addItemCommon(renderInfo, type, data); - if (type == CpuUpload && bitmap) { + if (type == CpuUpload) { // Lazily create the bitmap if (!m_transferQueue[index].bitmap) { m_transferQueue[index].bitmap = new SkBitmap(); - int w = bitmap->width(); - int h = bitmap->height(); - m_transferQueue[index].bitmap->setConfig(bitmap->config(), w, h); + int w = bitmap.width(); + int h = bitmap.height(); + m_transferQueue[index].bitmap->setConfig(bitmap.config(), w, h); + m_transferQueue[index].bitmap->allocPixels(); } - bitmap->copyTo(m_transferQueue[index].bitmap, bitmap->config()); + SkBitmap temp = (*m_transferQueue[index].bitmap); + (*m_transferQueue[index].bitmap) = bitmap; + bitmap = temp; } m_emptyItemCount--; |