Tile.cpp revision 3c131605fca8e29a88fdc4923d86bdc3f40adb2b
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)
623c131605fca8e29a88fdc4923d86bdc3f40adb2bNicolas Roard    , m_usedLevel(-1)
63a52793c453c1512d0a18d4ae3108a975f998ae45Derek Sollenberger    , m_texture(0)
64a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard    , m_scale(1)
65a1e806ed3b2d9e2727d08cc2a3958fce501f6f33Derek Sollenberger    , m_dirty(true)
66417789b7c56928a5fcb610583346d07ffa380900John Reck    , m_repaintPending(false)
67c9ab9bf00ba3ce8289f917675f81b40e4438a864Teng-Hui Zhu    , m_usable(true)
68a1e806ed3b2d9e2727d08cc2a3958fce501f6f33Derek Sollenberger    , m_lastDirtyPicture(0)
69a1e806ed3b2d9e2727d08cc2a3958fce501f6f33Derek Sollenberger    , m_lastPaintedPicture(0)
703c131605fca8e29a88fdc4923d86bdc3f40adb2bNicolas Roard    , m_isLayerTile(isLayerTile)
71a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard{
72a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard#ifdef DEBUG_COUNT
73da44133fe92ec11fa6b904c498e7e5cd23a43cbfNicolas Roard    ClassTracker::instance()->increment("BaseTile");
74a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard#endif
75f85cf343a02e85633e6b68c7f5db3c033b780607Teng-Hui Zhu    m_currentDirtyAreaIndex = 0;
768dfdf8aa25b250ed3b8c0a443cf1cbaf9bd12c5bDerek Sollenberger    m_renderer = new RasterRenderer();
77f85cf343a02e85633e6b68c7f5db3c033b780607Teng-Hui Zhu
78f85cf343a02e85633e6b68c7f5db3c033b780607Teng-Hui Zhu    // For EglImage Mode, the internal buffer should be 2.
79f85cf343a02e85633e6b68c7f5db3c033b780607Teng-Hui Zhu    // And for Async Surface Texture mode, this is 3.
80f85cf343a02e85633e6b68c7f5db3c033b780607Teng-Hui Zhu    if (TilesManager::instance()->getSharedTextureMode() == EglImageMode)
81f85cf343a02e85633e6b68c7f5db3c033b780607Teng-Hui Zhu        m_maxBufferNumber = 2;
82f85cf343a02e85633e6b68c7f5db3c033b780607Teng-Hui Zhu    else
83f85cf343a02e85633e6b68c7f5db3c033b780607Teng-Hui Zhu        m_maxBufferNumber = 3;
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;
89a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard}
90a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard
91a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas RoardBaseTile::~BaseTile()
92a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard{
93a1e806ed3b2d9e2727d08cc2a3958fce501f6f33Derek Sollenberger    setUsedLevel(-1);
94c9ab9bf00ba3ce8289f917675f81b40e4438a864Teng-Hui Zhu    if (m_texture)
9590455eb70cca2df540942299b35bb3bd8261cb0bDerek Sollenberger        m_texture->release(this);
9690455eb70cca2df540942299b35bb3bd8261cb0bDerek Sollenberger
978dfdf8aa25b250ed3b8c0a443cf1cbaf9bd12c5bDerek Sollenberger    delete m_renderer;
98f85cf343a02e85633e6b68c7f5db3c033b780607Teng-Hui Zhu    delete[] m_dirtyArea;
99f85cf343a02e85633e6b68c7f5db3c033b780607Teng-Hui Zhu    delete[] m_fullRepaint;
1008dfdf8aa25b250ed3b8c0a443cf1cbaf9bd12c5bDerek Sollenberger
101a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard#ifdef DEBUG_COUNT
102da44133fe92ec11fa6b904c498e7e5cd23a43cbfNicolas Roard    ClassTracker::instance()->decrement("BaseTile");
103a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard#endif
104a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard}
105a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard
1063a7a2aa023d51b1806d4063ab0ea5ef7d488556fNicolas Roard// All the following functions must be called from the main GL thread.
1073a7a2aa023d51b1806d4063ab0ea5ef7d488556fNicolas Roard
1083c131605fca8e29a88fdc4923d86bdc3f40adb2bNicolas Roardvoid BaseTile::setContents(TilePainter* painter, int x, int y, float scale)
109ffc715a2e6382fe9e331557c35fafc426507b8f5Derek Sollenberger{
110ffc715a2e6382fe9e331557c35fafc426507b8f5Derek Sollenberger    android::AutoMutex lock(m_atomicSync);
1113c131605fca8e29a88fdc4923d86bdc3f40adb2bNicolas Roard    if ((m_painter != painter)
1123c131605fca8e29a88fdc4923d86bdc3f40adb2bNicolas Roard        || (m_x != x)
1133c131605fca8e29a88fdc4923d86bdc3f40adb2bNicolas Roard        || (m_y != y)
1143c131605fca8e29a88fdc4923d86bdc3f40adb2bNicolas Roard        || (m_scale != scale))
1153c131605fca8e29a88fdc4923d86bdc3f40adb2bNicolas Roard        fullInval();
1163c131605fca8e29a88fdc4923d86bdc3f40adb2bNicolas Roard
1173c131605fca8e29a88fdc4923d86bdc3f40adb2bNicolas Roard    m_painter = painter;
118ffc715a2e6382fe9e331557c35fafc426507b8f5Derek Sollenberger    m_x = x;
119ffc715a2e6382fe9e331557c35fafc426507b8f5Derek Sollenberger    m_y = y;
1203c131605fca8e29a88fdc4923d86bdc3f40adb2bNicolas Roard    m_scale = scale;
121ffc715a2e6382fe9e331557c35fafc426507b8f5Derek Sollenberger}
122ffc715a2e6382fe9e331557c35fafc426507b8f5Derek Sollenberger
123a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roardvoid BaseTile::reserveTexture()
124a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard{
125ec182c75fb35d955a9115fbaf516f648a48ed0e1Derek Sollenberger    BaseTileTexture* texture = TilesManager::instance()->getAvailableTexture(this);
126a1e806ed3b2d9e2727d08cc2a3958fce501f6f33Derek Sollenberger
127a1e806ed3b2d9e2727d08cc2a3958fce501f6f33Derek Sollenberger    android::AutoMutex lock(m_atomicSync);
1285ba4a087b9212ca9ae083f015637f417199d85ccJohn Reck    if (texture && m_texture != texture) {
129a1e806ed3b2d9e2727d08cc2a3958fce501f6f33Derek Sollenberger        m_lastPaintedPicture = 0;
13067e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard        fullInval();
131a1e806ed3b2d9e2727d08cc2a3958fce501f6f33Derek Sollenberger    }
1323c131605fca8e29a88fdc4923d86bdc3f40adb2bNicolas Roard    m_texture = texture;
1333c131605fca8e29a88fdc4923d86bdc3f40adb2bNicolas Roard    if (m_texture)
1343c131605fca8e29a88fdc4923d86bdc3f40adb2bNicolas Roard        m_texture->setUsedLevel(m_usedLevel);
135a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard}
136a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard
137ec182c75fb35d955a9115fbaf516f648a48ed0e1Derek Sollenbergerbool BaseTile::removeTexture(BaseTileTexture* texture)
138a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard{
139245e0cdd9ea80915059080a2bedbb9ebb5cc646cNicolas Roard    XLOG("%x removeTexture res: %x... page %x", this, m_texture, m_page);
1403a7a2aa023d51b1806d4063ab0ea5ef7d488556fNicolas Roard    // We update atomically, so paintBitmap() can see the correct value
141a1e806ed3b2d9e2727d08cc2a3958fce501f6f33Derek Sollenberger    android::AutoMutex lock(m_atomicSync);
142fed0f3819356e8f1bdb6fd97c0265e2bfff1dacbNicolas Roard    if (m_texture == texture)
143fed0f3819356e8f1bdb6fd97c0265e2bfff1dacbNicolas Roard        m_texture = 0;
14481ec1fafcb2c1bc433ec34b6ae4ea78d1ea7d3a8Nicolas Roard    return true;
1453a7a2aa023d51b1806d4063ab0ea5ef7d488556fNicolas Roard}
1463a7a2aa023d51b1806d4063ab0ea5ef7d488556fNicolas Roard
14767e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roardvoid BaseTile::fullInval()
14867e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard{
149f85cf343a02e85633e6b68c7f5db3c033b780607Teng-Hui Zhu    for (int i = 0; i < m_maxBufferNumber; i++) {
150f85cf343a02e85633e6b68c7f5db3c033b780607Teng-Hui Zhu        m_dirtyArea[i].setEmpty();
151f85cf343a02e85633e6b68c7f5db3c033b780607Teng-Hui Zhu        m_fullRepaint[i] = true;
152f85cf343a02e85633e6b68c7f5db3c033b780607Teng-Hui Zhu    }
15367e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard    m_dirty = true;
15467e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard}
15567e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard
15667e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roardvoid BaseTile::markAsDirty(int unsigned pictureCount,
15767e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard                           const SkRegion& dirtyArea)
158a1e806ed3b2d9e2727d08cc2a3958fce501f6f33Derek Sollenberger{
159a1e806ed3b2d9e2727d08cc2a3958fce501f6f33Derek Sollenberger    android::AutoMutex lock(m_atomicSync);
160a1e806ed3b2d9e2727d08cc2a3958fce501f6f33Derek Sollenberger    m_lastDirtyPicture = pictureCount;
161f85cf343a02e85633e6b68c7f5db3c033b780607Teng-Hui Zhu    for (int i = 0; i < m_maxBufferNumber; i++)
162f85cf343a02e85633e6b68c7f5db3c033b780607Teng-Hui Zhu        m_dirtyArea[i].op(dirtyArea, SkRegion::kUnion_Op);
16367e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard    m_dirty = true;
164a1e806ed3b2d9e2727d08cc2a3958fce501f6f33Derek Sollenberger}
165a1e806ed3b2d9e2727d08cc2a3958fce501f6f33Derek Sollenberger
166c9ab9bf00ba3ce8289f917675f81b40e4438a864Teng-Hui Zhuvoid BaseTile::setUsable(bool usable)
167c9ab9bf00ba3ce8289f917675f81b40e4438a864Teng-Hui Zhu{
168c9ab9bf00ba3ce8289f917675f81b40e4438a864Teng-Hui Zhu    android::AutoMutex lock(m_atomicSync);
169c9ab9bf00ba3ce8289f917675f81b40e4438a864Teng-Hui Zhu    m_usable = usable;
170c9ab9bf00ba3ce8289f917675f81b40e4438a864Teng-Hui Zhu}
171c9ab9bf00ba3ce8289f917675f81b40e4438a864Teng-Hui Zhu
172c9ab9bf00ba3ce8289f917675f81b40e4438a864Teng-Hui Zhu
173a1e806ed3b2d9e2727d08cc2a3958fce501f6f33Derek Sollenbergerbool BaseTile::isDirty()
174a1e806ed3b2d9e2727d08cc2a3958fce501f6f33Derek Sollenberger{
175a1e806ed3b2d9e2727d08cc2a3958fce501f6f33Derek Sollenberger    android::AutoMutex lock(m_atomicSync);
176a1e806ed3b2d9e2727d08cc2a3958fce501f6f33Derek Sollenberger    return m_dirty;
177a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard}
178a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard
179417789b7c56928a5fcb610583346d07ffa380900John Reckbool BaseTile::isRepaintPending()
180417789b7c56928a5fcb610583346d07ffa380900John Reck{
181417789b7c56928a5fcb610583346d07ffa380900John Reck    android::AutoMutex lock(m_atomicSync);
182417789b7c56928a5fcb610583346d07ffa380900John Reck    return m_repaintPending;
183417789b7c56928a5fcb610583346d07ffa380900John Reck}
184417789b7c56928a5fcb610583346d07ffa380900John Reck
185417789b7c56928a5fcb610583346d07ffa380900John Reckvoid BaseTile::setRepaintPending(bool pending)
186417789b7c56928a5fcb610583346d07ffa380900John Reck{
187417789b7c56928a5fcb610583346d07ffa380900John Reck    android::AutoMutex lock(m_atomicSync);
188417789b7c56928a5fcb610583346d07ffa380900John Reck    m_repaintPending = pending;
189417789b7c56928a5fcb610583346d07ffa380900John Reck}
190417789b7c56928a5fcb610583346d07ffa380900John Reck
191a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roardvoid BaseTile::setUsedLevel(int usedLevel)
192a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard{
193a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard    if (m_texture)
194a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard        m_texture->setUsedLevel(usedLevel);
1953c131605fca8e29a88fdc4923d86bdc3f40adb2bNicolas Roard    m_usedLevel = usedLevel;
196a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard}
197a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard
198417789b7c56928a5fcb610583346d07ffa380900John Reckint BaseTile::usedLevel()
199417789b7c56928a5fcb610583346d07ffa380900John Reck{
200417789b7c56928a5fcb610583346d07ffa380900John Reck    if (m_texture)
201417789b7c56928a5fcb610583346d07ffa380900John Reck        return m_texture->usedLevel();
2023c131605fca8e29a88fdc4923d86bdc3f40adb2bNicolas Roard    return m_usedLevel;
203417789b7c56928a5fcb610583346d07ffa380900John Reck}
204417789b7c56928a5fcb610583346d07ffa380900John Reck
2053c131605fca8e29a88fdc4923d86bdc3f40adb2bNicolas Roard
2061deed5ff76dad5d0783c0e07639338f1d6b08a67Nicolas Roardvoid BaseTile::draw(float transparency, SkRect& rect, float scale)
207a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard{
2081deed5ff76dad5d0783c0e07639338f1d6b08a67Nicolas Roard    if (m_x < 0 || m_y < 0 || m_scale != scale)
20967e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard        return;
21067e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard
211a1e806ed3b2d9e2727d08cc2a3958fce501f6f33Derek Sollenberger    // No need to mutex protect reads of m_texture as it is only written to by
212a1e806ed3b2d9e2727d08cc2a3958fce501f6f33Derek Sollenberger    // the consumer thread.
213a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard    if (!m_texture) {
214245e0cdd9ea80915059080a2bedbb9ebb5cc646cNicolas Roard        XLOG("%x on page %x (%d, %d) trying to draw, but no m_texture!", this, m_page, x(), y());
215a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard        return;
216a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard    }
217a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard
218c9ab9bf00ba3ce8289f917675f81b40e4438a864Teng-Hui Zhu    // Early return if set to un-usable in purpose!
2190bdd7f2d73cad03535071e5de0ba3d2f5feb1b00Teng-Hui Zhu    m_atomicSync.lock();
2200bdd7f2d73cad03535071e5de0ba3d2f5feb1b00Teng-Hui Zhu    bool usable = m_usable;
2210bdd7f2d73cad03535071e5de0ba3d2f5feb1b00Teng-Hui Zhu    bool isTexturePainted = m_lastPaintedPicture;
2220bdd7f2d73cad03535071e5de0ba3d2f5feb1b00Teng-Hui Zhu    m_atomicSync.unlock();
22344009dc8813df9eb0815bf581740a7c365f3b515Teng-Hui Zhu    if (!usable) {
22444009dc8813df9eb0815bf581740a7c365f3b515Teng-Hui Zhu        XLOG("early return at BaseTile::draw b/c tile set to unusable !");
22544009dc8813df9eb0815bf581740a7c365f3b515Teng-Hui Zhu        return;
22644009dc8813df9eb0815bf581740a7c365f3b515Teng-Hui Zhu    }
22744009dc8813df9eb0815bf581740a7c365f3b515Teng-Hui Zhu    if (!isTexturePainted) {
22844009dc8813df9eb0815bf581740a7c365f3b515Teng-Hui Zhu        XLOG("early return at BaseTile::draw b/c tile is not painted !");
229c9ab9bf00ba3ce8289f917675f81b40e4438a864Teng-Hui Zhu        return;
230c9ab9bf00ba3ce8289f917675f81b40e4438a864Teng-Hui Zhu    }
231c9ab9bf00ba3ce8289f917675f81b40e4438a864Teng-Hui Zhu
232a52793c453c1512d0a18d4ae3108a975f998ae45Derek Sollenberger    TextureInfo* textureInfo = m_texture->consumerLock();
233a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard    if (!textureInfo) {
234a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard        XLOG("%x (%d, %d) trying to draw, but no textureInfo!", this, x(), y());
235a52793c453c1512d0a18d4ae3108a975f998ae45Derek Sollenberger        m_texture->consumerRelease();
236a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard        return;
237a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard    }
238a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard
23967e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard    if (m_texture->readyFor(this)) {
2403c131605fca8e29a88fdc4923d86bdc3f40adb2bNicolas Roard        XLOG("draw tile %x : %d, %d, %.2f with texture %x", this, x(), y(), scale(), m_texture);
2413c131605fca8e29a88fdc4923d86bdc3f40adb2bNicolas Roard        if (isLayerTile())
2423c131605fca8e29a88fdc4923d86bdc3f40adb2bNicolas Roard            TilesManager::instance()->shader()->drawLayerQuad(*m_painter->transform(),
2433c131605fca8e29a88fdc4923d86bdc3f40adb2bNicolas Roard                                                              rect, textureInfo->m_textureId,
2443c131605fca8e29a88fdc4923d86bdc3f40adb2bNicolas Roard                                                              transparency, true,
2453c131605fca8e29a88fdc4923d86bdc3f40adb2bNicolas Roard                                                              textureInfo->getTextureTarget());
2463c131605fca8e29a88fdc4923d86bdc3f40adb2bNicolas Roard        else
2473c131605fca8e29a88fdc4923d86bdc3f40adb2bNicolas Roard            TilesManager::instance()->shader()->drawQuad(rect, textureInfo->m_textureId,
2483c131605fca8e29a88fdc4923d86bdc3f40adb2bNicolas Roard                                                         transparency,
2493c131605fca8e29a88fdc4923d86bdc3f40adb2bNicolas Roard                                                         textureInfo->getTextureTarget());
25067e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard    }
251a52793c453c1512d0a18d4ae3108a975f998ae45Derek Sollenberger    m_texture->consumerRelease();
252a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard}
253a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard
254a1e806ed3b2d9e2727d08cc2a3958fce501f6f33Derek Sollenbergerbool BaseTile::isTileReady()
255a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard{
256a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard    if (!m_texture)
257a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard        return false;
258a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard    if (m_texture->owner() != this)
259a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard        return false;
260a1e806ed3b2d9e2727d08cc2a3958fce501f6f33Derek Sollenberger
261a1e806ed3b2d9e2727d08cc2a3958fce501f6f33Derek Sollenberger    android::AutoMutex lock(m_atomicSync);
26267e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard    if (m_dirty)
26367e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard        return false;
26467e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard
26567e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard    m_texture->consumerLock();
26667e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard    bool ready = m_texture->readyFor(this);
26767e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard    m_texture->consumerRelease();
26867e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard
26967e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard    if (ready)
27067e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard        return true;
27167e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard
27267e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard    m_dirty = true;
27367e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard    return false;
274a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard}
275a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard
2763a7a2aa023d51b1806d4063ab0ea5ef7d488556fNicolas Roard// This is called from the texture generation thread
27775394f5ee0aac2337cdff1597b4e686e22c52833Nicolas Roardvoid BaseTile::paintBitmap()
278a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard{
279a1e806ed3b2d9e2727d08cc2a3958fce501f6f33Derek Sollenberger    // We acquire the values below atomically. This ensures that we are reading
280a1e806ed3b2d9e2727d08cc2a3958fce501f6f33Derek Sollenberger    // values correctly across cores. Further, once we have these values they
281a1e806ed3b2d9e2727d08cc2a3958fce501f6f33Derek Sollenberger    // can be updated by other threads without consequence.
282a1e806ed3b2d9e2727d08cc2a3958fce501f6f33Derek Sollenberger    m_atomicSync.lock();
283a1e806ed3b2d9e2727d08cc2a3958fce501f6f33Derek Sollenberger    bool dirty = m_dirty;
284ec182c75fb35d955a9115fbaf516f648a48ed0e1Derek Sollenberger    BaseTileTexture* texture = m_texture;
285f85cf343a02e85633e6b68c7f5db3c033b780607Teng-Hui Zhu    SkRegion dirtyArea = m_dirtyArea[m_currentDirtyAreaIndex];
2863a7a2aa023d51b1806d4063ab0ea5ef7d488556fNicolas Roard    float scale = m_scale;
287be61abb47b98988ca94bd839a1e17c3267365dc9Nicolas Roard    const int x = m_x;
288be61abb47b98988ca94bd839a1e17c3267365dc9Nicolas Roard    const int y = m_y;
2893c131605fca8e29a88fdc4923d86bdc3f40adb2bNicolas Roard    TilePainter* painter = m_painter;
290cf1ae53e7b2853d1148ecd784379f12dffda9d43Nicolas Roard
2913c131605fca8e29a88fdc4923d86bdc3f40adb2bNicolas Roard    if (!dirty || !texture) {
2923c131605fca8e29a88fdc4923d86bdc3f40adb2bNicolas Roard        m_atomicSync.unlock();
29375394f5ee0aac2337cdff1597b4e686e22c52833Nicolas Roard        return;
2943c131605fca8e29a88fdc4923d86bdc3f40adb2bNicolas Roard    }
295a1e806ed3b2d9e2727d08cc2a3958fce501f6f33Derek Sollenberger
2967e3773d591be20a4ddb1ef7df2709fd7655b7917Nicolas Roard    texture->producerAcquireContext();
297a52793c453c1512d0a18d4ae3108a975f998ae45Derek Sollenberger    TextureInfo* textureInfo = texture->producerLock();
2983c131605fca8e29a88fdc4923d86bdc3f40adb2bNicolas Roard    m_atomicSync.unlock();
299a52793c453c1512d0a18d4ae3108a975f998ae45Derek Sollenberger
300a1e806ed3b2d9e2727d08cc2a3958fce501f6f33Derek Sollenberger    // at this point we can safely check the ownership (if the texture got
301a1e806ed3b2d9e2727d08cc2a3958fce501f6f33Derek Sollenberger    // transferred to another BaseTile under us)
302a52793c453c1512d0a18d4ae3108a975f998ae45Derek Sollenberger    if (texture->owner() != this || texture->usedLevel() > 1) {
303a52793c453c1512d0a18d4ae3108a975f998ae45Derek Sollenberger        texture->producerRelease();
30475394f5ee0aac2337cdff1597b4e686e22c52833Nicolas Roard        return;
305a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard    }
306a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard
30767e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard    unsigned int pictureCount = 0;
30867e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard
309232d0b3572d13d9b4fb1211d9d56252a1ede3ed6Derek Sollenberger    // setup the common renderInfo fields;
310232d0b3572d13d9b4fb1211d9d56252a1ede3ed6Derek Sollenberger    TileRenderInfo renderInfo;
311232d0b3572d13d9b4fb1211d9d56252a1ede3ed6Derek Sollenberger    renderInfo.x = x;
312232d0b3572d13d9b4fb1211d9d56252a1ede3ed6Derek Sollenberger    renderInfo.y = y;
313232d0b3572d13d9b4fb1211d9d56252a1ede3ed6Derek Sollenberger    renderInfo.scale = scale;
314232d0b3572d13d9b4fb1211d9d56252a1ede3ed6Derek Sollenberger    renderInfo.tileSize = texture->getSize();
3153c131605fca8e29a88fdc4923d86bdc3f40adb2bNicolas Roard    renderInfo.tilePainter = painter;
3163c131605fca8e29a88fdc4923d86bdc3f40adb2bNicolas Roard    renderInfo.baseTile = this;
317232d0b3572d13d9b4fb1211d9d56252a1ede3ed6Derek Sollenberger    renderInfo.textureInfo = textureInfo;
318232d0b3572d13d9b4fb1211d9d56252a1ede3ed6Derek Sollenberger
319232d0b3572d13d9b4fb1211d9d56252a1ede3ed6Derek Sollenberger    const float tileWidth = renderInfo.tileSize.width();
320232d0b3572d13d9b4fb1211d9d56252a1ede3ed6Derek Sollenberger    const float tileHeight = renderInfo.tileSize.height();
321232d0b3572d13d9b4fb1211d9d56252a1ede3ed6Derek Sollenberger
32267e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard    SkRegion::Iterator cliperator(dirtyArea);
32367e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard
32467e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard    bool fullRepaint = false;
325f85cf343a02e85633e6b68c7f5db3c033b780607Teng-Hui Zhu
326fca6a67b130c1f97d366460af412ec6e6de14834Derek Sollenberger    // TODO: Implement the partial invalidate in Surface Texture Mode
327f85cf343a02e85633e6b68c7f5db3c033b780607Teng-Hui Zhu    if (m_fullRepaint[m_currentDirtyAreaIndex]
328f85cf343a02e85633e6b68c7f5db3c033b780607Teng-Hui Zhu        || textureInfo->m_width != tileWidth
329f85cf343a02e85633e6b68c7f5db3c033b780607Teng-Hui Zhu        || textureInfo->m_height != tileHeight
330f85cf343a02e85633e6b68c7f5db3c033b780607Teng-Hui Zhu        || textureInfo->getSharedTextureMode() == SurfaceTextureMode) {
33167e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard        fullRepaint = true;
332fca6a67b130c1f97d366460af412ec6e6de14834Derek Sollenberger    }
33367e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard
334fca6a67b130c1f97d366460af412ec6e6de14834Derek Sollenberger    if (!fullRepaint) {
33567e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard        while (!cliperator.done()) {
33667e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard            SkRect dirtyRect;
33767e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard            dirtyRect.set(cliperator.rect());
33867e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard
339bc235f4153cd55951a65bfcda6dc4b6c655d8cadTeng-Hui Zhu            // compute the rect to corresponds to pixels
340bc235f4153cd55951a65bfcda6dc4b6c655d8cadTeng-Hui Zhu            SkRect realTileRect;
341fca6a67b130c1f97d366460af412ec6e6de14834Derek Sollenberger            realTileRect.fLeft = x * tileWidth;
342fca6a67b130c1f97d366460af412ec6e6de14834Derek Sollenberger            realTileRect.fTop = y * tileHeight;
343fca6a67b130c1f97d366460af412ec6e6de14834Derek Sollenberger            realTileRect.fRight = realTileRect.fLeft + tileWidth;
344fca6a67b130c1f97d366460af412ec6e6de14834Derek Sollenberger            realTileRect.fBottom = realTileRect.fTop + tileHeight;
345bc235f4153cd55951a65bfcda6dc4b6c655d8cadTeng-Hui Zhu
346bc235f4153cd55951a65bfcda6dc4b6c655d8cadTeng-Hui Zhu            // scale the dirtyRect for intersect computation.
347bc235f4153cd55951a65bfcda6dc4b6c655d8cadTeng-Hui Zhu            SkRect realDirtyRect = SkRect::MakeWH(dirtyRect.width() * scale,
348bc235f4153cd55951a65bfcda6dc4b6c655d8cadTeng-Hui Zhu                                                  dirtyRect.height() * scale);
349bc235f4153cd55951a65bfcda6dc4b6c655d8cadTeng-Hui Zhu            realDirtyRect.offset(dirtyRect.fLeft * scale, dirtyRect.fTop * scale);
350bc235f4153cd55951a65bfcda6dc4b6c655d8cadTeng-Hui Zhu
351fca6a67b130c1f97d366460af412ec6e6de14834Derek Sollenberger            // set realTileRect to the intersection of itself and the dirty rect
352bc235f4153cd55951a65bfcda6dc4b6c655d8cadTeng-Hui Zhu            if (!realTileRect.intersect(realDirtyRect)) {
35367e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard                cliperator.next();
35467e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard                continue;
35567e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard            }
35667e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard
357fca6a67b130c1f97d366460af412ec6e6de14834Derek Sollenberger            // initialize finalRealRect to the rounded values of realTileRect
35867e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard            SkIRect finalRealRect;
359fca6a67b130c1f97d366460af412ec6e6de14834Derek Sollenberger            realTileRect.roundOut(&finalRealRect);
360fca6a67b130c1f97d366460af412ec6e6de14834Derek Sollenberger
361fca6a67b130c1f97d366460af412ec6e6de14834Derek Sollenberger            // stash the int values of the current width and height
362fca6a67b130c1f97d366460af412ec6e6de14834Derek Sollenberger            const int iWidth = finalRealRect.width();
363fca6a67b130c1f97d366460af412ec6e6de14834Derek Sollenberger            const int iHeight = finalRealRect.height();
364fca6a67b130c1f97d366460af412ec6e6de14834Derek Sollenberger
365fca6a67b130c1f97d366460af412ec6e6de14834Derek Sollenberger            if (iWidth == tileWidth || iHeight == tileHeight) {
366fca6a67b130c1f97d366460af412ec6e6de14834Derek Sollenberger                fullRepaint = true;
367fca6a67b130c1f97d366460af412ec6e6de14834Derek Sollenberger                break;
368fca6a67b130c1f97d366460af412ec6e6de14834Derek Sollenberger            }
369fca6a67b130c1f97d366460af412ec6e6de14834Derek Sollenberger
370fca6a67b130c1f97d366460af412ec6e6de14834Derek Sollenberger            // translate the rect into tile space coordinates
371fca6a67b130c1f97d366460af412ec6e6de14834Derek Sollenberger            finalRealRect.fLeft = finalRealRect.fLeft % static_cast<int>(tileWidth);
372fca6a67b130c1f97d366460af412ec6e6de14834Derek Sollenberger            finalRealRect.fTop = finalRealRect.fTop % static_cast<int>(tileHeight);
373fca6a67b130c1f97d366460af412ec6e6de14834Derek Sollenberger            finalRealRect.fRight = finalRealRect.fLeft + iWidth;
374fca6a67b130c1f97d366460af412ec6e6de14834Derek Sollenberger            finalRealRect.fBottom = finalRealRect.fTop + iHeight;
37567e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard
376232d0b3572d13d9b4fb1211d9d56252a1ede3ed6Derek Sollenberger            renderInfo.invalRect = &finalRealRect;
377232d0b3572d13d9b4fb1211d9d56252a1ede3ed6Derek Sollenberger            renderInfo.measurePerf = false;
37867e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard
3798dfdf8aa25b250ed3b8c0a443cf1cbaf9bd12c5bDerek Sollenberger            pictureCount = m_renderer->renderTiledContent(renderInfo);
38067e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard
38167e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard            cliperator.next();
38267e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard        }
38367e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard    }
384fca6a67b130c1f97d366460af412ec6e6de14834Derek Sollenberger
385fca6a67b130c1f97d366460af412ec6e6de14834Derek Sollenberger    if (fullRepaint) {
386fca6a67b130c1f97d366460af412ec6e6de14834Derek Sollenberger        SkIRect rect;
387fca6a67b130c1f97d366460af412ec6e6de14834Derek Sollenberger        rect.set(0, 0, tileWidth, tileHeight);
388fca6a67b130c1f97d366460af412ec6e6de14834Derek Sollenberger
389232d0b3572d13d9b4fb1211d9d56252a1ede3ed6Derek Sollenberger        renderInfo.invalRect = &rect;
390232d0b3572d13d9b4fb1211d9d56252a1ede3ed6Derek Sollenberger        renderInfo.measurePerf = TilesManager::instance()->getShowVisualIndicator();
391232d0b3572d13d9b4fb1211d9d56252a1ede3ed6Derek Sollenberger
3928dfdf8aa25b250ed3b8c0a443cf1cbaf9bd12c5bDerek Sollenberger        pictureCount = m_renderer->renderTiledContent(renderInfo);
393fca6a67b130c1f97d366460af412ec6e6de14834Derek Sollenberger    }
394fca6a67b130c1f97d366460af412ec6e6de14834Derek Sollenberger
39567e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard    XLOG("%x update texture %x for tile %d, %d scale %.2f (m_scale: %.2f)", this, textureInfo, x, y, scale, m_scale);
396b33016812afef21c69df5ab3d5b85eab5fef7c5cDerek Sollenberger
39767e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard    m_atomicSync.lock();
3983c131605fca8e29a88fdc4923d86bdc3f40adb2bNicolas Roard    texture->setTile(textureInfo, x, y, scale, painter, pictureCount);
39967e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard    texture->producerReleaseAndSwap();
40067e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard
4015ba4a087b9212ca9ae083f015637f417199d85ccJohn Reck    if (texture == m_texture) {
4025ba4a087b9212ca9ae083f015637f417199d85ccJohn Reck        m_lastPaintedPicture = pictureCount;
403a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard
4045ba4a087b9212ca9ae083f015637f417199d85ccJohn Reck        // set the fullrepaint flags
405f85cf343a02e85633e6b68c7f5db3c033b780607Teng-Hui Zhu        m_fullRepaint[m_currentDirtyAreaIndex] = false;
40667e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard
4075ba4a087b9212ca9ae083f015637f417199d85ccJohn Reck        // The various checks to see if we are still dirty...
40867e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard
4095ba4a087b9212ca9ae083f015637f417199d85ccJohn Reck        m_dirty = false;
41067e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard
4115ba4a087b9212ca9ae083f015637f417199d85ccJohn Reck        if (m_scale != scale)
4125ba4a087b9212ca9ae083f015637f417199d85ccJohn Reck            m_dirty = true;
41367e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard
414fca6a67b130c1f97d366460af412ec6e6de14834Derek Sollenberger        if (fullRepaint)
415f85cf343a02e85633e6b68c7f5db3c033b780607Teng-Hui Zhu            m_dirtyArea[m_currentDirtyAreaIndex].setEmpty();
416fca6a67b130c1f97d366460af412ec6e6de14834Derek Sollenberger        else
417f85cf343a02e85633e6b68c7f5db3c033b780607Teng-Hui Zhu            m_dirtyArea[m_currentDirtyAreaIndex].op(dirtyArea, SkRegion::kDifference_Op);
41867e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard
419f85cf343a02e85633e6b68c7f5db3c033b780607Teng-Hui Zhu        if (!m_dirtyArea[m_currentDirtyAreaIndex].isEmpty())
4205ba4a087b9212ca9ae083f015637f417199d85ccJohn Reck            m_dirty = true;
42167e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard
4225ba4a087b9212ca9ae083f015637f417199d85ccJohn Reck        // Now we can swap the dirty areas
423f85cf343a02e85633e6b68c7f5db3c033b780607Teng-Hui Zhu        // TODO: For surface texture in Async mode, the index will be updated
424f85cf343a02e85633e6b68c7f5db3c033b780607Teng-Hui Zhu        // according to the current buffer just dequeued.
425f85cf343a02e85633e6b68c7f5db3c033b780607Teng-Hui Zhu        m_currentDirtyAreaIndex = (m_currentDirtyAreaIndex+1) % m_maxBufferNumber;
42667e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard
427f85cf343a02e85633e6b68c7f5db3c033b780607Teng-Hui Zhu        if (!m_dirtyArea[m_currentDirtyAreaIndex].isEmpty())
4285ba4a087b9212ca9ae083f015637f417199d85ccJohn Reck            m_dirty = true;
429c15781f45f0d19a925be7fd73bd10c318562db70Nicolas Roard
4305ba4a087b9212ca9ae083f015637f417199d85ccJohn Reck        if (!m_dirty)
4315ba4a087b9212ca9ae083f015637f417199d85ccJohn Reck            m_usable = true;
4325ba4a087b9212ca9ae083f015637f417199d85ccJohn Reck    }
43367e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard
43467e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard    m_atomicSync.unlock();
43567e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard}
43667e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard
437a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard} // namespace WebCore
438a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard
439a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard#endif // USE(ACCELERATED_COMPOSITING)
440