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" 27ec182c75fb35d955a9115fbaf516f648a48ed0e1Derek Sollenberger#include "BaseTileTexture.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 357c554a61cb935660cdc86905d040c781b490150fTeng-Hui Zhu#include <cutils/log.h> 367c554a61cb935660cdc86905d040c781b490150fTeng-Hui Zhu#include <wtf/text/CString.h> 377c554a61cb935660cdc86905d040c781b490150fTeng-Hui Zhu 38f6a40880028cf495025747229c627f42e25acc66Chris Craik#undef XLOGC 39f6a40880028cf495025747229c627f42e25acc66Chris Craik#define XLOGC(...) android_printLog(ANDROID_LOG_DEBUG, "BaseTileTexture", __VA_ARGS__) 40f6a40880028cf495025747229c627f42e25acc66Chris Craik 41f6a40880028cf495025747229c627f42e25acc66Chris Craik#ifdef DEBUG 42f6a40880028cf495025747229c627f42e25acc66Chris Craik 437c554a61cb935660cdc86905d040c781b490150fTeng-Hui Zhu#undef XLOG 447c554a61cb935660cdc86905d040c781b490150fTeng-Hui Zhu#define XLOG(...) android_printLog(ANDROID_LOG_DEBUG, "BaseTileTexture", __VA_ARGS__) 457c554a61cb935660cdc86905d040c781b490150fTeng-Hui Zhu 467c554a61cb935660cdc86905d040c781b490150fTeng-Hui Zhu#else 477c554a61cb935660cdc86905d040c781b490150fTeng-Hui Zhu 487c554a61cb935660cdc86905d040c781b490150fTeng-Hui Zhu#undef XLOG 497c554a61cb935660cdc86905d040c781b490150fTeng-Hui Zhu#define XLOG(...) 507c554a61cb935660cdc86905d040c781b490150fTeng-Hui Zhu 517c554a61cb935660cdc86905d040c781b490150fTeng-Hui Zhu#endif // DEBUG 52a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard 53a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roardnamespace WebCore { 54a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard 55ec182c75fb35d955a9115fbaf516f648a48ed0e1Derek SollenbergerBaseTileTexture::BaseTileTexture(uint32_t w, uint32_t h) 56f85cf343a02e85633e6b68c7f5db3c033b780607Teng-Hui Zhu : DoubleBufferedTexture(eglGetCurrentContext(), 57f85cf343a02e85633e6b68c7f5db3c033b780607Teng-Hui Zhu TilesManager::instance()->getSharedTextureMode()) 58a52793c453c1512d0a18d4ae3108a975f998ae45Derek Sollenberger , m_owner(0) 59a52793c453c1512d0a18d4ae3108a975f998ae45Derek Sollenberger , m_busy(false) 60a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard{ 61ac45fd040af509d8cc3470ad7f8dcdfe459d5c7cNicolas Roard m_size.set(w, h); 622986d27084d881dbe6f9c3ae35430a5978b7e659Chris Craik m_ownTextureId = 0; 637c554a61cb935660cdc86905d040c781b490150fTeng-Hui Zhu 647c554a61cb935660cdc86905d040c781b490150fTeng-Hui Zhu // Make sure they are created on the UI thread. 657c554a61cb935660cdc86905d040c781b490150fTeng-Hui Zhu TilesManager::instance()->transferQueue()->initSharedSurfaceTextures(w, h); 66da44133fe92ec11fa6b904c498e7e5cd23a43cbfNicolas Roard 67da44133fe92ec11fa6b904c498e7e5cd23a43cbfNicolas Roard#ifdef DEBUG_COUNT 68ec182c75fb35d955a9115fbaf516f648a48ed0e1Derek Sollenberger ClassTracker::instance()->increment("BaseTileTexture"); 69da44133fe92ec11fa6b904c498e7e5cd23a43cbfNicolas Roard#endif 70e2919ef039a8489adf64e4a3d410681a691b757aNicolas Roard} 71e2919ef039a8489adf64e4a3d410681a691b757aNicolas Roard 72ec182c75fb35d955a9115fbaf516f648a48ed0e1Derek SollenbergerBaseTileTexture::~BaseTileTexture() 73a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard{ 74dab8d6ca15f21acf3089e18d85dc88f98d4417feTeng-Hui Zhu if (m_sharedTextureMode == EglImageMode) { 75dab8d6ca15f21acf3089e18d85dc88f98d4417feTeng-Hui Zhu SharedTexture* textures[3] = { m_textureA, m_textureB, 0 }; 76dab8d6ca15f21acf3089e18d85dc88f98d4417feTeng-Hui Zhu destroyTextures(textures); 77dab8d6ca15f21acf3089e18d85dc88f98d4417feTeng-Hui Zhu } 78da44133fe92ec11fa6b904c498e7e5cd23a43cbfNicolas Roard#ifdef DEBUG_COUNT 79ec182c75fb35d955a9115fbaf516f648a48ed0e1Derek Sollenberger ClassTracker::instance()->decrement("BaseTileTexture"); 80da44133fe92ec11fa6b904c498e7e5cd23a43cbfNicolas Roard#endif 81a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard} 82a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard 83959c08a729d39539327aeb634dbce69524e7b678Chris Craikvoid BaseTileTexture::requireGLTexture() 842986d27084d881dbe6f9c3ae35430a5978b7e659Chris Craik{ 852986d27084d881dbe6f9c3ae35430a5978b7e659Chris Craik if (!m_ownTextureId) 862986d27084d881dbe6f9c3ae35430a5978b7e659Chris Craik m_ownTextureId = GLUtils::createBaseTileGLTexture(m_size.width(), m_size.height()); 872986d27084d881dbe6f9c3ae35430a5978b7e659Chris Craik} 882986d27084d881dbe6f9c3ae35430a5978b7e659Chris Craik 89959c08a729d39539327aeb634dbce69524e7b678Chris Craikvoid BaseTileTexture::discardGLTexture() 902986d27084d881dbe6f9c3ae35430a5978b7e659Chris Craik{ 912986d27084d881dbe6f9c3ae35430a5978b7e659Chris Craik if (m_ownTextureId) 922986d27084d881dbe6f9c3ae35430a5978b7e659Chris Craik GLUtils::deleteTexture(&m_ownTextureId); 93f6a40880028cf495025747229c627f42e25acc66Chris Craik 943a819aac70dd26f675644f6a35b13be5fb3de2f1Chris Craik if (m_owner) { 953a819aac70dd26f675644f6a35b13be5fb3de2f1Chris Craik // clear both Tile->Texture and Texture->Tile links 963a819aac70dd26f675644f6a35b13be5fb3de2f1Chris Craik m_owner->removeTexture(this); 973a819aac70dd26f675644f6a35b13be5fb3de2f1Chris Craik release(m_owner); 983a819aac70dd26f675644f6a35b13be5fb3de2f1Chris Craik } 992986d27084d881dbe6f9c3ae35430a5978b7e659Chris Craik} 1002986d27084d881dbe6f9c3ae35430a5978b7e659Chris Craik 101ec182c75fb35d955a9115fbaf516f648a48ed0e1Derek Sollenbergervoid BaseTileTexture::destroyTextures(SharedTexture** textures) 10256338e6791747d7c23fe7fd4e216d7755a18fa43Derek Sollenberger{ 10356338e6791747d7c23fe7fd4e216d7755a18fa43Derek Sollenberger int x = 0; 1048c3b4386c279f644e5e9d2c5769fe5a43c6cd0caNicolas Roard while (textures[x]) { 10556338e6791747d7c23fe7fd4e216d7755a18fa43Derek Sollenberger // We need to delete the source texture and EGLImage in the texture 10656338e6791747d7c23fe7fd4e216d7755a18fa43Derek Sollenberger // generation thread. In theory we should be able to delete the EGLImage 10756338e6791747d7c23fe7fd4e216d7755a18fa43Derek Sollenberger // from either thread, but it currently throws an error if not deleted 10856338e6791747d7c23fe7fd4e216d7755a18fa43Derek Sollenberger // in the same EGLContext from which it was created. 10956338e6791747d7c23fe7fd4e216d7755a18fa43Derek Sollenberger textures[x]->lock(); 11056338e6791747d7c23fe7fd4e216d7755a18fa43Derek Sollenberger DeleteTextureOperation* operation = new DeleteTextureOperation( 11156338e6791747d7c23fe7fd4e216d7755a18fa43Derek Sollenberger textures[x]->getSourceTextureId(), textures[x]->getEGLImage()); 11256338e6791747d7c23fe7fd4e216d7755a18fa43Derek Sollenberger textures[x]->unlock(); 11356338e6791747d7c23fe7fd4e216d7755a18fa43Derek Sollenberger TilesManager::instance()->scheduleOperation(operation); 11456338e6791747d7c23fe7fd4e216d7755a18fa43Derek Sollenberger x++; 11556338e6791747d7c23fe7fd4e216d7755a18fa43Derek Sollenberger } 11656338e6791747d7c23fe7fd4e216d7755a18fa43Derek Sollenberger} 11756338e6791747d7c23fe7fd4e216d7755a18fa43Derek Sollenberger 118ec182c75fb35d955a9115fbaf516f648a48ed0e1Derek SollenbergerTextureInfo* BaseTileTexture::producerLock() 119a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard{ 120a1e806ed3b2d9e2727d08cc2a3958fce501f6f33Derek Sollenberger m_busyLock.lock(); 121a52793c453c1512d0a18d4ae3108a975f998ae45Derek Sollenberger m_busy = true; 122a1e806ed3b2d9e2727d08cc2a3958fce501f6f33Derek Sollenberger m_busyLock.unlock(); 123a52793c453c1512d0a18d4ae3108a975f998ae45Derek Sollenberger return DoubleBufferedTexture::producerLock(); 124a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard} 125a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard 126ec182c75fb35d955a9115fbaf516f648a48ed0e1Derek Sollenbergervoid BaseTileTexture::producerRelease() 127a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard{ 128a52793c453c1512d0a18d4ae3108a975f998ae45Derek Sollenberger DoubleBufferedTexture::producerRelease(); 12981ec1fafcb2c1bc433ec34b6ae4ea78d1ea7d3a8Nicolas Roard setNotBusy(); 130a52793c453c1512d0a18d4ae3108a975f998ae45Derek Sollenberger} 131a52793c453c1512d0a18d4ae3108a975f998ae45Derek Sollenberger 132ec182c75fb35d955a9115fbaf516f648a48ed0e1Derek Sollenbergervoid BaseTileTexture::producerReleaseAndSwap() 133a52793c453c1512d0a18d4ae3108a975f998ae45Derek Sollenberger{ 134a52793c453c1512d0a18d4ae3108a975f998ae45Derek Sollenberger DoubleBufferedTexture::producerReleaseAndSwap(); 13581ec1fafcb2c1bc433ec34b6ae4ea78d1ea7d3a8Nicolas Roard setNotBusy(); 13681ec1fafcb2c1bc433ec34b6ae4ea78d1ea7d3a8Nicolas Roard} 13781ec1fafcb2c1bc433ec34b6ae4ea78d1ea7d3a8Nicolas Roard 138ec182c75fb35d955a9115fbaf516f648a48ed0e1Derek Sollenbergervoid BaseTileTexture::setNotBusy() 13981ec1fafcb2c1bc433ec34b6ae4ea78d1ea7d3a8Nicolas Roard{ 140a1e806ed3b2d9e2727d08cc2a3958fce501f6f33Derek Sollenberger android::Mutex::Autolock lock(m_busyLock); 141a52793c453c1512d0a18d4ae3108a975f998ae45Derek Sollenberger m_busy = false; 1424847d42ed20cf1087003d0628aeb33b0d4720f04Nicolas Roard m_busyCond.signal(); 143a52793c453c1512d0a18d4ae3108a975f998ae45Derek Sollenberger} 144a52793c453c1512d0a18d4ae3108a975f998ae45Derek Sollenberger 145ec182c75fb35d955a9115fbaf516f648a48ed0e1Derek Sollenbergerbool BaseTileTexture::busy() 1461a8134698fa0b94387482fb4b45341faa8fe6a38Nicolas Roard{ 1471a8134698fa0b94387482fb4b45341faa8fe6a38Nicolas Roard android::Mutex::Autolock lock(m_busyLock); 1481a8134698fa0b94387482fb4b45341faa8fe6a38Nicolas Roard return m_busy; 1491a8134698fa0b94387482fb4b45341faa8fe6a38Nicolas Roard} 1501a8134698fa0b94387482fb4b45341faa8fe6a38Nicolas Roard 151ec182c75fb35d955a9115fbaf516f648a48ed0e1Derek Sollenbergervoid BaseTileTexture::producerUpdate(TextureInfo* textureInfo, const SkBitmap& bitmap) 152a52793c453c1512d0a18d4ae3108a975f998ae45Derek Sollenberger{ 153a52793c453c1512d0a18d4ae3108a975f998ae45Derek Sollenberger // no need to upload a texture since the bitmap is empty 154ec182c75fb35d955a9115fbaf516f648a48ed0e1Derek Sollenberger if (!bitmap.width() && !bitmap.height()) { 155a52793c453c1512d0a18d4ae3108a975f998ae45Derek Sollenberger producerRelease(); 156a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard return; 157a52793c453c1512d0a18d4ae3108a975f998ae45Derek Sollenberger } 158a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard 1597c554a61cb935660cdc86905d040c781b490150fTeng-Hui Zhu // After the tiled layer checked in, this is not called anyway. 1607c554a61cb935660cdc86905d040c781b490150fTeng-Hui Zhu // TODO: cleanup the old code path for layer painting 1617c554a61cb935660cdc86905d040c781b490150fTeng-Hui Zhu // GLUtils::paintTextureWithBitmap(info, m_size, bitmap, 0, 0); 162e2919ef039a8489adf64e4a3d410681a691b757aNicolas Roard 163a52793c453c1512d0a18d4ae3108a975f998ae45Derek Sollenberger producerReleaseAndSwap(); 164a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard} 165a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard 166ec182c75fb35d955a9115fbaf516f648a48ed0e1Derek Sollenbergerbool BaseTileTexture::acquire(TextureOwner* owner, bool force) 167a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard{ 168530c83c6351e05a6939ad0b5bc291da073e77b5bChris Craik if (m_owner == owner) 169a52793c453c1512d0a18d4ae3108a975f998ae45Derek Sollenberger return true; 1701eb60a0116bc4fc78af4cb216b9ab2e11c10d4deDerek Sollenberger 1714847d42ed20cf1087003d0628aeb33b0d4720f04Nicolas Roard return setOwner(owner, force); 172211482b53e73a386e2aabb0d3acb92e0e7ea22d4Nicolas Roard} 173211482b53e73a386e2aabb0d3acb92e0e7ea22d4Nicolas Roard 174ec182c75fb35d955a9115fbaf516f648a48ed0e1Derek Sollenbergerbool BaseTileTexture::setOwner(TextureOwner* owner, bool force) 175211482b53e73a386e2aabb0d3acb92e0e7ea22d4Nicolas Roard{ 1761eb60a0116bc4fc78af4cb216b9ab2e11c10d4deDerek Sollenberger // if the writable texture is busy (i.e. currently being written to) then we 1771eb60a0116bc4fc78af4cb216b9ab2e11c10d4deDerek Sollenberger // can't change the owner out from underneath that texture 17881ec1fafcb2c1bc433ec34b6ae4ea78d1ea7d3a8Nicolas Roard m_busyLock.lock(); 1794847d42ed20cf1087003d0628aeb33b0d4720f04Nicolas Roard while (m_busy && force) 1804847d42ed20cf1087003d0628aeb33b0d4720f04Nicolas Roard m_busyCond.wait(m_busyLock); 18181ec1fafcb2c1bc433ec34b6ae4ea78d1ea7d3a8Nicolas Roard bool busy = m_busy; 18281ec1fafcb2c1bc433ec34b6ae4ea78d1ea7d3a8Nicolas Roard m_busyLock.unlock(); 1834847d42ed20cf1087003d0628aeb33b0d4720f04Nicolas Roard 18481ec1fafcb2c1bc433ec34b6ae4ea78d1ea7d3a8Nicolas Roard if (!busy) { 18581ec1fafcb2c1bc433ec34b6ae4ea78d1ea7d3a8Nicolas Roard // if we are not busy we can try to remove the texture from the layer; 18681ec1fafcb2c1bc433ec34b6ae4ea78d1ea7d3a8Nicolas Roard // LayerAndroid::removeTexture() is protected by the same lock as 18781ec1fafcb2c1bc433ec34b6ae4ea78d1ea7d3a8Nicolas Roard // LayerAndroid::paintBitmapGL(), so either we execute removeTexture() 18881ec1fafcb2c1bc433ec34b6ae4ea78d1ea7d3a8Nicolas Roard // first and paintBitmapGL() will bail out, or we execute it after, 18981ec1fafcb2c1bc433ec34b6ae4ea78d1ea7d3a8Nicolas Roard // and paintBitmapGL() will mark the texture as busy before 19081ec1fafcb2c1bc433ec34b6ae4ea78d1ea7d3a8Nicolas Roard // relinquishing the lock. LayerAndroid::removeTexture() will call 191ec182c75fb35d955a9115fbaf516f648a48ed0e1Derek Sollenberger // BaseTileTexture::release(), which will then do nothing 19281ec1fafcb2c1bc433ec34b6ae4ea78d1ea7d3a8Nicolas Roard // if the texture is busy and we then don't return true. 19381ec1fafcb2c1bc433ec34b6ae4ea78d1ea7d3a8Nicolas Roard bool proceed = true; 194245e0cdd9ea80915059080a2bedbb9ebb5cc646cNicolas Roard if (m_owner && m_owner != owner) 19581ec1fafcb2c1bc433ec34b6ae4ea78d1ea7d3a8Nicolas Roard proceed = m_owner->removeTexture(this); 19681ec1fafcb2c1bc433ec34b6ae4ea78d1ea7d3a8Nicolas Roard 19781ec1fafcb2c1bc433ec34b6ae4ea78d1ea7d3a8Nicolas Roard if (proceed) { 19881ec1fafcb2c1bc433ec34b6ae4ea78d1ea7d3a8Nicolas Roard m_owner = owner; 19981ec1fafcb2c1bc433ec34b6ae4ea78d1ea7d3a8Nicolas Roard return true; 20081ec1fafcb2c1bc433ec34b6ae4ea78d1ea7d3a8Nicolas Roard } 2017f124a5e488ed4d4af51f2f535b740c5dac37033Nicolas Roard } 2027f124a5e488ed4d4af51f2f535b740c5dac37033Nicolas Roard return false; 203a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard} 204a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard 205ec182c75fb35d955a9115fbaf516f648a48ed0e1Derek Sollenbergerbool BaseTileTexture::release(TextureOwner* owner) 20690455eb70cca2df540942299b35bb3bd8261cb0bDerek Sollenberger{ 20781ec1fafcb2c1bc433ec34b6ae4ea78d1ea7d3a8Nicolas Roard android::Mutex::Autolock lock(m_busyLock); 208959c08a729d39539327aeb634dbce69524e7b678Chris Craik XLOG("texture %p releasing tile %p, m_owner %p, m_busy %d", this, owner, m_owner, m_busy); 209439cfed476441572caa4206a622e3ef3c188798bNicolas Roard if (m_owner != owner) 210439cfed476441572caa4206a622e3ef3c188798bNicolas Roard return false; 211439cfed476441572caa4206a622e3ef3c188798bNicolas Roard 212530c83c6351e05a6939ad0b5bc291da073e77b5bChris Craik m_owner = 0; 213439cfed476441572caa4206a622e3ef3c188798bNicolas Roard return true; 21490455eb70cca2df540942299b35bb3bd8261cb0bDerek Sollenberger} 21590455eb70cca2df540942299b35bb3bd8261cb0bDerek Sollenberger 216ec182c75fb35d955a9115fbaf516f648a48ed0e1Derek Sollenbergervoid BaseTileTexture::setTile(TextureInfo* info, int x, int y, 2173c131605fca8e29a88fdc4923d86bdc3f40adb2bNicolas Roard float scale, TilePainter* painter, 2183c131605fca8e29a88fdc4923d86bdc3f40adb2bNicolas Roard unsigned int pictureCount) 21967e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard{ 22067e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard TextureTileInfo* textureInfo = m_texturesInfo.get(getWriteableTexture()); 22167e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard if (!textureInfo) { 22267e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard textureInfo = new TextureTileInfo(); 22367e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard } 22467e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard textureInfo->m_x = x; 22567e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard textureInfo->m_y = y; 22667e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard textureInfo->m_scale = scale; 2273c131605fca8e29a88fdc4923d86bdc3f40adb2bNicolas Roard textureInfo->m_painter = painter; 22867e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard textureInfo->m_picture = pictureCount; 22967e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard m_texturesInfo.set(getWriteableTexture(), textureInfo); 23067e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard} 23167e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard 2323c131605fca8e29a88fdc4923d86bdc3f40adb2bNicolas Roardfloat BaseTileTexture::scale() 2333c131605fca8e29a88fdc4923d86bdc3f40adb2bNicolas Roard{ 2347c554a61cb935660cdc86905d040c781b490150fTeng-Hui Zhu TextureTileInfo* textureInfo = &m_ownTextureTileInfo; 2353c131605fca8e29a88fdc4923d86bdc3f40adb2bNicolas Roard return textureInfo->m_scale; 2363c131605fca8e29a88fdc4923d86bdc3f40adb2bNicolas Roard} 2373c131605fca8e29a88fdc4923d86bdc3f40adb2bNicolas Roard 2387c554a61cb935660cdc86905d040c781b490150fTeng-Hui Zhu// This function + TilesManager::addItemInTransferQueue() is replacing the 2397c554a61cb935660cdc86905d040c781b490150fTeng-Hui Zhu// setTile(). 2407c554a61cb935660cdc86905d040c781b490150fTeng-Hui Zhuvoid BaseTileTexture::setOwnTextureTileInfoFromQueue(const TextureTileInfo* info) 2417c554a61cb935660cdc86905d040c781b490150fTeng-Hui Zhu{ 2427c554a61cb935660cdc86905d040c781b490150fTeng-Hui Zhu m_ownTextureTileInfo.m_x = info->m_x; 2437c554a61cb935660cdc86905d040c781b490150fTeng-Hui Zhu m_ownTextureTileInfo.m_y = info->m_y; 2447c554a61cb935660cdc86905d040c781b490150fTeng-Hui Zhu m_ownTextureTileInfo.m_scale = info->m_scale; 2457c554a61cb935660cdc86905d040c781b490150fTeng-Hui Zhu m_ownTextureTileInfo.m_painter = info->m_painter; 2467c554a61cb935660cdc86905d040c781b490150fTeng-Hui Zhu m_ownTextureTileInfo.m_picture = info->m_picture; 247f1ab740d0427ebb5c42b8b72fa3102b037a109f0Nicolas Roard m_ownTextureTileInfo.m_inverted = TilesManager::instance()->invertedScreen(); 248f6a40880028cf495025747229c627f42e25acc66Chris Craik if (m_owner) { 249f6a40880028cf495025747229c627f42e25acc66Chris Craik BaseTile* owner = static_cast<BaseTile*>(m_owner); 250f6a40880028cf495025747229c627f42e25acc66Chris Craik owner->backTextureTransfer(); 251f6a40880028cf495025747229c627f42e25acc66Chris Craik } 252f6a40880028cf495025747229c627f42e25acc66Chris Craik 2537c554a61cb935660cdc86905d040c781b490150fTeng-Hui Zhu} 2547c554a61cb935660cdc86905d040c781b490150fTeng-Hui Zhu 255ec182c75fb35d955a9115fbaf516f648a48ed0e1Derek Sollenbergerbool BaseTileTexture::readyFor(BaseTile* baseTile) 25667e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard{ 2577c554a61cb935660cdc86905d040c781b490150fTeng-Hui Zhu const TextureTileInfo* info = &m_ownTextureTileInfo; 25867e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard if (info && 25967e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard (info->m_x == baseTile->x()) && 26067e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard (info->m_y == baseTile->y()) && 26167e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard (info->m_scale == baseTile->scale()) && 262f1ab740d0427ebb5c42b8b72fa3102b037a109f0Nicolas Roard (info->m_painter == baseTile->painter()) && 263f1ab740d0427ebb5c42b8b72fa3102b037a109f0Nicolas Roard (info->m_inverted == TilesManager::instance()->invertedScreen())) 26467e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard return true; 2657c554a61cb935660cdc86905d040c781b490150fTeng-Hui Zhu 2668ad3ab0e47f0d5039e89c1873c178f538ec1b0dfChris Craik XLOG("texture %p readyFor return false for tile x, y (%d %d) texId %d ," 2678ad3ab0e47f0d5039e89c1873c178f538ec1b0dfChris Craik " BaseTileTexture %p, BaseTile is %p, SCALE %f, painter %p, inv %d", 2688ad3ab0e47f0d5039e89c1873c178f538ec1b0dfChris Craik this, baseTile->x(), baseTile->y(), m_ownTextureId, this, baseTile, 2698ad3ab0e47f0d5039e89c1873c178f538ec1b0dfChris Craik baseTile->scale(), baseTile->painter(), TilesManager::instance()->invertedScreen()); 27067e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard return false; 27167e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard} 27267e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard 273a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard} // namespace WebCore 274