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