Tile.cpp revision 8ad3ab0e47f0d5039e89c1873c178f538ec1b0df
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 "BaseTile.h"
28a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard
29a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard#if USE(ACCELERATED_COMPOSITING)
30a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard
31a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard#include "GLUtils.h"
32f85cf343a02e85633e6b68c7f5db3c033b780607Teng-Hui Zhu#include "RasterRenderer.h"
33fca6a67b130c1f97d366460af412ec6e6de14834Derek Sollenberger#include "TextureInfo.h"
34a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard#include "TilesManager.h"
35a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard
363a7a2aa023d51b1806d4063ab0ea5ef7d488556fNicolas Roard#include <cutils/atomic.h>
37a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard
38a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard#ifdef DEBUG
39a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard
40a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard#include <cutils/log.h>
41a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard#include <wtf/CurrentTime.h>
42fca6a67b130c1f97d366460af412ec6e6de14834Derek Sollenberger#include <wtf/text/CString.h>
43a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard
44a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard#undef XLOG
45a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard#define XLOG(...) android_printLog(ANDROID_LOG_DEBUG, "BaseTile", __VA_ARGS__)
46a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard
47a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard#else
48a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard
49a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard#undef XLOG
50a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard#define XLOG(...)
51a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard
52a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard#endif // DEBUG
53a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard
54a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roardnamespace WebCore {
55a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard
563c131605fca8e29a88fdc4923d86bdc3f40adb2bNicolas RoardBaseTile::BaseTile(bool isLayerTile)
5772a76070d36a51926c224d230f1503c46f30da60Chris Craik    : m_glWebViewState(0)
583c131605fca8e29a88fdc4923d86bdc3f40adb2bNicolas Roard    , m_painter(0)
59ffc715a2e6382fe9e331557c35fafc426507b8f5Derek Sollenberger    , m_x(-1)
60ffc715a2e6382fe9e331557c35fafc426507b8f5Derek Sollenberger    , m_y(-1)
613c131605fca8e29a88fdc4923d86bdc3f40adb2bNicolas Roard    , m_page(0)
628ad3ab0e47f0d5039e89c1873c178f538ec1b0dfChris Craik    , m_frontTexture(0)
638ad3ab0e47f0d5039e89c1873c178f538ec1b0dfChris Craik    , m_backTexture(0)
64a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard    , m_scale(1)
65a1e806ed3b2d9e2727d08cc2a3958fce501f6f33Derek Sollenberger    , m_dirty(true)
66417789b7c56928a5fcb610583346d07ffa380900John Reck    , m_repaintPending(false)
67a1e806ed3b2d9e2727d08cc2a3958fce501f6f33Derek Sollenberger    , m_lastDirtyPicture(0)
68fa807bd31774157959640810e564fbe64338e8e3Nicolas Roard    , m_isTexturePainted(false)
693c131605fca8e29a88fdc4923d86bdc3f40adb2bNicolas Roard    , m_isLayerTile(isLayerTile)
708ad3ab0e47f0d5039e89c1873c178f538ec1b0dfChris Craik    , m_isSwapNeeded(false)
718ad3ab0e47f0d5039e89c1873c178f538ec1b0dfChris Craik    , m_drawCount(0)
72a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard{
73a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard#ifdef DEBUG_COUNT
74da44133fe92ec11fa6b904c498e7e5cd23a43cbfNicolas Roard    ClassTracker::instance()->increment("BaseTile");
75a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard#endif
76f85cf343a02e85633e6b68c7f5db3c033b780607Teng-Hui Zhu    m_currentDirtyAreaIndex = 0;
77f85cf343a02e85633e6b68c7f5db3c033b780607Teng-Hui Zhu
78f85cf343a02e85633e6b68c7f5db3c033b780607Teng-Hui Zhu    // For EglImage Mode, the internal buffer should be 2.
7912b77e280bad970089c6ef32e247a39a13e36057Nicolas Roard    // For Surface Texture mode, we only need one.
80f85cf343a02e85633e6b68c7f5db3c033b780607Teng-Hui Zhu    if (TilesManager::instance()->getSharedTextureMode() == EglImageMode)
81f85cf343a02e85633e6b68c7f5db3c033b780607Teng-Hui Zhu        m_maxBufferNumber = 2;
82f85cf343a02e85633e6b68c7f5db3c033b780607Teng-Hui Zhu    else
8312b77e280bad970089c6ef32e247a39a13e36057Nicolas Roard        m_maxBufferNumber = 1;
84f85cf343a02e85633e6b68c7f5db3c033b780607Teng-Hui Zhu
85f85cf343a02e85633e6b68c7f5db3c033b780607Teng-Hui Zhu    m_dirtyArea = new SkRegion[m_maxBufferNumber];
86f85cf343a02e85633e6b68c7f5db3c033b780607Teng-Hui Zhu    m_fullRepaint = new bool[m_maxBufferNumber];
87f85cf343a02e85633e6b68c7f5db3c033b780607Teng-Hui Zhu    for (int i = 0; i < m_maxBufferNumber; i++)
88f85cf343a02e85633e6b68c7f5db3c033b780607Teng-Hui Zhu        m_fullRepaint[i] = true;
89c7e578330aece3c556ef205365c24676687223e2Derek Sollenberger
90c7e578330aece3c556ef205365c24676687223e2Derek Sollenberger    m_renderer = BaseRenderer::createRenderer();
91a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard}
92a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard
93a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas RoardBaseTile::~BaseTile()
94a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard{
958ad3ab0e47f0d5039e89c1873c178f538ec1b0dfChris Craik    if (m_backTexture)
968ad3ab0e47f0d5039e89c1873c178f538ec1b0dfChris Craik        m_backTexture->release(this);
978ad3ab0e47f0d5039e89c1873c178f538ec1b0dfChris Craik    if (m_frontTexture)
988ad3ab0e47f0d5039e89c1873c178f538ec1b0dfChris Craik        m_frontTexture->release(this);
9990455eb70cca2df540942299b35bb3bd8261cb0bDerek Sollenberger
1008dfdf8aa25b250ed3b8c0a443cf1cbaf9bd12c5bDerek Sollenberger    delete m_renderer;
101f85cf343a02e85633e6b68c7f5db3c033b780607Teng-Hui Zhu    delete[] m_dirtyArea;
102f85cf343a02e85633e6b68c7f5db3c033b780607Teng-Hui Zhu    delete[] m_fullRepaint;
1038dfdf8aa25b250ed3b8c0a443cf1cbaf9bd12c5bDerek Sollenberger
104a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard#ifdef DEBUG_COUNT
105da44133fe92ec11fa6b904c498e7e5cd23a43cbfNicolas Roard    ClassTracker::instance()->decrement("BaseTile");
106a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard#endif
107a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard}
108a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard
1093a7a2aa023d51b1806d4063ab0ea5ef7d488556fNicolas Roard// All the following functions must be called from the main GL thread.
1103a7a2aa023d51b1806d4063ab0ea5ef7d488556fNicolas Roard
1113c131605fca8e29a88fdc4923d86bdc3f40adb2bNicolas Roardvoid BaseTile::setContents(TilePainter* painter, int x, int y, float scale)
112ffc715a2e6382fe9e331557c35fafc426507b8f5Derek Sollenberger{
113ffc715a2e6382fe9e331557c35fafc426507b8f5Derek Sollenberger    android::AutoMutex lock(m_atomicSync);
1143c131605fca8e29a88fdc4923d86bdc3f40adb2bNicolas Roard    if ((m_painter != painter)
1153c131605fca8e29a88fdc4923d86bdc3f40adb2bNicolas Roard        || (m_x != x)
1163c131605fca8e29a88fdc4923d86bdc3f40adb2bNicolas Roard        || (m_y != y)
1173c131605fca8e29a88fdc4923d86bdc3f40adb2bNicolas Roard        || (m_scale != scale))
1183c131605fca8e29a88fdc4923d86bdc3f40adb2bNicolas Roard        fullInval();
1193c131605fca8e29a88fdc4923d86bdc3f40adb2bNicolas Roard
1203c131605fca8e29a88fdc4923d86bdc3f40adb2bNicolas Roard    m_painter = painter;
121ffc715a2e6382fe9e331557c35fafc426507b8f5Derek Sollenberger    m_x = x;
122ffc715a2e6382fe9e331557c35fafc426507b8f5Derek Sollenberger    m_y = y;
1233c131605fca8e29a88fdc4923d86bdc3f40adb2bNicolas Roard    m_scale = scale;
1248ad3ab0e47f0d5039e89c1873c178f538ec1b0dfChris Craik    m_drawCount = TilesManager::instance()->getDrawGLCount();
125ffc715a2e6382fe9e331557c35fafc426507b8f5Derek Sollenberger}
126ffc715a2e6382fe9e331557c35fafc426507b8f5Derek Sollenberger
127a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roardvoid BaseTile::reserveTexture()
128a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard{
129ec182c75fb35d955a9115fbaf516f648a48ed0e1Derek Sollenberger    BaseTileTexture* texture = TilesManager::instance()->getAvailableTexture(this);
130a1e806ed3b2d9e2727d08cc2a3958fce501f6f33Derek Sollenberger
131a1e806ed3b2d9e2727d08cc2a3958fce501f6f33Derek Sollenberger    android::AutoMutex lock(m_atomicSync);
1328ad3ab0e47f0d5039e89c1873c178f538ec1b0dfChris Craik    if (texture && m_backTexture != texture) {
1338ad3ab0e47f0d5039e89c1873c178f538ec1b0dfChris Craik        m_isSwapNeeded = false; // no longer ready to swap
1348ad3ab0e47f0d5039e89c1873c178f538ec1b0dfChris Craik        m_backTexture = texture;
1358ad3ab0e47f0d5039e89c1873c178f538ec1b0dfChris Craik
1368ad3ab0e47f0d5039e89c1873c178f538ec1b0dfChris Craik        // this is to catch when the front texture is stolen from beneath us. We
1378ad3ab0e47f0d5039e89c1873c178f538ec1b0dfChris Craik        // should refine the stealing method to be simpler, and not require last
1388ad3ab0e47f0d5039e89c1873c178f538ec1b0dfChris Craik        // moment checks like this
1398ad3ab0e47f0d5039e89c1873c178f538ec1b0dfChris Craik        if (!m_frontTexture)
1408ad3ab0e47f0d5039e89c1873c178f538ec1b0dfChris Craik            m_dirty = true;
141a1e806ed3b2d9e2727d08cc2a3958fce501f6f33Derek Sollenberger    }
142a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard}
143a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard
144ec182c75fb35d955a9115fbaf516f648a48ed0e1Derek Sollenbergerbool BaseTile::removeTexture(BaseTileTexture* texture)
145a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard{
1468ad3ab0e47f0d5039e89c1873c178f538ec1b0dfChris Craik    XLOG("%x removeTexture back %x front %x... page %x",
1478ad3ab0e47f0d5039e89c1873c178f538ec1b0dfChris Craik         this, m_backTexture, m_frontTexture, m_page);
1483a7a2aa023d51b1806d4063ab0ea5ef7d488556fNicolas Roard    // We update atomically, so paintBitmap() can see the correct value
149a1e806ed3b2d9e2727d08cc2a3958fce501f6f33Derek Sollenberger    android::AutoMutex lock(m_atomicSync);
1508ad3ab0e47f0d5039e89c1873c178f538ec1b0dfChris Craik    if (m_frontTexture == texture) {
1518ad3ab0e47f0d5039e89c1873c178f538ec1b0dfChris Craik        m_frontTexture = 0;
1528ad3ab0e47f0d5039e89c1873c178f538ec1b0dfChris Craik        m_dirty = true;
1538ad3ab0e47f0d5039e89c1873c178f538ec1b0dfChris Craik    }
1548ad3ab0e47f0d5039e89c1873c178f538ec1b0dfChris Craik    if (m_backTexture == texture)
1558ad3ab0e47f0d5039e89c1873c178f538ec1b0dfChris Craik        m_backTexture = 0;
15681ec1fafcb2c1bc433ec34b6ae4ea78d1ea7d3a8Nicolas Roard    return true;
1573a7a2aa023d51b1806d4063ab0ea5ef7d488556fNicolas Roard}
1583a7a2aa023d51b1806d4063ab0ea5ef7d488556fNicolas Roard
15967e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roardvoid BaseTile::fullInval()
16067e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard{
161f85cf343a02e85633e6b68c7f5db3c033b780607Teng-Hui Zhu    for (int i = 0; i < m_maxBufferNumber; i++) {
162f85cf343a02e85633e6b68c7f5db3c033b780607Teng-Hui Zhu        m_dirtyArea[i].setEmpty();
163f85cf343a02e85633e6b68c7f5db3c033b780607Teng-Hui Zhu        m_fullRepaint[i] = true;
164f85cf343a02e85633e6b68c7f5db3c033b780607Teng-Hui Zhu    }
16567e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard    m_dirty = true;
16667e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard}
16767e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard
16867e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roardvoid BaseTile::markAsDirty(int unsigned pictureCount,
16967e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard                           const SkRegion& dirtyArea)
170a1e806ed3b2d9e2727d08cc2a3958fce501f6f33Derek Sollenberger{
171fa807bd31774157959640810e564fbe64338e8e3Nicolas Roard    if (dirtyArea.isEmpty())
172fa807bd31774157959640810e564fbe64338e8e3Nicolas Roard        return;
173a1e806ed3b2d9e2727d08cc2a3958fce501f6f33Derek Sollenberger    android::AutoMutex lock(m_atomicSync);
174a1e806ed3b2d9e2727d08cc2a3958fce501f6f33Derek Sollenberger    m_lastDirtyPicture = pictureCount;
175f85cf343a02e85633e6b68c7f5db3c033b780607Teng-Hui Zhu    for (int i = 0; i < m_maxBufferNumber; i++)
176f85cf343a02e85633e6b68c7f5db3c033b780607Teng-Hui Zhu        m_dirtyArea[i].op(dirtyArea, SkRegion::kUnion_Op);
17767e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard    m_dirty = true;
178a1e806ed3b2d9e2727d08cc2a3958fce501f6f33Derek Sollenberger}
179a1e806ed3b2d9e2727d08cc2a3958fce501f6f33Derek Sollenberger
180a1e806ed3b2d9e2727d08cc2a3958fce501f6f33Derek Sollenbergerbool BaseTile::isDirty()
181a1e806ed3b2d9e2727d08cc2a3958fce501f6f33Derek Sollenberger{
182a1e806ed3b2d9e2727d08cc2a3958fce501f6f33Derek Sollenberger    android::AutoMutex lock(m_atomicSync);
183a1e806ed3b2d9e2727d08cc2a3958fce501f6f33Derek Sollenberger    return m_dirty;
184a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard}
185a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard
186417789b7c56928a5fcb610583346d07ffa380900John Reckbool BaseTile::isRepaintPending()
187417789b7c56928a5fcb610583346d07ffa380900John Reck{
188417789b7c56928a5fcb610583346d07ffa380900John Reck    android::AutoMutex lock(m_atomicSync);
189417789b7c56928a5fcb610583346d07ffa380900John Reck    return m_repaintPending;
190417789b7c56928a5fcb610583346d07ffa380900John Reck}
191417789b7c56928a5fcb610583346d07ffa380900John Reck
192417789b7c56928a5fcb610583346d07ffa380900John Reckvoid BaseTile::setRepaintPending(bool pending)
193417789b7c56928a5fcb610583346d07ffa380900John Reck{
194417789b7c56928a5fcb610583346d07ffa380900John Reck    android::AutoMutex lock(m_atomicSync);
195417789b7c56928a5fcb610583346d07ffa380900John Reck    m_repaintPending = pending;
196417789b7c56928a5fcb610583346d07ffa380900John Reck}
197417789b7c56928a5fcb610583346d07ffa380900John Reck
1981deed5ff76dad5d0783c0e07639338f1d6b08a67Nicolas Roardvoid BaseTile::draw(float transparency, SkRect& rect, float scale)
199a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard{
2001deed5ff76dad5d0783c0e07639338f1d6b08a67Nicolas Roard    if (m_x < 0 || m_y < 0 || m_scale != scale)
20167e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard        return;
20267e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard
2038ad3ab0e47f0d5039e89c1873c178f538ec1b0dfChris Craik    // No need to mutex protect reads of m_backTexture as it is only written to by
204a1e806ed3b2d9e2727d08cc2a3958fce501f6f33Derek Sollenberger    // the consumer thread.
2058ad3ab0e47f0d5039e89c1873c178f538ec1b0dfChris Craik    if (!m_frontTexture)
206a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard        return;
207a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard
208c9ab9bf00ba3ce8289f917675f81b40e4438a864Teng-Hui Zhu    // Early return if set to un-usable in purpose!
2090bdd7f2d73cad03535071e5de0ba3d2f5feb1b00Teng-Hui Zhu    m_atomicSync.lock();
210fa807bd31774157959640810e564fbe64338e8e3Nicolas Roard    bool isTexturePainted = m_isTexturePainted;
2110bdd7f2d73cad03535071e5de0ba3d2f5feb1b00Teng-Hui Zhu    m_atomicSync.unlock();
2128ad3ab0e47f0d5039e89c1873c178f538ec1b0dfChris Craik
2138ad3ab0e47f0d5039e89c1873c178f538ec1b0dfChris Craik    if (!isTexturePainted)
214c9ab9bf00ba3ce8289f917675f81b40e4438a864Teng-Hui Zhu        return;
215c9ab9bf00ba3ce8289f917675f81b40e4438a864Teng-Hui Zhu
2168ad3ab0e47f0d5039e89c1873c178f538ec1b0dfChris Craik    TextureInfo* textureInfo = m_frontTexture->consumerLock();
217a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard    if (!textureInfo) {
2188ad3ab0e47f0d5039e89c1873c178f538ec1b0dfChris Craik        m_frontTexture->consumerRelease();
219a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard        return;
220a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard    }
221a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard
2228ad3ab0e47f0d5039e89c1873c178f538ec1b0dfChris Craik    if (m_frontTexture->readyFor(this)) {
2233c131605fca8e29a88fdc4923d86bdc3f40adb2bNicolas Roard        if (isLayerTile())
2243c131605fca8e29a88fdc4923d86bdc3f40adb2bNicolas Roard            TilesManager::instance()->shader()->drawLayerQuad(*m_painter->transform(),
2258ad3ab0e47f0d5039e89c1873c178f538ec1b0dfChris Craik                                                              rect, m_frontTexture->m_ownTextureId,
2267c554a61cb935660cdc86905d040c781b490150fTeng-Hui Zhu                                                              transparency, true);
2273c131605fca8e29a88fdc4923d86bdc3f40adb2bNicolas Roard        else
2288ad3ab0e47f0d5039e89c1873c178f538ec1b0dfChris Craik            TilesManager::instance()->shader()->drawQuad(rect, m_frontTexture->m_ownTextureId,
2297c554a61cb935660cdc86905d040c781b490150fTeng-Hui Zhu                                                         transparency);
2308ad3ab0e47f0d5039e89c1873c178f538ec1b0dfChris Craik    } else
2318ad3ab0e47f0d5039e89c1873c178f538ec1b0dfChris Craik        m_dirty = true;
2328ad3ab0e47f0d5039e89c1873c178f538ec1b0dfChris Craik
2338ad3ab0e47f0d5039e89c1873c178f538ec1b0dfChris Craik    m_frontTexture->consumerRelease();
234a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard}
235a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard
236a1e806ed3b2d9e2727d08cc2a3958fce501f6f33Derek Sollenbergerbool BaseTile::isTileReady()
237a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard{
2388ad3ab0e47f0d5039e89c1873c178f538ec1b0dfChris Craik    // Return true if the tile's most recently drawn texture is up to date
2398ad3ab0e47f0d5039e89c1873c178f538ec1b0dfChris Craik    android::AutoMutex lock(m_atomicSync);
2408ad3ab0e47f0d5039e89c1873c178f538ec1b0dfChris Craik    BaseTileTexture * texture = m_isSwapNeeded ? m_backTexture : m_frontTexture;
2418ad3ab0e47f0d5039e89c1873c178f538ec1b0dfChris Craik
2428ad3ab0e47f0d5039e89c1873c178f538ec1b0dfChris Craik    if (!texture)
243a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard        return false;
2448ad3ab0e47f0d5039e89c1873c178f538ec1b0dfChris Craik
2458ad3ab0e47f0d5039e89c1873c178f538ec1b0dfChris Craik    if (texture->owner() != this)
246a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard        return false;
247a1e806ed3b2d9e2727d08cc2a3958fce501f6f33Derek Sollenberger
24867e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard    if (m_dirty)
24967e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard        return false;
25067e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard
2518ad3ab0e47f0d5039e89c1873c178f538ec1b0dfChris Craik    texture->consumerLock();
2528ad3ab0e47f0d5039e89c1873c178f538ec1b0dfChris Craik    bool ready = texture->readyFor(this);
2538ad3ab0e47f0d5039e89c1873c178f538ec1b0dfChris Craik    texture->consumerRelease();
25467e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard
25567e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard    if (ready)
25667e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard        return true;
25767e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard
25867e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard    m_dirty = true;
25967e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard    return false;
260a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard}
261a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard
262fa807bd31774157959640810e564fbe64338e8e3Nicolas Roardbool BaseTile::intersectWithRect(int x, int y, int tileWidth, int tileHeight,
263fa807bd31774157959640810e564fbe64338e8e3Nicolas Roard                                 float scale, const SkRect& dirtyRect,
264fa807bd31774157959640810e564fbe64338e8e3Nicolas Roard                                 SkRect& realTileRect)
265fa807bd31774157959640810e564fbe64338e8e3Nicolas Roard{
266fa807bd31774157959640810e564fbe64338e8e3Nicolas Roard    // compute the rect to corresponds to pixels
267fa807bd31774157959640810e564fbe64338e8e3Nicolas Roard    realTileRect.fLeft = x * tileWidth;
268fa807bd31774157959640810e564fbe64338e8e3Nicolas Roard    realTileRect.fTop = y * tileHeight;
269fa807bd31774157959640810e564fbe64338e8e3Nicolas Roard    realTileRect.fRight = realTileRect.fLeft + tileWidth;
270fa807bd31774157959640810e564fbe64338e8e3Nicolas Roard    realTileRect.fBottom = realTileRect.fTop + tileHeight;
271fa807bd31774157959640810e564fbe64338e8e3Nicolas Roard
272fa807bd31774157959640810e564fbe64338e8e3Nicolas Roard    // scale the dirtyRect for intersect computation.
273fa807bd31774157959640810e564fbe64338e8e3Nicolas Roard    SkRect realDirtyRect = SkRect::MakeWH(dirtyRect.width() * scale,
274fa807bd31774157959640810e564fbe64338e8e3Nicolas Roard                                          dirtyRect.height() * scale);
275fa807bd31774157959640810e564fbe64338e8e3Nicolas Roard    realDirtyRect.offset(dirtyRect.fLeft * scale, dirtyRect.fTop * scale);
276fa807bd31774157959640810e564fbe64338e8e3Nicolas Roard
277fa807bd31774157959640810e564fbe64338e8e3Nicolas Roard    if (!realTileRect.intersect(realDirtyRect))
278fa807bd31774157959640810e564fbe64338e8e3Nicolas Roard        return false;
279fa807bd31774157959640810e564fbe64338e8e3Nicolas Roard    return true;
280fa807bd31774157959640810e564fbe64338e8e3Nicolas Roard}
281fa807bd31774157959640810e564fbe64338e8e3Nicolas Roard
2823a7a2aa023d51b1806d4063ab0ea5ef7d488556fNicolas Roard// This is called from the texture generation thread
28375394f5ee0aac2337cdff1597b4e686e22c52833Nicolas Roardvoid BaseTile::paintBitmap()
284a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard{
285a1e806ed3b2d9e2727d08cc2a3958fce501f6f33Derek Sollenberger    // We acquire the values below atomically. This ensures that we are reading
286a1e806ed3b2d9e2727d08cc2a3958fce501f6f33Derek Sollenberger    // values correctly across cores. Further, once we have these values they
287a1e806ed3b2d9e2727d08cc2a3958fce501f6f33Derek Sollenberger    // can be updated by other threads without consequence.
288a1e806ed3b2d9e2727d08cc2a3958fce501f6f33Derek Sollenberger    m_atomicSync.lock();
289a1e806ed3b2d9e2727d08cc2a3958fce501f6f33Derek Sollenberger    bool dirty = m_dirty;
2908ad3ab0e47f0d5039e89c1873c178f538ec1b0dfChris Craik    BaseTileTexture* texture = m_backTexture;
291f85cf343a02e85633e6b68c7f5db3c033b780607Teng-Hui Zhu    SkRegion dirtyArea = m_dirtyArea[m_currentDirtyAreaIndex];
2923a7a2aa023d51b1806d4063ab0ea5ef7d488556fNicolas Roard    float scale = m_scale;
293be61abb47b98988ca94bd839a1e17c3267365dc9Nicolas Roard    const int x = m_x;
294be61abb47b98988ca94bd839a1e17c3267365dc9Nicolas Roard    const int y = m_y;
2953c131605fca8e29a88fdc4923d86bdc3f40adb2bNicolas Roard    TilePainter* painter = m_painter;
296cf1ae53e7b2853d1148ecd784379f12dffda9d43Nicolas Roard
2973c131605fca8e29a88fdc4923d86bdc3f40adb2bNicolas Roard    if (!dirty || !texture) {
2983c131605fca8e29a88fdc4923d86bdc3f40adb2bNicolas Roard        m_atomicSync.unlock();
29975394f5ee0aac2337cdff1597b4e686e22c52833Nicolas Roard        return;
3003c131605fca8e29a88fdc4923d86bdc3f40adb2bNicolas Roard    }
301a1e806ed3b2d9e2727d08cc2a3958fce501f6f33Derek Sollenberger
3027e3773d591be20a4ddb1ef7df2709fd7655b7917Nicolas Roard    texture->producerAcquireContext();
303a52793c453c1512d0a18d4ae3108a975f998ae45Derek Sollenberger    TextureInfo* textureInfo = texture->producerLock();
3043c131605fca8e29a88fdc4923d86bdc3f40adb2bNicolas Roard    m_atomicSync.unlock();
305a52793c453c1512d0a18d4ae3108a975f998ae45Derek Sollenberger
306a1e806ed3b2d9e2727d08cc2a3958fce501f6f33Derek Sollenberger    // at this point we can safely check the ownership (if the texture got
307a1e806ed3b2d9e2727d08cc2a3958fce501f6f33Derek Sollenberger    // transferred to another BaseTile under us)
3088ad3ab0e47f0d5039e89c1873c178f538ec1b0dfChris Craik    if (texture->owner() != this) {
309a52793c453c1512d0a18d4ae3108a975f998ae45Derek Sollenberger        texture->producerRelease();
31075394f5ee0aac2337cdff1597b4e686e22c52833Nicolas Roard        return;
311a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard    }
312a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard
31367e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard    unsigned int pictureCount = 0;
31467e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard
315c7e578330aece3c556ef205365c24676687223e2Derek Sollenberger    // swap out the renderer if necessary
316c7e578330aece3c556ef205365c24676687223e2Derek Sollenberger    BaseRenderer::swapRendererIfNeeded(m_renderer);
317c7e578330aece3c556ef205365c24676687223e2Derek Sollenberger
318232d0b3572d13d9b4fb1211d9d56252a1ede3ed6Derek Sollenberger    // setup the common renderInfo fields;
319232d0b3572d13d9b4fb1211d9d56252a1ede3ed6Derek Sollenberger    TileRenderInfo renderInfo;
320232d0b3572d13d9b4fb1211d9d56252a1ede3ed6Derek Sollenberger    renderInfo.x = x;
321232d0b3572d13d9b4fb1211d9d56252a1ede3ed6Derek Sollenberger    renderInfo.y = y;
322232d0b3572d13d9b4fb1211d9d56252a1ede3ed6Derek Sollenberger    renderInfo.scale = scale;
323232d0b3572d13d9b4fb1211d9d56252a1ede3ed6Derek Sollenberger    renderInfo.tileSize = texture->getSize();
3243c131605fca8e29a88fdc4923d86bdc3f40adb2bNicolas Roard    renderInfo.tilePainter = painter;
3253c131605fca8e29a88fdc4923d86bdc3f40adb2bNicolas Roard    renderInfo.baseTile = this;
326232d0b3572d13d9b4fb1211d9d56252a1ede3ed6Derek Sollenberger    renderInfo.textureInfo = textureInfo;
327232d0b3572d13d9b4fb1211d9d56252a1ede3ed6Derek Sollenberger
328232d0b3572d13d9b4fb1211d9d56252a1ede3ed6Derek Sollenberger    const float tileWidth = renderInfo.tileSize.width();
329232d0b3572d13d9b4fb1211d9d56252a1ede3ed6Derek Sollenberger    const float tileHeight = renderInfo.tileSize.height();
330232d0b3572d13d9b4fb1211d9d56252a1ede3ed6Derek Sollenberger
33167e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard    SkRegion::Iterator cliperator(dirtyArea);
33267e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard
33367e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard    bool fullRepaint = false;
334f85cf343a02e85633e6b68c7f5db3c033b780607Teng-Hui Zhu
335f85cf343a02e85633e6b68c7f5db3c033b780607Teng-Hui Zhu    if (m_fullRepaint[m_currentDirtyAreaIndex]
336f85cf343a02e85633e6b68c7f5db3c033b780607Teng-Hui Zhu        || textureInfo->m_width != tileWidth
337fa807bd31774157959640810e564fbe64338e8e3Nicolas Roard        || textureInfo->m_height != tileHeight) {
33867e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard        fullRepaint = true;
339fca6a67b130c1f97d366460af412ec6e6de14834Derek Sollenberger    }
34067e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard
341fa807bd31774157959640810e564fbe64338e8e3Nicolas Roard    bool surfaceTextureMode = textureInfo->getSharedTextureMode() == SurfaceTextureMode;
342fa807bd31774157959640810e564fbe64338e8e3Nicolas Roard
3435d77d7f575389ee1f20a394c635928c2e75667c7Nicolas Roard    if (surfaceTextureMode)
3445d77d7f575389ee1f20a394c635928c2e75667c7Nicolas Roard        fullRepaint = true;
3455d77d7f575389ee1f20a394c635928c2e75667c7Nicolas Roard
346fa807bd31774157959640810e564fbe64338e8e3Nicolas Roard    while (!fullRepaint && !cliperator.done()) {
347fa807bd31774157959640810e564fbe64338e8e3Nicolas Roard        SkRect realTileRect;
348fa807bd31774157959640810e564fbe64338e8e3Nicolas Roard        SkRect dirtyRect;
349fa807bd31774157959640810e564fbe64338e8e3Nicolas Roard        dirtyRect.set(cliperator.rect());
350fa807bd31774157959640810e564fbe64338e8e3Nicolas Roard        bool intersect = intersectWithRect(x, y, tileWidth, tileHeight,
351fa807bd31774157959640810e564fbe64338e8e3Nicolas Roard                                           scale, dirtyRect, realTileRect);
352fa807bd31774157959640810e564fbe64338e8e3Nicolas Roard
353fa807bd31774157959640810e564fbe64338e8e3Nicolas Roard        // With SurfaceTexture, just repaint the entire tile if we intersect
354fa807bd31774157959640810e564fbe64338e8e3Nicolas Roard        // TODO: Implement the partial invalidate in Surface Texture Mode
355fa807bd31774157959640810e564fbe64338e8e3Nicolas Roard        if (intersect && surfaceTextureMode) {
356fa807bd31774157959640810e564fbe64338e8e3Nicolas Roard            fullRepaint = true;
357fa807bd31774157959640810e564fbe64338e8e3Nicolas Roard            break;
358fa807bd31774157959640810e564fbe64338e8e3Nicolas Roard        }
35967e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard
360fa807bd31774157959640810e564fbe64338e8e3Nicolas Roard        if (intersect && !surfaceTextureMode) {
361fca6a67b130c1f97d366460af412ec6e6de14834Derek Sollenberger            // initialize finalRealRect to the rounded values of realTileRect
36267e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard            SkIRect finalRealRect;
363fca6a67b130c1f97d366460af412ec6e6de14834Derek Sollenberger            realTileRect.roundOut(&finalRealRect);
364fca6a67b130c1f97d366460af412ec6e6de14834Derek Sollenberger
365fca6a67b130c1f97d366460af412ec6e6de14834Derek Sollenberger            // stash the int values of the current width and height
366fca6a67b130c1f97d366460af412ec6e6de14834Derek Sollenberger            const int iWidth = finalRealRect.width();
367fca6a67b130c1f97d366460af412ec6e6de14834Derek Sollenberger            const int iHeight = finalRealRect.height();
368fca6a67b130c1f97d366460af412ec6e6de14834Derek Sollenberger
369fca6a67b130c1f97d366460af412ec6e6de14834Derek Sollenberger            if (iWidth == tileWidth || iHeight == tileHeight) {
370fca6a67b130c1f97d366460af412ec6e6de14834Derek Sollenberger                fullRepaint = true;
371fca6a67b130c1f97d366460af412ec6e6de14834Derek Sollenberger                break;
372fca6a67b130c1f97d366460af412ec6e6de14834Derek Sollenberger            }
373fca6a67b130c1f97d366460af412ec6e6de14834Derek Sollenberger
374fca6a67b130c1f97d366460af412ec6e6de14834Derek Sollenberger            // translate the rect into tile space coordinates
375fca6a67b130c1f97d366460af412ec6e6de14834Derek Sollenberger            finalRealRect.fLeft = finalRealRect.fLeft % static_cast<int>(tileWidth);
376fca6a67b130c1f97d366460af412ec6e6de14834Derek Sollenberger            finalRealRect.fTop = finalRealRect.fTop % static_cast<int>(tileHeight);
377fca6a67b130c1f97d366460af412ec6e6de14834Derek Sollenberger            finalRealRect.fRight = finalRealRect.fLeft + iWidth;
378fca6a67b130c1f97d366460af412ec6e6de14834Derek Sollenberger            finalRealRect.fBottom = finalRealRect.fTop + iHeight;
37967e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard
380232d0b3572d13d9b4fb1211d9d56252a1ede3ed6Derek Sollenberger            renderInfo.invalRect = &finalRealRect;
381232d0b3572d13d9b4fb1211d9d56252a1ede3ed6Derek Sollenberger            renderInfo.measurePerf = false;
38267e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard
3838dfdf8aa25b250ed3b8c0a443cf1cbaf9bd12c5bDerek Sollenberger            pictureCount = m_renderer->renderTiledContent(renderInfo);
38467e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard        }
385fa807bd31774157959640810e564fbe64338e8e3Nicolas Roard
386fa807bd31774157959640810e564fbe64338e8e3Nicolas Roard        cliperator.next();
38767e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard    }
388fca6a67b130c1f97d366460af412ec6e6de14834Derek Sollenberger
389fa807bd31774157959640810e564fbe64338e8e3Nicolas Roard    // Do a full repaint if needed
390fca6a67b130c1f97d366460af412ec6e6de14834Derek Sollenberger    if (fullRepaint) {
391fca6a67b130c1f97d366460af412ec6e6de14834Derek Sollenberger        SkIRect rect;
392fca6a67b130c1f97d366460af412ec6e6de14834Derek Sollenberger        rect.set(0, 0, tileWidth, tileHeight);
393fca6a67b130c1f97d366460af412ec6e6de14834Derek Sollenberger
394232d0b3572d13d9b4fb1211d9d56252a1ede3ed6Derek Sollenberger        renderInfo.invalRect = &rect;
395232d0b3572d13d9b4fb1211d9d56252a1ede3ed6Derek Sollenberger        renderInfo.measurePerf = TilesManager::instance()->getShowVisualIndicator();
396232d0b3572d13d9b4fb1211d9d56252a1ede3ed6Derek Sollenberger
3978dfdf8aa25b250ed3b8c0a443cf1cbaf9bd12c5bDerek Sollenberger        pictureCount = m_renderer->renderTiledContent(renderInfo);
398fca6a67b130c1f97d366460af412ec6e6de14834Derek Sollenberger    }
399fca6a67b130c1f97d366460af412ec6e6de14834Derek Sollenberger
40067e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard    m_atomicSync.lock();
4017c554a61cb935660cdc86905d040c781b490150fTeng-Hui Zhu
4027c554a61cb935660cdc86905d040c781b490150fTeng-Hui Zhu#if DEPRECATED_SURFACE_TEXTURE_MODE
4033c131605fca8e29a88fdc4923d86bdc3f40adb2bNicolas Roard    texture->setTile(textureInfo, x, y, scale, painter, pictureCount);
4047c554a61cb935660cdc86905d040c781b490150fTeng-Hui Zhu#endif
40567e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard    texture->producerReleaseAndSwap();
4068ad3ab0e47f0d5039e89c1873c178f538ec1b0dfChris Craik    if (texture == m_backTexture) {
407fa807bd31774157959640810e564fbe64338e8e3Nicolas Roard        m_isTexturePainted = true;
408a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard
4095ba4a087b9212ca9ae083f015637f417199d85ccJohn Reck        // set the fullrepaint flags
410f85cf343a02e85633e6b68c7f5db3c033b780607Teng-Hui Zhu        m_fullRepaint[m_currentDirtyAreaIndex] = false;
41167e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard
4125ba4a087b9212ca9ae083f015637f417199d85ccJohn Reck        // The various checks to see if we are still dirty...
41367e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard
4145ba4a087b9212ca9ae083f015637f417199d85ccJohn Reck        m_dirty = false;
41567e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard
4165ba4a087b9212ca9ae083f015637f417199d85ccJohn Reck        if (m_scale != scale)
4175ba4a087b9212ca9ae083f015637f417199d85ccJohn Reck            m_dirty = true;
41867e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard
419fca6a67b130c1f97d366460af412ec6e6de14834Derek Sollenberger        if (fullRepaint)
420f85cf343a02e85633e6b68c7f5db3c033b780607Teng-Hui Zhu            m_dirtyArea[m_currentDirtyAreaIndex].setEmpty();
421fca6a67b130c1f97d366460af412ec6e6de14834Derek Sollenberger        else
422f85cf343a02e85633e6b68c7f5db3c033b780607Teng-Hui Zhu            m_dirtyArea[m_currentDirtyAreaIndex].op(dirtyArea, SkRegion::kDifference_Op);
42367e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard
424f85cf343a02e85633e6b68c7f5db3c033b780607Teng-Hui Zhu        if (!m_dirtyArea[m_currentDirtyAreaIndex].isEmpty())
4255ba4a087b9212ca9ae083f015637f417199d85ccJohn Reck            m_dirty = true;
42667e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard
4275ba4a087b9212ca9ae083f015637f417199d85ccJohn Reck        // Now we can swap the dirty areas
428f85cf343a02e85633e6b68c7f5db3c033b780607Teng-Hui Zhu        // TODO: For surface texture in Async mode, the index will be updated
429f85cf343a02e85633e6b68c7f5db3c033b780607Teng-Hui Zhu        // according to the current buffer just dequeued.
430f85cf343a02e85633e6b68c7f5db3c033b780607Teng-Hui Zhu        m_currentDirtyAreaIndex = (m_currentDirtyAreaIndex+1) % m_maxBufferNumber;
43167e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard
432f85cf343a02e85633e6b68c7f5db3c033b780607Teng-Hui Zhu        if (!m_dirtyArea[m_currentDirtyAreaIndex].isEmpty())
4335ba4a087b9212ca9ae083f015637f417199d85ccJohn Reck            m_dirty = true;
434c15781f45f0d19a925be7fd73bd10c318562db70Nicolas Roard
4355ba4a087b9212ca9ae083f015637f417199d85ccJohn Reck        if (!m_dirty)
4368ad3ab0e47f0d5039e89c1873c178f538ec1b0dfChris Craik            m_isSwapNeeded = true;
4375ba4a087b9212ca9ae083f015637f417199d85ccJohn Reck    }
43867e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard
43967e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard    m_atomicSync.unlock();
44067e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard}
44167e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard
4428ad3ab0e47f0d5039e89c1873c178f538ec1b0dfChris Craikvoid BaseTile::discardTextures() {
4438ad3ab0e47f0d5039e89c1873c178f538ec1b0dfChris Craik    android::AutoMutex lock(m_atomicSync);
4448ad3ab0e47f0d5039e89c1873c178f538ec1b0dfChris Craik    if (m_frontTexture) {
4458ad3ab0e47f0d5039e89c1873c178f538ec1b0dfChris Craik        m_frontTexture->release(this);
4468ad3ab0e47f0d5039e89c1873c178f538ec1b0dfChris Craik        m_frontTexture = 0;
4478ad3ab0e47f0d5039e89c1873c178f538ec1b0dfChris Craik    }
4488ad3ab0e47f0d5039e89c1873c178f538ec1b0dfChris Craik    if (m_backTexture) {
4498ad3ab0e47f0d5039e89c1873c178f538ec1b0dfChris Craik        m_backTexture->release(this);
4508ad3ab0e47f0d5039e89c1873c178f538ec1b0dfChris Craik        m_backTexture = 0;
4518ad3ab0e47f0d5039e89c1873c178f538ec1b0dfChris Craik    }
4528ad3ab0e47f0d5039e89c1873c178f538ec1b0dfChris Craik    m_dirty = true;
4538ad3ab0e47f0d5039e89c1873c178f538ec1b0dfChris Craik}
4548ad3ab0e47f0d5039e89c1873c178f538ec1b0dfChris Craik
4558ad3ab0e47f0d5039e89c1873c178f538ec1b0dfChris Craikbool BaseTile::swapTexturesIfNeeded() {
4568ad3ab0e47f0d5039e89c1873c178f538ec1b0dfChris Craik    android::AutoMutex lock(m_atomicSync);
4578ad3ab0e47f0d5039e89c1873c178f538ec1b0dfChris Craik    if (m_isSwapNeeded) {
4588ad3ab0e47f0d5039e89c1873c178f538ec1b0dfChris Craik        // discard old texture and swap the new one in its place
4598ad3ab0e47f0d5039e89c1873c178f538ec1b0dfChris Craik        if (m_frontTexture)
4608ad3ab0e47f0d5039e89c1873c178f538ec1b0dfChris Craik            m_frontTexture->release(this);
4618ad3ab0e47f0d5039e89c1873c178f538ec1b0dfChris Craik
4628ad3ab0e47f0d5039e89c1873c178f538ec1b0dfChris Craik        XLOG("%p's frontTexture was %p, now becoming %p", this, m_frontTexture, m_backTexture);
4638ad3ab0e47f0d5039e89c1873c178f538ec1b0dfChris Craik        m_frontTexture = m_backTexture;
4648ad3ab0e47f0d5039e89c1873c178f538ec1b0dfChris Craik        m_backTexture = 0;
4658ad3ab0e47f0d5039e89c1873c178f538ec1b0dfChris Craik        m_isSwapNeeded = false;
4668ad3ab0e47f0d5039e89c1873c178f538ec1b0dfChris Craik        XLOG("display texture for %d, %d front is now %p, texture is %p",
4678ad3ab0e47f0d5039e89c1873c178f538ec1b0dfChris Craik             m_x, m_y, m_frontTexture, m_backTexture);
4688ad3ab0e47f0d5039e89c1873c178f538ec1b0dfChris Craik        return true;
4698ad3ab0e47f0d5039e89c1873c178f538ec1b0dfChris Craik    }
4708ad3ab0e47f0d5039e89c1873c178f538ec1b0dfChris Craik    return false;
4718ad3ab0e47f0d5039e89c1873c178f538ec1b0dfChris Craik}
4728ad3ab0e47f0d5039e89c1873c178f538ec1b0dfChris Craik
473a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard} // namespace WebCore
474a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard
475a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard#endif // USE(ACCELERATED_COMPOSITING)
476