BaseTileTexture.cpp revision ec182c75fb35d955a9115fbaf516f648a48ed0e1
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
35a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard#define LOG_NDEBUG 1
36ec182c75fb35d955a9115fbaf516f648a48ed0e1Derek Sollenberger#define LOG_TAG "BaseTileTexture.cpp"
37a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard#include <utils/Log.h>
38a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard
39a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roardnamespace WebCore {
40a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard
41ec182c75fb35d955a9115fbaf516f648a48ed0e1Derek SollenbergerBaseTileTexture::BaseTileTexture(uint32_t w, uint32_t h)
42dab8d6ca15f21acf3089e18d85dc88f98d4417feTeng-Hui Zhu    : DoubleBufferedTexture(eglGetCurrentContext(), SurfaceTextureMode)
43a52793c453c1512d0a18d4ae3108a975f998ae45Derek Sollenberger    , m_usedLevel(-1)
44a52793c453c1512d0a18d4ae3108a975f998ae45Derek Sollenberger    , m_owner(0)
4581ec1fafcb2c1bc433ec34b6ae4ea78d1ea7d3a8Nicolas Roard    , m_delayedReleaseOwner(0)
4681ec1fafcb2c1bc433ec34b6ae4ea78d1ea7d3a8Nicolas Roard    , m_delayedRelease(false)
47a52793c453c1512d0a18d4ae3108a975f998ae45Derek Sollenberger    , m_busy(false)
48a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard{
49ac45fd040af509d8cc3470ad7f8dcdfe459d5c7cNicolas Roard    m_size.set(w, h);
50da44133fe92ec11fa6b904c498e7e5cd23a43cbfNicolas Roard
51da44133fe92ec11fa6b904c498e7e5cd23a43cbfNicolas Roard#ifdef DEBUG_COUNT
52ec182c75fb35d955a9115fbaf516f648a48ed0e1Derek Sollenberger    ClassTracker::instance()->increment("BaseTileTexture");
53da44133fe92ec11fa6b904c498e7e5cd23a43cbfNicolas Roard#endif
54e2919ef039a8489adf64e4a3d410681a691b757aNicolas Roard}
55e2919ef039a8489adf64e4a3d410681a691b757aNicolas Roard
56ec182c75fb35d955a9115fbaf516f648a48ed0e1Derek SollenbergerBaseTileTexture::~BaseTileTexture()
57a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard{
58dab8d6ca15f21acf3089e18d85dc88f98d4417feTeng-Hui Zhu    if (m_sharedTextureMode == EglImageMode) {
59dab8d6ca15f21acf3089e18d85dc88f98d4417feTeng-Hui Zhu        SharedTexture* textures[3] = { m_textureA, m_textureB, 0 };
60dab8d6ca15f21acf3089e18d85dc88f98d4417feTeng-Hui Zhu        destroyTextures(textures);
61dab8d6ca15f21acf3089e18d85dc88f98d4417feTeng-Hui Zhu    }
62da44133fe92ec11fa6b904c498e7e5cd23a43cbfNicolas Roard#ifdef DEBUG_COUNT
63ec182c75fb35d955a9115fbaf516f648a48ed0e1Derek Sollenberger    ClassTracker::instance()->decrement("BaseTileTexture");
64da44133fe92ec11fa6b904c498e7e5cd23a43cbfNicolas Roard#endif
65a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard}
66a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard
67ec182c75fb35d955a9115fbaf516f648a48ed0e1Derek Sollenbergervoid BaseTileTexture::destroyTextures(SharedTexture** textures)
6856338e6791747d7c23fe7fd4e216d7755a18fa43Derek Sollenberger{
6956338e6791747d7c23fe7fd4e216d7755a18fa43Derek Sollenberger    int x = 0;
708c3b4386c279f644e5e9d2c5769fe5a43c6cd0caNicolas Roard    while (textures[x]) {
7156338e6791747d7c23fe7fd4e216d7755a18fa43Derek Sollenberger        // We need to delete the source texture and EGLImage in the texture
7256338e6791747d7c23fe7fd4e216d7755a18fa43Derek Sollenberger        // generation thread. In theory we should be able to delete the EGLImage
7356338e6791747d7c23fe7fd4e216d7755a18fa43Derek Sollenberger        // from either thread, but it currently throws an error if not deleted
7456338e6791747d7c23fe7fd4e216d7755a18fa43Derek Sollenberger        // in the same EGLContext from which it was created.
7556338e6791747d7c23fe7fd4e216d7755a18fa43Derek Sollenberger        textures[x]->lock();
7656338e6791747d7c23fe7fd4e216d7755a18fa43Derek Sollenberger        DeleteTextureOperation* operation = new DeleteTextureOperation(
7756338e6791747d7c23fe7fd4e216d7755a18fa43Derek Sollenberger            textures[x]->getSourceTextureId(), textures[x]->getEGLImage());
7856338e6791747d7c23fe7fd4e216d7755a18fa43Derek Sollenberger        textures[x]->unlock();
7956338e6791747d7c23fe7fd4e216d7755a18fa43Derek Sollenberger        TilesManager::instance()->scheduleOperation(operation);
8056338e6791747d7c23fe7fd4e216d7755a18fa43Derek Sollenberger        x++;
8156338e6791747d7c23fe7fd4e216d7755a18fa43Derek Sollenberger    }
8256338e6791747d7c23fe7fd4e216d7755a18fa43Derek Sollenberger}
8356338e6791747d7c23fe7fd4e216d7755a18fa43Derek Sollenberger
84ec182c75fb35d955a9115fbaf516f648a48ed0e1Derek SollenbergerTextureInfo* BaseTileTexture::producerLock()
85a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard{
86a1e806ed3b2d9e2727d08cc2a3958fce501f6f33Derek Sollenberger    m_busyLock.lock();
87a52793c453c1512d0a18d4ae3108a975f998ae45Derek Sollenberger    m_busy = true;
88a1e806ed3b2d9e2727d08cc2a3958fce501f6f33Derek Sollenberger    m_busyLock.unlock();
89a52793c453c1512d0a18d4ae3108a975f998ae45Derek Sollenberger    return DoubleBufferedTexture::producerLock();
90a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard}
91a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard
92ec182c75fb35d955a9115fbaf516f648a48ed0e1Derek Sollenbergervoid BaseTileTexture::producerRelease()
93a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard{
94a52793c453c1512d0a18d4ae3108a975f998ae45Derek Sollenberger    DoubleBufferedTexture::producerRelease();
9581ec1fafcb2c1bc433ec34b6ae4ea78d1ea7d3a8Nicolas Roard    setNotBusy();
96a52793c453c1512d0a18d4ae3108a975f998ae45Derek Sollenberger}
97a52793c453c1512d0a18d4ae3108a975f998ae45Derek Sollenberger
98ec182c75fb35d955a9115fbaf516f648a48ed0e1Derek Sollenbergervoid BaseTileTexture::producerReleaseAndSwap()
99a52793c453c1512d0a18d4ae3108a975f998ae45Derek Sollenberger{
100a52793c453c1512d0a18d4ae3108a975f998ae45Derek Sollenberger    DoubleBufferedTexture::producerReleaseAndSwap();
10181ec1fafcb2c1bc433ec34b6ae4ea78d1ea7d3a8Nicolas Roard    setNotBusy();
10281ec1fafcb2c1bc433ec34b6ae4ea78d1ea7d3a8Nicolas Roard}
10381ec1fafcb2c1bc433ec34b6ae4ea78d1ea7d3a8Nicolas Roard
104ec182c75fb35d955a9115fbaf516f648a48ed0e1Derek Sollenbergervoid BaseTileTexture::setNotBusy()
10581ec1fafcb2c1bc433ec34b6ae4ea78d1ea7d3a8Nicolas Roard{
106a1e806ed3b2d9e2727d08cc2a3958fce501f6f33Derek Sollenberger    android::Mutex::Autolock lock(m_busyLock);
107a52793c453c1512d0a18d4ae3108a975f998ae45Derek Sollenberger    m_busy = false;
10881ec1fafcb2c1bc433ec34b6ae4ea78d1ea7d3a8Nicolas Roard    if (m_delayedRelease) {
109ae00657a9ec26c87440d4610c78914ee8bcd3088Ben Murdoch        if (m_owner == m_delayedReleaseOwner)
11081ec1fafcb2c1bc433ec34b6ae4ea78d1ea7d3a8Nicolas Roard            m_owner = 0;
111ae00657a9ec26c87440d4610c78914ee8bcd3088Ben Murdoch
11281ec1fafcb2c1bc433ec34b6ae4ea78d1ea7d3a8Nicolas Roard        m_delayedRelease = false;
11381ec1fafcb2c1bc433ec34b6ae4ea78d1ea7d3a8Nicolas Roard        m_delayedReleaseOwner = 0;
11481ec1fafcb2c1bc433ec34b6ae4ea78d1ea7d3a8Nicolas Roard    }
1154847d42ed20cf1087003d0628aeb33b0d4720f04Nicolas Roard    m_busyCond.signal();
116a52793c453c1512d0a18d4ae3108a975f998ae45Derek Sollenberger}
117a52793c453c1512d0a18d4ae3108a975f998ae45Derek Sollenberger
118ec182c75fb35d955a9115fbaf516f648a48ed0e1Derek Sollenbergerbool BaseTileTexture::busy()
1191a8134698fa0b94387482fb4b45341faa8fe6a38Nicolas Roard{
1201a8134698fa0b94387482fb4b45341faa8fe6a38Nicolas Roard    android::Mutex::Autolock lock(m_busyLock);
1211a8134698fa0b94387482fb4b45341faa8fe6a38Nicolas Roard    return m_busy;
1221a8134698fa0b94387482fb4b45341faa8fe6a38Nicolas Roard}
1231a8134698fa0b94387482fb4b45341faa8fe6a38Nicolas Roard
124ec182c75fb35d955a9115fbaf516f648a48ed0e1Derek Sollenbergervoid BaseTileTexture::producerUpdate(TextureInfo* textureInfo, const SkBitmap& bitmap)
125a52793c453c1512d0a18d4ae3108a975f998ae45Derek Sollenberger{
126a52793c453c1512d0a18d4ae3108a975f998ae45Derek Sollenberger    // no need to upload a texture since the bitmap is empty
127ec182c75fb35d955a9115fbaf516f648a48ed0e1Derek Sollenberger    if (!bitmap.width() && !bitmap.height()) {
128a52793c453c1512d0a18d4ae3108a975f998ae45Derek Sollenberger        producerRelease();
129a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard        return;
130a52793c453c1512d0a18d4ae3108a975f998ae45Derek Sollenberger    }
131a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard
132ec182c75fb35d955a9115fbaf516f648a48ed0e1Derek Sollenberger    GLUtils::paintTextureWithBitmap(textureInfo, m_size, bitmap, 0, 0);
133e2919ef039a8489adf64e4a3d410681a691b757aNicolas Roard
134a52793c453c1512d0a18d4ae3108a975f998ae45Derek Sollenberger    producerReleaseAndSwap();
135a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard}
136a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard
137ec182c75fb35d955a9115fbaf516f648a48ed0e1Derek Sollenbergerbool BaseTileTexture::acquire(TextureOwner* owner, bool force)
138a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard{
13950e0a1d1948f6b53b9b6ea82f865812a7b42221bNicolas Roard    if (m_owner == owner) {
14050e0a1d1948f6b53b9b6ea82f865812a7b42221bNicolas Roard        if (m_delayedRelease) {
14150e0a1d1948f6b53b9b6ea82f865812a7b42221bNicolas Roard            m_delayedRelease = false;
14250e0a1d1948f6b53b9b6ea82f865812a7b42221bNicolas Roard            m_delayedReleaseOwner = 0;
14350e0a1d1948f6b53b9b6ea82f865812a7b42221bNicolas Roard        }
144a52793c453c1512d0a18d4ae3108a975f998ae45Derek Sollenberger        return true;
14550e0a1d1948f6b53b9b6ea82f865812a7b42221bNicolas Roard    }
1461eb60a0116bc4fc78af4cb216b9ab2e11c10d4deDerek Sollenberger
1474847d42ed20cf1087003d0628aeb33b0d4720f04Nicolas Roard    return setOwner(owner, force);
148211482b53e73a386e2aabb0d3acb92e0e7ea22d4Nicolas Roard}
149211482b53e73a386e2aabb0d3acb92e0e7ea22d4Nicolas Roard
150ec182c75fb35d955a9115fbaf516f648a48ed0e1Derek Sollenbergerbool BaseTileTexture::tryAcquire(TextureOwner* owner, TiledPage* currentPage, TiledPage* nextPage)
15161d841295b182b0d6c9eab04af1c55b9218eaefbJohn Reck{
15261d841295b182b0d6c9eab04af1c55b9218eaefbJohn Reck    m_busyLock.lock();
15361d841295b182b0d6c9eab04af1c55b9218eaefbJohn Reck    if (!m_busy
15461d841295b182b0d6c9eab04af1c55b9218eaefbJohn Reck        && m_owner
15561d841295b182b0d6c9eab04af1c55b9218eaefbJohn Reck        && m_owner->page() != currentPage
15661d841295b182b0d6c9eab04af1c55b9218eaefbJohn Reck        && m_owner->page() != nextPage) {
15761d841295b182b0d6c9eab04af1c55b9218eaefbJohn Reck        m_busyLock.unlock();
15861d841295b182b0d6c9eab04af1c55b9218eaefbJohn Reck        return this->acquire(owner);
15961d841295b182b0d6c9eab04af1c55b9218eaefbJohn Reck    }
16061d841295b182b0d6c9eab04af1c55b9218eaefbJohn Reck    m_busyLock.unlock();
16161d841295b182b0d6c9eab04af1c55b9218eaefbJohn Reck    return false;
16261d841295b182b0d6c9eab04af1c55b9218eaefbJohn Reck}
16361d841295b182b0d6c9eab04af1c55b9218eaefbJohn Reck
164ec182c75fb35d955a9115fbaf516f648a48ed0e1Derek Sollenbergerbool BaseTileTexture::setOwner(TextureOwner* owner, bool force)
165211482b53e73a386e2aabb0d3acb92e0e7ea22d4Nicolas Roard{
1661eb60a0116bc4fc78af4cb216b9ab2e11c10d4deDerek Sollenberger    // if the writable texture is busy (i.e. currently being written to) then we
1671eb60a0116bc4fc78af4cb216b9ab2e11c10d4deDerek Sollenberger    // can't change the owner out from underneath that texture
16881ec1fafcb2c1bc433ec34b6ae4ea78d1ea7d3a8Nicolas Roard    m_busyLock.lock();
1694847d42ed20cf1087003d0628aeb33b0d4720f04Nicolas Roard    while (m_busy && force)
1704847d42ed20cf1087003d0628aeb33b0d4720f04Nicolas Roard        m_busyCond.wait(m_busyLock);
17181ec1fafcb2c1bc433ec34b6ae4ea78d1ea7d3a8Nicolas Roard    bool busy = m_busy;
17281ec1fafcb2c1bc433ec34b6ae4ea78d1ea7d3a8Nicolas Roard    m_busyLock.unlock();
1734847d42ed20cf1087003d0628aeb33b0d4720f04Nicolas Roard
17481ec1fafcb2c1bc433ec34b6ae4ea78d1ea7d3a8Nicolas Roard    if (!busy) {
17581ec1fafcb2c1bc433ec34b6ae4ea78d1ea7d3a8Nicolas Roard        // if we are not busy we can try to remove the texture from the layer;
17681ec1fafcb2c1bc433ec34b6ae4ea78d1ea7d3a8Nicolas Roard        // LayerAndroid::removeTexture() is protected by the same lock as
17781ec1fafcb2c1bc433ec34b6ae4ea78d1ea7d3a8Nicolas Roard        // LayerAndroid::paintBitmapGL(), so either we execute removeTexture()
17881ec1fafcb2c1bc433ec34b6ae4ea78d1ea7d3a8Nicolas Roard        // first and paintBitmapGL() will bail out, or we execute it after,
17981ec1fafcb2c1bc433ec34b6ae4ea78d1ea7d3a8Nicolas Roard        // and paintBitmapGL() will mark the texture as busy before
18081ec1fafcb2c1bc433ec34b6ae4ea78d1ea7d3a8Nicolas Roard        // relinquishing the lock. LayerAndroid::removeTexture() will call
181ec182c75fb35d955a9115fbaf516f648a48ed0e1Derek Sollenberger        // BaseTileTexture::release(), which will then do nothing
18281ec1fafcb2c1bc433ec34b6ae4ea78d1ea7d3a8Nicolas Roard        // if the texture is busy and we then don't return true.
18381ec1fafcb2c1bc433ec34b6ae4ea78d1ea7d3a8Nicolas Roard        bool proceed = true;
184245e0cdd9ea80915059080a2bedbb9ebb5cc646cNicolas Roard        if (m_owner && m_owner != owner)
18581ec1fafcb2c1bc433ec34b6ae4ea78d1ea7d3a8Nicolas Roard            proceed = m_owner->removeTexture(this);
18681ec1fafcb2c1bc433ec34b6ae4ea78d1ea7d3a8Nicolas Roard
18781ec1fafcb2c1bc433ec34b6ae4ea78d1ea7d3a8Nicolas Roard        if (proceed) {
18881ec1fafcb2c1bc433ec34b6ae4ea78d1ea7d3a8Nicolas Roard            m_owner = owner;
18981ec1fafcb2c1bc433ec34b6ae4ea78d1ea7d3a8Nicolas Roard            return true;
19081ec1fafcb2c1bc433ec34b6ae4ea78d1ea7d3a8Nicolas Roard        }
1917f124a5e488ed4d4af51f2f535b740c5dac37033Nicolas Roard    }
1927f124a5e488ed4d4af51f2f535b740c5dac37033Nicolas Roard    return false;
193a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard}
194a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard
195ec182c75fb35d955a9115fbaf516f648a48ed0e1Derek Sollenbergerbool BaseTileTexture::release(TextureOwner* owner)
19690455eb70cca2df540942299b35bb3bd8261cb0bDerek Sollenberger{
19781ec1fafcb2c1bc433ec34b6ae4ea78d1ea7d3a8Nicolas Roard    android::Mutex::Autolock lock(m_busyLock);
198439cfed476441572caa4206a622e3ef3c188798bNicolas Roard    if (m_owner != owner)
199439cfed476441572caa4206a622e3ef3c188798bNicolas Roard        return false;
200439cfed476441572caa4206a622e3ef3c188798bNicolas Roard
201439cfed476441572caa4206a622e3ef3c188798bNicolas Roard    if (!m_busy) {
202439cfed476441572caa4206a622e3ef3c188798bNicolas Roard        m_owner = 0;
203439cfed476441572caa4206a622e3ef3c188798bNicolas Roard    } else {
204439cfed476441572caa4206a622e3ef3c188798bNicolas Roard        m_delayedRelease = true;
205439cfed476441572caa4206a622e3ef3c188798bNicolas Roard        m_delayedReleaseOwner = owner;
2062879037f2d6c595b8c16e992462ce5ca60d8fdbaBen Murdoch    }
207439cfed476441572caa4206a622e3ef3c188798bNicolas Roard    return true;
20890455eb70cca2df540942299b35bb3bd8261cb0bDerek Sollenberger}
20990455eb70cca2df540942299b35bb3bd8261cb0bDerek Sollenberger
210ec182c75fb35d955a9115fbaf516f648a48ed0e1Derek Sollenbergervoid BaseTileTexture::setTile(TextureInfo* info, int x, int y,
21167e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard                                          float scale, unsigned int pictureCount)
21267e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard{
21367e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard    TextureTileInfo* textureInfo = m_texturesInfo.get(getWriteableTexture());
21467e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard    if (!textureInfo) {
21567e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard        textureInfo = new TextureTileInfo();
21667e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard    }
21767e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard    textureInfo->m_x = x;
21867e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard    textureInfo->m_y = y;
21967e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard    textureInfo->m_scale = scale;
22067e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard    textureInfo->m_picture = pictureCount;
22167e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard    m_texturesInfo.set(getWriteableTexture(), textureInfo);
22267e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard}
22367e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard
224ec182c75fb35d955a9115fbaf516f648a48ed0e1Derek Sollenbergerbool BaseTileTexture::readyFor(BaseTile* baseTile)
22567e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard{
22667e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard    TextureTileInfo* info = m_texturesInfo.get(getReadableTexture());
22767e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard    if (info &&
22867e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard        (info->m_x == baseTile->x()) &&
22967e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard        (info->m_y == baseTile->y()) &&
23067e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard        (info->m_scale == baseTile->scale()) &&
23167e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard        (info->m_picture == baseTile->lastPaintedPicture())) {
23267e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard        return true;
23367e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard    }
23467e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard    return false;
23567e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard}
23667e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard
237a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard} // namespace WebCore
238