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