BaseTileTexture.cpp revision dab8d6ca15f21acf3089e18d85dc88f98d4417fe
1a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard/* 2a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard * Copyright 2010, The Android Open Source Project 3a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard * 4a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard * Redistribution and use in source and binary forms, with or without 5a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard * modification, are permitted provided that the following conditions 6a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard * are met: 7a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard * * Redistributions of source code must retain the above copyright 8a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard * notice, this list of conditions and the following disclaimer. 9a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard * * Redistributions in binary form must reproduce the above copyright 10a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard * notice, this list of conditions and the following disclaimer in the 11a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard * documentation and/or other materials provided with the distribution. 12a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard * 13a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY 14a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 15a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 16a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR 17a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 18a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 19a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 20a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 21a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 22a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 23a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 24a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard */ 25a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard 26a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard#include "config.h" 27a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard#include "BackedDoubleBufferedTexture.h" 288c3b4386c279f644e5e9d2c5769fe5a43c6cd0caNicolas Roard 29a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard#include "BaseTile.h" 30da44133fe92ec11fa6b904c498e7e5cd23a43cbfNicolas Roard#include "ClassTracker.h" 3156338e6791747d7c23fe7fd4e216d7755a18fa43Derek Sollenberger#include "DeleteTextureOperation.h" 32a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard#include "GLUtils.h" 338c3b4386c279f644e5e9d2c5769fe5a43c6cd0caNicolas Roard#include "TilesManager.h" 34a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard 35a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard#define LOG_NDEBUG 1 36a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard#define LOG_TAG "BackedDoubleBufferedTexture.cpp" 37a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard#include <utils/Log.h> 38a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard 39a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roardnamespace WebCore { 40a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard 41a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas RoardBackedDoubleBufferedTexture::BackedDoubleBufferedTexture(uint32_t w, uint32_t h, 4286e2f0fb10185de5c83fed0cf4aa6818e5451615Nicolas Roard SkBitmap* bitmap, 4386e2f0fb10185de5c83fed0cf4aa6818e5451615Nicolas Roard SkBitmap::Config config) 44dab8d6ca15f21acf3089e18d85dc88f98d4417feTeng-Hui Zhu : DoubleBufferedTexture(eglGetCurrentContext(), SurfaceTextureMode) 45a52793c453c1512d0a18d4ae3108a975f998ae45Derek Sollenberger , m_usedLevel(-1) 46e2919ef039a8489adf64e4a3d410681a691b757aNicolas Roard , m_config(config) 47a52793c453c1512d0a18d4ae3108a975f998ae45Derek Sollenberger , m_owner(0) 4881ec1fafcb2c1bc433ec34b6ae4ea78d1ea7d3a8Nicolas Roard , m_delayedReleaseOwner(0) 4981ec1fafcb2c1bc433ec34b6ae4ea78d1ea7d3a8Nicolas Roard , m_delayedRelease(false) 50a52793c453c1512d0a18d4ae3108a975f998ae45Derek Sollenberger , m_busy(false) 51a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard{ 52ac45fd040af509d8cc3470ad7f8dcdfe459d5c7cNicolas Roard m_size.set(w, h); 5386e2f0fb10185de5c83fed0cf4aa6818e5451615Nicolas Roard if (bitmap) { 5486e2f0fb10185de5c83fed0cf4aa6818e5451615Nicolas Roard m_bitmap = bitmap; 5586e2f0fb10185de5c83fed0cf4aa6818e5451615Nicolas Roard m_sharedBitmap = true; 56e2919ef039a8489adf64e4a3d410681a691b757aNicolas Roard m_canvas = new SkCanvas(*m_bitmap); 5786e2f0fb10185de5c83fed0cf4aa6818e5451615Nicolas Roard } else { 58e2919ef039a8489adf64e4a3d410681a691b757aNicolas Roard m_bitmap = 0; 59e2919ef039a8489adf64e4a3d410681a691b757aNicolas Roard m_sharedBitmap = false; 60e2919ef039a8489adf64e4a3d410681a691b757aNicolas Roard m_canvas = 0; 61e2919ef039a8489adf64e4a3d410681a691b757aNicolas Roard } 62da44133fe92ec11fa6b904c498e7e5cd23a43cbfNicolas Roard 63da44133fe92ec11fa6b904c498e7e5cd23a43cbfNicolas Roard#ifdef DEBUG_COUNT 64da44133fe92ec11fa6b904c498e7e5cd23a43cbfNicolas Roard ClassTracker::instance()->increment("BackedDoubleBufferedTexture"); 65da44133fe92ec11fa6b904c498e7e5cd23a43cbfNicolas Roard#endif 66e2919ef039a8489adf64e4a3d410681a691b757aNicolas Roard} 67e2919ef039a8489adf64e4a3d410681a691b757aNicolas Roard 68e2919ef039a8489adf64e4a3d410681a691b757aNicolas RoardSkCanvas* BackedDoubleBufferedTexture::canvas() 69e2919ef039a8489adf64e4a3d410681a691b757aNicolas Roard{ 70e2919ef039a8489adf64e4a3d410681a691b757aNicolas Roard if (!m_bitmap && !m_sharedBitmap) { 7186e2f0fb10185de5c83fed0cf4aa6818e5451615Nicolas Roard m_bitmap = new SkBitmap(); 72e2919ef039a8489adf64e4a3d410681a691b757aNicolas Roard m_bitmap->setConfig(m_config, m_size.width(), m_size.height()); 7386e2f0fb10185de5c83fed0cf4aa6818e5451615Nicolas Roard m_bitmap->allocPixels(); 7486e2f0fb10185de5c83fed0cf4aa6818e5451615Nicolas Roard m_bitmap->eraseColor(0); 75e2919ef039a8489adf64e4a3d410681a691b757aNicolas Roard m_canvas = new SkCanvas(*m_bitmap); 7686e2f0fb10185de5c83fed0cf4aa6818e5451615Nicolas Roard } 77e2919ef039a8489adf64e4a3d410681a691b757aNicolas Roard return m_canvas; 78a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard} 79a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard 80a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas RoardBackedDoubleBufferedTexture::~BackedDoubleBufferedTexture() 81a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard{ 82e2919ef039a8489adf64e4a3d410681a691b757aNicolas Roard if (!m_sharedBitmap) 8386e2f0fb10185de5c83fed0cf4aa6818e5451615Nicolas Roard delete m_bitmap; 84a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard delete m_canvas; 85dab8d6ca15f21acf3089e18d85dc88f98d4417feTeng-Hui Zhu if (m_sharedTextureMode == EglImageMode) { 86dab8d6ca15f21acf3089e18d85dc88f98d4417feTeng-Hui Zhu SharedTexture* textures[3] = { m_textureA, m_textureB, 0 }; 87dab8d6ca15f21acf3089e18d85dc88f98d4417feTeng-Hui Zhu destroyTextures(textures); 88dab8d6ca15f21acf3089e18d85dc88f98d4417feTeng-Hui Zhu } 89da44133fe92ec11fa6b904c498e7e5cd23a43cbfNicolas Roard#ifdef DEBUG_COUNT 90da44133fe92ec11fa6b904c498e7e5cd23a43cbfNicolas Roard ClassTracker::instance()->decrement("BackedDoubleBufferedTexture"); 91da44133fe92ec11fa6b904c498e7e5cd23a43cbfNicolas Roard#endif 92a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard} 93a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard 94e846e5780f8a50e85389d25846b866ba79e85e14Nicolas Roardvoid BackedDoubleBufferedTexture::destroyTextures(SharedTexture** textures) 9556338e6791747d7c23fe7fd4e216d7755a18fa43Derek Sollenberger{ 9656338e6791747d7c23fe7fd4e216d7755a18fa43Derek Sollenberger int x = 0; 978c3b4386c279f644e5e9d2c5769fe5a43c6cd0caNicolas Roard while (textures[x]) { 9856338e6791747d7c23fe7fd4e216d7755a18fa43Derek Sollenberger // We need to delete the source texture and EGLImage in the texture 9956338e6791747d7c23fe7fd4e216d7755a18fa43Derek Sollenberger // generation thread. In theory we should be able to delete the EGLImage 10056338e6791747d7c23fe7fd4e216d7755a18fa43Derek Sollenberger // from either thread, but it currently throws an error if not deleted 10156338e6791747d7c23fe7fd4e216d7755a18fa43Derek Sollenberger // in the same EGLContext from which it was created. 10256338e6791747d7c23fe7fd4e216d7755a18fa43Derek Sollenberger textures[x]->lock(); 10356338e6791747d7c23fe7fd4e216d7755a18fa43Derek Sollenberger DeleteTextureOperation* operation = new DeleteTextureOperation( 10456338e6791747d7c23fe7fd4e216d7755a18fa43Derek Sollenberger textures[x]->getSourceTextureId(), textures[x]->getEGLImage()); 10556338e6791747d7c23fe7fd4e216d7755a18fa43Derek Sollenberger textures[x]->unlock(); 10656338e6791747d7c23fe7fd4e216d7755a18fa43Derek Sollenberger TilesManager::instance()->scheduleOperation(operation); 10756338e6791747d7c23fe7fd4e216d7755a18fa43Derek Sollenberger x++; 10856338e6791747d7c23fe7fd4e216d7755a18fa43Derek Sollenberger } 10956338e6791747d7c23fe7fd4e216d7755a18fa43Derek Sollenberger} 11056338e6791747d7c23fe7fd4e216d7755a18fa43Derek Sollenberger 111a52793c453c1512d0a18d4ae3108a975f998ae45Derek SollenbergerTextureInfo* BackedDoubleBufferedTexture::producerLock() 112a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard{ 113a1e806ed3b2d9e2727d08cc2a3958fce501f6f33Derek Sollenberger m_busyLock.lock(); 114a52793c453c1512d0a18d4ae3108a975f998ae45Derek Sollenberger m_busy = true; 115a1e806ed3b2d9e2727d08cc2a3958fce501f6f33Derek Sollenberger m_busyLock.unlock(); 116a52793c453c1512d0a18d4ae3108a975f998ae45Derek Sollenberger return DoubleBufferedTexture::producerLock(); 117a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard} 118a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard 119a52793c453c1512d0a18d4ae3108a975f998ae45Derek Sollenbergervoid BackedDoubleBufferedTexture::producerRelease() 120a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard{ 121a52793c453c1512d0a18d4ae3108a975f998ae45Derek Sollenberger DoubleBufferedTexture::producerRelease(); 12281ec1fafcb2c1bc433ec34b6ae4ea78d1ea7d3a8Nicolas Roard setNotBusy(); 123a52793c453c1512d0a18d4ae3108a975f998ae45Derek Sollenberger} 124a52793c453c1512d0a18d4ae3108a975f998ae45Derek Sollenberger 125a52793c453c1512d0a18d4ae3108a975f998ae45Derek Sollenbergervoid BackedDoubleBufferedTexture::producerReleaseAndSwap() 126a52793c453c1512d0a18d4ae3108a975f998ae45Derek Sollenberger{ 127a52793c453c1512d0a18d4ae3108a975f998ae45Derek Sollenberger DoubleBufferedTexture::producerReleaseAndSwap(); 12881ec1fafcb2c1bc433ec34b6ae4ea78d1ea7d3a8Nicolas Roard setNotBusy(); 12981ec1fafcb2c1bc433ec34b6ae4ea78d1ea7d3a8Nicolas Roard} 13081ec1fafcb2c1bc433ec34b6ae4ea78d1ea7d3a8Nicolas Roard 13181ec1fafcb2c1bc433ec34b6ae4ea78d1ea7d3a8Nicolas Roardvoid BackedDoubleBufferedTexture::setNotBusy() 13281ec1fafcb2c1bc433ec34b6ae4ea78d1ea7d3a8Nicolas Roard{ 133a1e806ed3b2d9e2727d08cc2a3958fce501f6f33Derek Sollenberger android::Mutex::Autolock lock(m_busyLock); 134a52793c453c1512d0a18d4ae3108a975f998ae45Derek Sollenberger m_busy = false; 13581ec1fafcb2c1bc433ec34b6ae4ea78d1ea7d3a8Nicolas Roard if (m_delayedRelease) { 136ae00657a9ec26c87440d4610c78914ee8bcd3088Ben Murdoch if (m_owner == m_delayedReleaseOwner) 13781ec1fafcb2c1bc433ec34b6ae4ea78d1ea7d3a8Nicolas Roard m_owner = 0; 138ae00657a9ec26c87440d4610c78914ee8bcd3088Ben Murdoch 13981ec1fafcb2c1bc433ec34b6ae4ea78d1ea7d3a8Nicolas Roard m_delayedRelease = false; 14081ec1fafcb2c1bc433ec34b6ae4ea78d1ea7d3a8Nicolas Roard m_delayedReleaseOwner = 0; 14181ec1fafcb2c1bc433ec34b6ae4ea78d1ea7d3a8Nicolas Roard } 1424847d42ed20cf1087003d0628aeb33b0d4720f04Nicolas Roard m_busyCond.signal(); 143a52793c453c1512d0a18d4ae3108a975f998ae45Derek Sollenberger} 144a52793c453c1512d0a18d4ae3108a975f998ae45Derek Sollenberger 1451a8134698fa0b94387482fb4b45341faa8fe6a38Nicolas Roardbool BackedDoubleBufferedTexture::busy() 1461a8134698fa0b94387482fb4b45341faa8fe6a38Nicolas Roard{ 1471a8134698fa0b94387482fb4b45341faa8fe6a38Nicolas Roard android::Mutex::Autolock lock(m_busyLock); 1481a8134698fa0b94387482fb4b45341faa8fe6a38Nicolas Roard return m_busy; 1491a8134698fa0b94387482fb4b45341faa8fe6a38Nicolas Roard} 1501a8134698fa0b94387482fb4b45341faa8fe6a38Nicolas Roard 151a1e806ed3b2d9e2727d08cc2a3958fce501f6f33Derek Sollenbergervoid BackedDoubleBufferedTexture::producerUpdate(TextureInfo* textureInfo) 152a52793c453c1512d0a18d4ae3108a975f998ae45Derek Sollenberger{ 153e2919ef039a8489adf64e4a3d410681a691b757aNicolas Roard if (!m_bitmap) 154e2919ef039a8489adf64e4a3d410681a691b757aNicolas Roard return; 155e2919ef039a8489adf64e4a3d410681a691b757aNicolas Roard 156a52793c453c1512d0a18d4ae3108a975f998ae45Derek Sollenberger // no need to upload a texture since the bitmap is empty 15786e2f0fb10185de5c83fed0cf4aa6818e5451615Nicolas Roard if (!m_bitmap->width() && !m_bitmap->height()) { 158a52793c453c1512d0a18d4ae3108a975f998ae45Derek Sollenberger producerRelease(); 159a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard return; 160a52793c453c1512d0a18d4ae3108a975f998ae45Derek Sollenberger } 161a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard 162dab8d6ca15f21acf3089e18d85dc88f98d4417feTeng-Hui Zhu GLUtils::paintTextureWithBitmap(textureInfo, m_bitmap, 0, 0, this); 163a52793c453c1512d0a18d4ae3108a975f998ae45Derek Sollenberger 164e2919ef039a8489adf64e4a3d410681a691b757aNicolas Roard if (!m_sharedBitmap) { 165e2919ef039a8489adf64e4a3d410681a691b757aNicolas Roard delete m_bitmap; 166e2919ef039a8489adf64e4a3d410681a691b757aNicolas Roard delete m_canvas; 167e2919ef039a8489adf64e4a3d410681a691b757aNicolas Roard m_bitmap = 0; 168e2919ef039a8489adf64e4a3d410681a691b757aNicolas Roard m_canvas = 0; 169e2919ef039a8489adf64e4a3d410681a691b757aNicolas Roard } 170e2919ef039a8489adf64e4a3d410681a691b757aNicolas Roard 171a52793c453c1512d0a18d4ae3108a975f998ae45Derek Sollenberger producerReleaseAndSwap(); 172a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard} 173a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard 1744847d42ed20cf1087003d0628aeb33b0d4720f04Nicolas Roardbool BackedDoubleBufferedTexture::acquire(TextureOwner* owner, bool force) 175a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard{ 17650e0a1d1948f6b53b9b6ea82f865812a7b42221bNicolas Roard if (m_owner == owner) { 17750e0a1d1948f6b53b9b6ea82f865812a7b42221bNicolas Roard if (m_delayedRelease) { 17850e0a1d1948f6b53b9b6ea82f865812a7b42221bNicolas Roard m_delayedRelease = false; 17950e0a1d1948f6b53b9b6ea82f865812a7b42221bNicolas Roard m_delayedReleaseOwner = 0; 18050e0a1d1948f6b53b9b6ea82f865812a7b42221bNicolas Roard } 181a52793c453c1512d0a18d4ae3108a975f998ae45Derek Sollenberger return true; 18250e0a1d1948f6b53b9b6ea82f865812a7b42221bNicolas Roard } 1831eb60a0116bc4fc78af4cb216b9ab2e11c10d4deDerek Sollenberger 1844847d42ed20cf1087003d0628aeb33b0d4720f04Nicolas Roard return setOwner(owner, force); 185211482b53e73a386e2aabb0d3acb92e0e7ea22d4Nicolas Roard} 186211482b53e73a386e2aabb0d3acb92e0e7ea22d4Nicolas Roard 18761d841295b182b0d6c9eab04af1c55b9218eaefbJohn Reckbool BackedDoubleBufferedTexture::tryAcquire(TextureOwner* owner, TiledPage* currentPage, TiledPage* nextPage) 18861d841295b182b0d6c9eab04af1c55b9218eaefbJohn Reck{ 18961d841295b182b0d6c9eab04af1c55b9218eaefbJohn Reck m_busyLock.lock(); 19061d841295b182b0d6c9eab04af1c55b9218eaefbJohn Reck if (!m_busy 19161d841295b182b0d6c9eab04af1c55b9218eaefbJohn Reck && m_owner 19261d841295b182b0d6c9eab04af1c55b9218eaefbJohn Reck && m_owner->page() != currentPage 19361d841295b182b0d6c9eab04af1c55b9218eaefbJohn Reck && m_owner->page() != nextPage) { 19461d841295b182b0d6c9eab04af1c55b9218eaefbJohn Reck m_busyLock.unlock(); 19561d841295b182b0d6c9eab04af1c55b9218eaefbJohn Reck return this->acquire(owner); 19661d841295b182b0d6c9eab04af1c55b9218eaefbJohn Reck } 19761d841295b182b0d6c9eab04af1c55b9218eaefbJohn Reck m_busyLock.unlock(); 19861d841295b182b0d6c9eab04af1c55b9218eaefbJohn Reck return false; 19961d841295b182b0d6c9eab04af1c55b9218eaefbJohn Reck} 20061d841295b182b0d6c9eab04af1c55b9218eaefbJohn Reck 2014847d42ed20cf1087003d0628aeb33b0d4720f04Nicolas Roardbool BackedDoubleBufferedTexture::setOwner(TextureOwner* owner, bool force) 202211482b53e73a386e2aabb0d3acb92e0e7ea22d4Nicolas Roard{ 2031eb60a0116bc4fc78af4cb216b9ab2e11c10d4deDerek Sollenberger // if the writable texture is busy (i.e. currently being written to) then we 2041eb60a0116bc4fc78af4cb216b9ab2e11c10d4deDerek Sollenberger // can't change the owner out from underneath that texture 20581ec1fafcb2c1bc433ec34b6ae4ea78d1ea7d3a8Nicolas Roard m_busyLock.lock(); 2064847d42ed20cf1087003d0628aeb33b0d4720f04Nicolas Roard while (m_busy && force) 2074847d42ed20cf1087003d0628aeb33b0d4720f04Nicolas Roard m_busyCond.wait(m_busyLock); 20881ec1fafcb2c1bc433ec34b6ae4ea78d1ea7d3a8Nicolas Roard bool busy = m_busy; 20981ec1fafcb2c1bc433ec34b6ae4ea78d1ea7d3a8Nicolas Roard m_busyLock.unlock(); 2104847d42ed20cf1087003d0628aeb33b0d4720f04Nicolas Roard 21181ec1fafcb2c1bc433ec34b6ae4ea78d1ea7d3a8Nicolas Roard if (!busy) { 21281ec1fafcb2c1bc433ec34b6ae4ea78d1ea7d3a8Nicolas Roard // if we are not busy we can try to remove the texture from the layer; 21381ec1fafcb2c1bc433ec34b6ae4ea78d1ea7d3a8Nicolas Roard // LayerAndroid::removeTexture() is protected by the same lock as 21481ec1fafcb2c1bc433ec34b6ae4ea78d1ea7d3a8Nicolas Roard // LayerAndroid::paintBitmapGL(), so either we execute removeTexture() 21581ec1fafcb2c1bc433ec34b6ae4ea78d1ea7d3a8Nicolas Roard // first and paintBitmapGL() will bail out, or we execute it after, 21681ec1fafcb2c1bc433ec34b6ae4ea78d1ea7d3a8Nicolas Roard // and paintBitmapGL() will mark the texture as busy before 21781ec1fafcb2c1bc433ec34b6ae4ea78d1ea7d3a8Nicolas Roard // relinquishing the lock. LayerAndroid::removeTexture() will call 21881ec1fafcb2c1bc433ec34b6ae4ea78d1ea7d3a8Nicolas Roard // BackedDoubleBufferedTexture::release(), which will then do nothing 21981ec1fafcb2c1bc433ec34b6ae4ea78d1ea7d3a8Nicolas Roard // if the texture is busy and we then don't return true. 22081ec1fafcb2c1bc433ec34b6ae4ea78d1ea7d3a8Nicolas Roard bool proceed = true; 221245e0cdd9ea80915059080a2bedbb9ebb5cc646cNicolas Roard if (m_owner && m_owner != owner) 22281ec1fafcb2c1bc433ec34b6ae4ea78d1ea7d3a8Nicolas Roard proceed = m_owner->removeTexture(this); 22381ec1fafcb2c1bc433ec34b6ae4ea78d1ea7d3a8Nicolas Roard 22481ec1fafcb2c1bc433ec34b6ae4ea78d1ea7d3a8Nicolas Roard if (proceed) { 22581ec1fafcb2c1bc433ec34b6ae4ea78d1ea7d3a8Nicolas Roard m_owner = owner; 22681ec1fafcb2c1bc433ec34b6ae4ea78d1ea7d3a8Nicolas Roard return true; 22781ec1fafcb2c1bc433ec34b6ae4ea78d1ea7d3a8Nicolas Roard } 2287f124a5e488ed4d4af51f2f535b740c5dac37033Nicolas Roard } 2297f124a5e488ed4d4af51f2f535b740c5dac37033Nicolas Roard return false; 230a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard} 231a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard 23281ec1fafcb2c1bc433ec34b6ae4ea78d1ea7d3a8Nicolas Roardbool BackedDoubleBufferedTexture::release(TextureOwner* owner) 23390455eb70cca2df540942299b35bb3bd8261cb0bDerek Sollenberger{ 23481ec1fafcb2c1bc433ec34b6ae4ea78d1ea7d3a8Nicolas Roard android::Mutex::Autolock lock(m_busyLock); 235439cfed476441572caa4206a622e3ef3c188798bNicolas Roard if (m_owner != owner) 236439cfed476441572caa4206a622e3ef3c188798bNicolas Roard return false; 237439cfed476441572caa4206a622e3ef3c188798bNicolas Roard 238439cfed476441572caa4206a622e3ef3c188798bNicolas Roard if (!m_busy) { 239439cfed476441572caa4206a622e3ef3c188798bNicolas Roard m_owner = 0; 240439cfed476441572caa4206a622e3ef3c188798bNicolas Roard } else { 241439cfed476441572caa4206a622e3ef3c188798bNicolas Roard m_delayedRelease = true; 242439cfed476441572caa4206a622e3ef3c188798bNicolas Roard m_delayedReleaseOwner = owner; 2432879037f2d6c595b8c16e992462ce5ca60d8fdbaBen Murdoch } 244439cfed476441572caa4206a622e3ef3c188798bNicolas Roard return true; 24590455eb70cca2df540942299b35bb3bd8261cb0bDerek Sollenberger} 24690455eb70cca2df540942299b35bb3bd8261cb0bDerek Sollenberger 24767e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roardvoid BackedDoubleBufferedTexture::setTile(TextureInfo* info, int x, int y, 24867e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard float scale, unsigned int pictureCount) 24967e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard{ 25067e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard TextureTileInfo* textureInfo = m_texturesInfo.get(getWriteableTexture()); 25167e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard if (!textureInfo) { 25267e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard textureInfo = new TextureTileInfo(); 25367e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard } 25467e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard textureInfo->m_x = x; 25567e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard textureInfo->m_y = y; 25667e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard textureInfo->m_scale = scale; 25767e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard textureInfo->m_picture = pictureCount; 25867e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard m_texturesInfo.set(getWriteableTexture(), textureInfo); 25967e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard} 26067e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard 26167e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roardbool BackedDoubleBufferedTexture::readyFor(BaseTile* baseTile) 26267e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard{ 26367e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard TextureTileInfo* info = m_texturesInfo.get(getReadableTexture()); 26467e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard if (info && 26567e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard (info->m_x == baseTile->x()) && 26667e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard (info->m_y == baseTile->y()) && 26767e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard (info->m_scale == baseTile->scale()) && 26867e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard (info->m_picture == baseTile->lastPaintedPicture())) { 26967e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard return true; 27067e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard } 27167e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard return false; 27267e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard} 27367e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard 274a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard} // namespace WebCore 275