Tile.cpp revision bd3f93b66934582acd0b6c70bcf60ca643b36ead
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
26594c6b805969c2673c84d1d1d1a3556ce376ac7aChris Craik#define LOG_TAG "Tile"
27d487c56b47c747d3e331ee1892e4c0473363afd2Chris Craik#define LOG_NDEBUG 1
28d487c56b47c747d3e331ee1892e4c0473363afd2Chris Craik
29a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard#include "config.h"
30594c6b805969c2673c84d1d1d1a3556ce376ac7aChris Craik#include "Tile.h"
31a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard
32a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard#if USE(ACCELERATED_COMPOSITING)
33a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard
34d487c56b47c747d3e331ee1892e4c0473363afd2Chris Craik#include "AndroidLog.h"
35a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard#include "GLUtils.h"
36f85cf343a02e85633e6b68c7f5db3c033b780607Teng-Hui Zhu#include "RasterRenderer.h"
37fca6a67b130c1f97d366460af412ec6e6de14834Derek Sollenberger#include "TextureInfo.h"
38594c6b805969c2673c84d1d1d1a3556ce376ac7aChris Craik#include "TileTexture.h"
39a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard#include "TilesManager.h"
40a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard
41c048426c23be795d3bf870e47429167b4157a2d6Nicolas Roard// If the dirty portion of a tile exceeds this ratio, fully repaint.
42c048426c23be795d3bf870e47429167b4157a2d6Nicolas Roard// Lower values give fewer partial repaints, thus fewer front-to-back
43c048426c23be795d3bf870e47429167b4157a2d6Nicolas Roard// texture copies (cost will vary by device). It's a tradeoff between
44c048426c23be795d3bf870e47429167b4157a2d6Nicolas Roard// the rasterization cost and the FBO texture recopy cost when using
45c048426c23be795d3bf870e47429167b4157a2d6Nicolas Roard// GPU for the transfer queue.
46c048426c23be795d3bf870e47429167b4157a2d6Nicolas Roard#define MAX_INVAL_AREA 0.6
47c048426c23be795d3bf870e47429167b4157a2d6Nicolas Roard
48a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roardnamespace WebCore {
49a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard
50594c6b805969c2673c84d1d1d1a3556ce376ac7aChris CraikTile::Tile(bool isLayerTile)
51885e650b12d781be054b31ae6221925a0184dc33Chris Craik    : m_x(-1)
52ffc715a2e6382fe9e331557c35fafc426507b8f5Derek Sollenberger    , m_y(-1)
538ad3ab0e47f0d5039e89c1873c178f538ec1b0dfChris Craik    , m_frontTexture(0)
548ad3ab0e47f0d5039e89c1873c178f538ec1b0dfChris Craik    , m_backTexture(0)
55a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard    , m_scale(1)
56a1e806ed3b2d9e2727d08cc2a3958fce501f6f33Derek Sollenberger    , m_dirty(true)
57417789b7c56928a5fcb610583346d07ffa380900John Reck    , m_repaintPending(false)
5862ee9670dd9beeb9a8f21d8737250c081382e2f5Teng-Hui Zhu    , m_fullRepaint(true)
593c131605fca8e29a88fdc4923d86bdc3f40adb2bNicolas Roard    , m_isLayerTile(isLayerTile)
608ad3ab0e47f0d5039e89c1873c178f538ec1b0dfChris Craik    , m_drawCount(0)
61f6a40880028cf495025747229c627f42e25acc66Chris Craik    , m_state(Unpainted)
62a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard{
63a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard#ifdef DEBUG_COUNT
64594c6b805969c2673c84d1d1d1a3556ce376ac7aChris Craik    ClassTracker::instance()->increment("Tile");
65a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard#endif
66c7e578330aece3c556ef205365c24676687223e2Derek Sollenberger    m_renderer = BaseRenderer::createRenderer();
67a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard}
68a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard
69594c6b805969c2673c84d1d1d1a3556ce376ac7aChris CraikTile::~Tile()
70a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard{
718ad3ab0e47f0d5039e89c1873c178f538ec1b0dfChris Craik    if (m_backTexture)
728ad3ab0e47f0d5039e89c1873c178f538ec1b0dfChris Craik        m_backTexture->release(this);
738ad3ab0e47f0d5039e89c1873c178f538ec1b0dfChris Craik    if (m_frontTexture)
748ad3ab0e47f0d5039e89c1873c178f538ec1b0dfChris Craik        m_frontTexture->release(this);
7590455eb70cca2df540942299b35bb3bd8261cb0bDerek Sollenberger
768dfdf8aa25b250ed3b8c0a443cf1cbaf9bd12c5bDerek Sollenberger    delete m_renderer;
778dfdf8aa25b250ed3b8c0a443cf1cbaf9bd12c5bDerek Sollenberger
78a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard#ifdef DEBUG_COUNT
79594c6b805969c2673c84d1d1d1a3556ce376ac7aChris Craik    ClassTracker::instance()->decrement("Tile");
80a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard#endif
81a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard}
82a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard
833a7a2aa023d51b1806d4063ab0ea5ef7d488556fNicolas Roard// All the following functions must be called from the main GL thread.
843a7a2aa023d51b1806d4063ab0ea5ef7d488556fNicolas Roard
85594c6b805969c2673c84d1d1d1a3556ce376ac7aChris Craikvoid Tile::setContents(int x, int y, float scale, bool isExpandedPrefetchTile)
86ffc715a2e6382fe9e331557c35fafc426507b8f5Derek Sollenberger{
87d8be9016b7fda67a91b4ee17b3b2e7ba692ee553Chris Craik    // TODO: investigate whether below check/discard is necessary
8892db4f76a7eca8f91084ec2eedde77b161786f23Chris Craik    if ((m_x != x)
893c131605fca8e29a88fdc4923d86bdc3f40adb2bNicolas Roard        || (m_y != y)
90f6a40880028cf495025747229c627f42e25acc66Chris Craik        || (m_scale != scale)) {
91f6a40880028cf495025747229c627f42e25acc66Chris Craik        // neither texture is relevant
92f6a40880028cf495025747229c627f42e25acc66Chris Craik        discardTextures();
93f6a40880028cf495025747229c627f42e25acc66Chris Craik    }
943c131605fca8e29a88fdc4923d86bdc3f40adb2bNicolas Roard
95f6a40880028cf495025747229c627f42e25acc66Chris Craik    android::AutoMutex lock(m_atomicSync);
96ffc715a2e6382fe9e331557c35fafc426507b8f5Derek Sollenberger    m_x = x;
97ffc715a2e6382fe9e331557c35fafc426507b8f5Derek Sollenberger    m_y = y;
983c131605fca8e29a88fdc4923d86bdc3f40adb2bNicolas Roard    m_scale = scale;
998ad3ab0e47f0d5039e89c1873c178f538ec1b0dfChris Craik    m_drawCount = TilesManager::instance()->getDrawGLCount();
100c51715092b8d3be1b51cce8bae61750cbcf342c4Chris Craik    if (isExpandedPrefetchTile)
101c51715092b8d3be1b51cce8bae61750cbcf342c4Chris Craik        m_drawCount--; // deprioritize expanded painting region
102ffc715a2e6382fe9e331557c35fafc426507b8f5Derek Sollenberger}
103ffc715a2e6382fe9e331557c35fafc426507b8f5Derek Sollenberger
104594c6b805969c2673c84d1d1d1a3556ce376ac7aChris Craikvoid Tile::reserveTexture()
105a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard{
106594c6b805969c2673c84d1d1d1a3556ce376ac7aChris Craik    TileTexture* texture = TilesManager::instance()->getAvailableTexture(this);
107a1e806ed3b2d9e2727d08cc2a3958fce501f6f33Derek Sollenberger
108a1e806ed3b2d9e2727d08cc2a3958fce501f6f33Derek Sollenberger    android::AutoMutex lock(m_atomicSync);
1098ad3ab0e47f0d5039e89c1873c178f538ec1b0dfChris Craik    if (texture && m_backTexture != texture) {
110d487c56b47c747d3e331ee1892e4c0473363afd2Chris Craik        ALOGV("tile %p reserving texture %p, back was %p (front %p)",
111d487c56b47c747d3e331ee1892e4c0473363afd2Chris Craik              this, texture, m_backTexture, m_frontTexture);
112f6a40880028cf495025747229c627f42e25acc66Chris Craik        m_state = Unpainted;
1138ad3ab0e47f0d5039e89c1873c178f538ec1b0dfChris Craik        m_backTexture = texture;
114a1e806ed3b2d9e2727d08cc2a3958fce501f6f33Derek Sollenberger    }
1156aa089bded6a1abbf8d61264588e1e3a32be31b3Chris Craik
116f6a40880028cf495025747229c627f42e25acc66Chris Craik    if (m_state == UpToDate) {
117d487c56b47c747d3e331ee1892e4c0473363afd2Chris Craik        ALOGV("moving tile %p to unpainted, since it reserved while up to date", this);
1186aa089bded6a1abbf8d61264588e1e3a32be31b3Chris Craik        m_dirty = true;
119f6a40880028cf495025747229c627f42e25acc66Chris Craik        m_state = Unpainted;
120f6a40880028cf495025747229c627f42e25acc66Chris Craik    }
121a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard}
122a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard
123594c6b805969c2673c84d1d1d1a3556ce376ac7aChris Craikbool Tile::removeTexture(TileTexture* texture)
124a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard{
1257b4a179bde698a856bed54a680438a9db3ff0566Chris Craik    ALOGV("%p removeTexture %p, back %p front %p",
1267b4a179bde698a856bed54a680438a9db3ff0566Chris Craik          this, texture, m_backTexture, m_frontTexture);
1273a7a2aa023d51b1806d4063ab0ea5ef7d488556fNicolas Roard    // We update atomically, so paintBitmap() can see the correct value
128a1e806ed3b2d9e2727d08cc2a3958fce501f6f33Derek Sollenberger    android::AutoMutex lock(m_atomicSync);
129f6a40880028cf495025747229c627f42e25acc66Chris Craik    if (m_frontTexture == texture) {
130f6a40880028cf495025747229c627f42e25acc66Chris Craik        if (m_state == UpToDate) {
131d487c56b47c747d3e331ee1892e4c0473363afd2Chris Craik            ALOGV("front texture removed, state was UpToDate, now becoming unpainted, bt is %p", m_backTexture);
132f6a40880028cf495025747229c627f42e25acc66Chris Craik            m_state = Unpainted;
133f6a40880028cf495025747229c627f42e25acc66Chris Craik        }
134f6a40880028cf495025747229c627f42e25acc66Chris Craik
1358ad3ab0e47f0d5039e89c1873c178f538ec1b0dfChris Craik        m_frontTexture = 0;
136f6a40880028cf495025747229c627f42e25acc66Chris Craik    }
137f6a40880028cf495025747229c627f42e25acc66Chris Craik    if (m_backTexture == texture) {
138f6a40880028cf495025747229c627f42e25acc66Chris Craik        m_state = Unpainted;
1398ad3ab0e47f0d5039e89c1873c178f538ec1b0dfChris Craik        m_backTexture = 0;
140f6a40880028cf495025747229c627f42e25acc66Chris Craik    }
1416aa089bded6a1abbf8d61264588e1e3a32be31b3Chris Craik
1426aa089bded6a1abbf8d61264588e1e3a32be31b3Chris Craik    // mark dirty regardless of which texture was taken - the back texture may
1436aa089bded6a1abbf8d61264588e1e3a32be31b3Chris Craik    // have been ready to swap
1446aa089bded6a1abbf8d61264588e1e3a32be31b3Chris Craik    m_dirty = true;
1456aa089bded6a1abbf8d61264588e1e3a32be31b3Chris Craik
14681ec1fafcb2c1bc433ec34b6ae4ea78d1ea7d3a8Nicolas Roard    return true;
1473a7a2aa023d51b1806d4063ab0ea5ef7d488556fNicolas Roard}
1483a7a2aa023d51b1806d4063ab0ea5ef7d488556fNicolas Roard
149bd3f93b66934582acd0b6c70bcf60ca643b36eadChris Craikvoid Tile::markAsDirty()
150bd3f93b66934582acd0b6c70bcf60ca643b36eadChris Craik{
151bd3f93b66934582acd0b6c70bcf60ca643b36eadChris Craik    android::AutoMutex lock(m_atomicSync);
152bd3f93b66934582acd0b6c70bcf60ca643b36eadChris Craik    m_dirtyArea.setEmpty(); // empty dirty rect prevents fast blit path
153bd3f93b66934582acd0b6c70bcf60ca643b36eadChris Craik    markAsDirtyInternal();
154bd3f93b66934582acd0b6c70bcf60ca643b36eadChris Craik}
155bd3f93b66934582acd0b6c70bcf60ca643b36eadChris Craik
156594c6b805969c2673c84d1d1d1a3556ce376ac7aChris Craikvoid Tile::markAsDirty(const SkRegion& dirtyArea)
157a1e806ed3b2d9e2727d08cc2a3958fce501f6f33Derek Sollenberger{
158fa807bd31774157959640810e564fbe64338e8e3Nicolas Roard    if (dirtyArea.isEmpty())
159fa807bd31774157959640810e564fbe64338e8e3Nicolas Roard        return;
160a1e806ed3b2d9e2727d08cc2a3958fce501f6f33Derek Sollenberger    android::AutoMutex lock(m_atomicSync);
16162ee9670dd9beeb9a8f21d8737250c081382e2f5Teng-Hui Zhu    m_dirtyArea.op(dirtyArea, SkRegion::kUnion_Op);
16261a908361c8a96eeb70afdb5430e89845edb2bddNicolas Roard
16361a908361c8a96eeb70afdb5430e89845edb2bddNicolas Roard    // Check if we actually intersect with the area
16461a908361c8a96eeb70afdb5430e89845edb2bddNicolas Roard    bool intersect = false;
16561a908361c8a96eeb70afdb5430e89845edb2bddNicolas Roard    SkRegion::Iterator cliperator(dirtyArea);
16661a908361c8a96eeb70afdb5430e89845edb2bddNicolas Roard    SkRect realTileRect;
16761a908361c8a96eeb70afdb5430e89845edb2bddNicolas Roard    SkRect dirtyRect;
16861a908361c8a96eeb70afdb5430e89845edb2bddNicolas Roard    while (!cliperator.done()) {
16961a908361c8a96eeb70afdb5430e89845edb2bddNicolas Roard        dirtyRect.set(cliperator.rect());
170c51715092b8d3be1b51cce8bae61750cbcf342c4Chris Craik        if (intersectWithRect(m_x, m_y, TilesManager::tileWidth(), TilesManager::tileHeight(),
17161a908361c8a96eeb70afdb5430e89845edb2bddNicolas Roard                              m_scale, dirtyRect, realTileRect)) {
17261a908361c8a96eeb70afdb5430e89845edb2bddNicolas Roard            intersect = true;
17361a908361c8a96eeb70afdb5430e89845edb2bddNicolas Roard            break;
17461a908361c8a96eeb70afdb5430e89845edb2bddNicolas Roard        }
17561a908361c8a96eeb70afdb5430e89845edb2bddNicolas Roard        cliperator.next();
17661a908361c8a96eeb70afdb5430e89845edb2bddNicolas Roard    }
17708c253c5d2dad921120c3e1ab7bc6781064ca31bNicolas Roard
17861a908361c8a96eeb70afdb5430e89845edb2bddNicolas Roard    if (!intersect)
17961a908361c8a96eeb70afdb5430e89845edb2bddNicolas Roard        return;
18061a908361c8a96eeb70afdb5430e89845edb2bddNicolas Roard
181bd3f93b66934582acd0b6c70bcf60ca643b36eadChris Craik    markAsDirtyInternal();
182bd3f93b66934582acd0b6c70bcf60ca643b36eadChris Craik}
183bd3f93b66934582acd0b6c70bcf60ca643b36eadChris Craik
184bd3f93b66934582acd0b6c70bcf60ca643b36eadChris Craikvoid Tile::markAsDirtyInternal()
185bd3f93b66934582acd0b6c70bcf60ca643b36eadChris Craik{
186bd3f93b66934582acd0b6c70bcf60ca643b36eadChris Craik    // NOTE: callers must hold lock on m_atomicSync
187bd3f93b66934582acd0b6c70bcf60ca643b36eadChris Craik
18867e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard    m_dirty = true;
189f6a40880028cf495025747229c627f42e25acc66Chris Craik    if (m_state == UpToDate) {
190f6a40880028cf495025747229c627f42e25acc66Chris Craik        // We only mark a tile as unpainted in 'markAsDirty' if its status is
191f6a40880028cf495025747229c627f42e25acc66Chris Craik        // UpToDate: marking dirty means we need to repaint, but don't stop the
192f6a40880028cf495025747229c627f42e25acc66Chris Craik        // current paint
193f6a40880028cf495025747229c627f42e25acc66Chris Craik        m_state = Unpainted;
194f6a40880028cf495025747229c627f42e25acc66Chris Craik    } else if (m_state != Unpainted) {
195f6a40880028cf495025747229c627f42e25acc66Chris Craik        // TODO: fix it so that they can paint while deferring the markAsDirty
196f6a40880028cf495025747229c627f42e25acc66Chris Craik        // call (or block updates)
1977b4a179bde698a856bed54a680438a9db3ff0566Chris Craik        ALOGV("Warning: tried to mark tile %p at %d, %d islayertile %d as dirty, state %d",
1987b4a179bde698a856bed54a680438a9db3ff0566Chris Craik              this, m_x, m_y, isLayerTile(), m_state);
199458b4b11924c3bcc70dcdd3d69f64a855870e72dChris Craik
200458b4b11924c3bcc70dcdd3d69f64a855870e72dChris Craik        // prefetch tiles can be marked dirty while in the process of painting,
201458b4b11924c3bcc70dcdd3d69f64a855870e72dChris Craik        // due to not using an update lock. force them to fail validate step.
202458b4b11924c3bcc70dcdd3d69f64a855870e72dChris Craik        m_state = Unpainted;
203f6a40880028cf495025747229c627f42e25acc66Chris Craik    }
204a1e806ed3b2d9e2727d08cc2a3958fce501f6f33Derek Sollenberger}
205a1e806ed3b2d9e2727d08cc2a3958fce501f6f33Derek Sollenberger
206594c6b805969c2673c84d1d1d1a3556ce376ac7aChris Craikbool Tile::isDirty()
207a1e806ed3b2d9e2727d08cc2a3958fce501f6f33Derek Sollenberger{
208a1e806ed3b2d9e2727d08cc2a3958fce501f6f33Derek Sollenberger    android::AutoMutex lock(m_atomicSync);
209a1e806ed3b2d9e2727d08cc2a3958fce501f6f33Derek Sollenberger    return m_dirty;
210a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard}
211a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard
212594c6b805969c2673c84d1d1d1a3556ce376ac7aChris Craikbool Tile::isRepaintPending()
213417789b7c56928a5fcb610583346d07ffa380900John Reck{
214417789b7c56928a5fcb610583346d07ffa380900John Reck    android::AutoMutex lock(m_atomicSync);
215417789b7c56928a5fcb610583346d07ffa380900John Reck    return m_repaintPending;
216417789b7c56928a5fcb610583346d07ffa380900John Reck}
217417789b7c56928a5fcb610583346d07ffa380900John Reck
218594c6b805969c2673c84d1d1d1a3556ce376ac7aChris Craikvoid Tile::setRepaintPending(bool pending)
219417789b7c56928a5fcb610583346d07ffa380900John Reck{
220417789b7c56928a5fcb610583346d07ffa380900John Reck    android::AutoMutex lock(m_atomicSync);
221417789b7c56928a5fcb610583346d07ffa380900John Reck    m_repaintPending = pending;
222417789b7c56928a5fcb610583346d07ffa380900John Reck}
223417789b7c56928a5fcb610583346d07ffa380900John Reck
224594c6b805969c2673c84d1d1d1a3556ce376ac7aChris Craikbool Tile::drawGL(float opacity, const SkRect& rect, float scale,
225a31d28d03260660f592ad6914f5375b47e823aa5Teng-Hui Zhu                  const TransformationMatrix* transform,
22632ce41e0241790f20e63cafea4d3c1db87423eecChris Craik                  bool forceBlending, bool usePointSampling,
227485445e9a624fe92ca04a1d0e92c1f71aaf8cd8fTeng-Hui Zhu                  const FloatRect& fillPortion)
228a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard{
2291deed5ff76dad5d0783c0e07639338f1d6b08a67Nicolas Roard    if (m_x < 0 || m_y < 0 || m_scale != scale)
230afe34397d6d4655c908f0995e760772980722da3Teng-Hui Zhu        return false;
23167e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard
2328ad3ab0e47f0d5039e89c1873c178f538ec1b0dfChris Craik    // No need to mutex protect reads of m_backTexture as it is only written to by
233a1e806ed3b2d9e2727d08cc2a3958fce501f6f33Derek Sollenberger    // the consumer thread.
2348ad3ab0e47f0d5039e89c1873c178f538ec1b0dfChris Craik    if (!m_frontTexture)
235afe34397d6d4655c908f0995e760772980722da3Teng-Hui Zhu        return false;
236a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard
237485445e9a624fe92ca04a1d0e92c1f71aaf8cd8fTeng-Hui Zhu    if (fillPortion.maxX() < 1.0f || fillPortion.maxY() < 1.0f
238485445e9a624fe92ca04a1d0e92c1f71aaf8cd8fTeng-Hui Zhu        || fillPortion.x() > 0.0f || fillPortion.y() > 0.0f)
239485445e9a624fe92ca04a1d0e92c1f71aaf8cd8fTeng-Hui Zhu        ALOGV("drawing tile %p (%d, %d with fill portions %f %f->%f, %f",
240485445e9a624fe92ca04a1d0e92c1f71aaf8cd8fTeng-Hui Zhu              this, m_x, m_y, fillPortion.x(), fillPortion.y(),
241485445e9a624fe92ca04a1d0e92c1f71aaf8cd8fTeng-Hui Zhu              fillPortion.maxX(), fillPortion.maxY());
24232ce41e0241790f20e63cafea4d3c1db87423eecChris Craik
2433efc67e0caf0b63fe0350d6896d2cbc08661f5d7Teng-Hui Zhu    m_frontTexture->drawGL(isLayerTile(), rect, opacity, transform,
24432ce41e0241790f20e63cafea4d3c1db87423eecChris Craik                           forceBlending, usePointSampling, fillPortion);
245afe34397d6d4655c908f0995e760772980722da3Teng-Hui Zhu    return true;
246a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard}
247a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard
248594c6b805969c2673c84d1d1d1a3556ce376ac7aChris Craikbool Tile::isTileReady()
249a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard{
2508ad3ab0e47f0d5039e89c1873c178f538ec1b0dfChris Craik    // Return true if the tile's most recently drawn texture is up to date
2518ad3ab0e47f0d5039e89c1873c178f538ec1b0dfChris Craik    android::AutoMutex lock(m_atomicSync);
252594c6b805969c2673c84d1d1d1a3556ce376ac7aChris Craik    TileTexture * texture = (m_state == ReadyToSwap) ? m_backTexture : m_frontTexture;
2538ad3ab0e47f0d5039e89c1873c178f538ec1b0dfChris Craik
2548ad3ab0e47f0d5039e89c1873c178f538ec1b0dfChris Craik    if (!texture)
255a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard        return false;
2568ad3ab0e47f0d5039e89c1873c178f538ec1b0dfChris Craik
2578ad3ab0e47f0d5039e89c1873c178f538ec1b0dfChris Craik    if (texture->owner() != this)
258a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard        return false;
259a1e806ed3b2d9e2727d08cc2a3958fce501f6f33Derek Sollenberger
26067e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard    if (m_dirty)
26167e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard        return false;
26267e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard
263f6a40880028cf495025747229c627f42e25acc66Chris Craik    if (m_state != ReadyToSwap && m_state != UpToDate)
264f6a40880028cf495025747229c627f42e25acc66Chris Craik        return false;
265f6a40880028cf495025747229c627f42e25acc66Chris Craik
266f8f42bbda64a56cfd5ab48a274020d4efc9a5594Chris Craik    return true;
267a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard}
268a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard
269594c6b805969c2673c84d1d1d1a3556ce376ac7aChris Craikbool Tile::intersectWithRect(int x, int y, int tileWidth, int tileHeight,
270594c6b805969c2673c84d1d1d1a3556ce376ac7aChris Craik                             float scale, const SkRect& dirtyRect,
271594c6b805969c2673c84d1d1d1a3556ce376ac7aChris Craik                             SkRect& realTileRect)
272fa807bd31774157959640810e564fbe64338e8e3Nicolas Roard{
273fa807bd31774157959640810e564fbe64338e8e3Nicolas Roard    // compute the rect to corresponds to pixels
274fa807bd31774157959640810e564fbe64338e8e3Nicolas Roard    realTileRect.fLeft = x * tileWidth;
275fa807bd31774157959640810e564fbe64338e8e3Nicolas Roard    realTileRect.fTop = y * tileHeight;
276fa807bd31774157959640810e564fbe64338e8e3Nicolas Roard    realTileRect.fRight = realTileRect.fLeft + tileWidth;
277fa807bd31774157959640810e564fbe64338e8e3Nicolas Roard    realTileRect.fBottom = realTileRect.fTop + tileHeight;
278fa807bd31774157959640810e564fbe64338e8e3Nicolas Roard
279fa807bd31774157959640810e564fbe64338e8e3Nicolas Roard    // scale the dirtyRect for intersect computation.
280fa807bd31774157959640810e564fbe64338e8e3Nicolas Roard    SkRect realDirtyRect = SkRect::MakeWH(dirtyRect.width() * scale,
281fa807bd31774157959640810e564fbe64338e8e3Nicolas Roard                                          dirtyRect.height() * scale);
282fa807bd31774157959640810e564fbe64338e8e3Nicolas Roard    realDirtyRect.offset(dirtyRect.fLeft * scale, dirtyRect.fTop * scale);
283fa807bd31774157959640810e564fbe64338e8e3Nicolas Roard
284fa807bd31774157959640810e564fbe64338e8e3Nicolas Roard    if (!realTileRect.intersect(realDirtyRect))
285fa807bd31774157959640810e564fbe64338e8e3Nicolas Roard        return false;
286fa807bd31774157959640810e564fbe64338e8e3Nicolas Roard    return true;
287fa807bd31774157959640810e564fbe64338e8e3Nicolas Roard}
288fa807bd31774157959640810e564fbe64338e8e3Nicolas Roard
289594c6b805969c2673c84d1d1d1a3556ce376ac7aChris Craikbool Tile::isTileVisible(const IntRect& viewTileBounds)
290e48d27773894f36d85e5c2e2052ab90d502e1c72Chris Craik{
291e48d27773894f36d85e5c2e2052ab90d502e1c72Chris Craik    return (m_x >= viewTileBounds.x()
292e48d27773894f36d85e5c2e2052ab90d502e1c72Chris Craik            && m_x < viewTileBounds.x() + viewTileBounds.width()
293e48d27773894f36d85e5c2e2052ab90d502e1c72Chris Craik            && m_y >= viewTileBounds.y()
294e48d27773894f36d85e5c2e2052ab90d502e1c72Chris Craik            && m_y < viewTileBounds.y() + viewTileBounds.height());
295e48d27773894f36d85e5c2e2052ab90d502e1c72Chris Craik}
296e48d27773894f36d85e5c2e2052ab90d502e1c72Chris Craik
2973a7a2aa023d51b1806d4063ab0ea5ef7d488556fNicolas Roard// This is called from the texture generation thread
298594c6b805969c2673c84d1d1d1a3556ce376ac7aChris Craikvoid Tile::paintBitmap(TilePainter* painter)
299a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard{
300a1e806ed3b2d9e2727d08cc2a3958fce501f6f33Derek Sollenberger    // We acquire the values below atomically. This ensures that we are reading
301a1e806ed3b2d9e2727d08cc2a3958fce501f6f33Derek Sollenberger    // values correctly across cores. Further, once we have these values they
302a1e806ed3b2d9e2727d08cc2a3958fce501f6f33Derek Sollenberger    // can be updated by other threads without consequence.
303a1e806ed3b2d9e2727d08cc2a3958fce501f6f33Derek Sollenberger    m_atomicSync.lock();
304a1e806ed3b2d9e2727d08cc2a3958fce501f6f33Derek Sollenberger    bool dirty = m_dirty;
305594c6b805969c2673c84d1d1d1a3556ce376ac7aChris Craik    TileTexture* texture = m_backTexture;
30662ee9670dd9beeb9a8f21d8737250c081382e2f5Teng-Hui Zhu    SkRegion dirtyArea = m_dirtyArea;
3073a7a2aa023d51b1806d4063ab0ea5ef7d488556fNicolas Roard    float scale = m_scale;
308be61abb47b98988ca94bd839a1e17c3267365dc9Nicolas Roard    const int x = m_x;
309be61abb47b98988ca94bd839a1e17c3267365dc9Nicolas Roard    const int y = m_y;
310cf1ae53e7b2853d1148ecd784379f12dffda9d43Nicolas Roard
3113c131605fca8e29a88fdc4923d86bdc3f40adb2bNicolas Roard    if (!dirty || !texture) {
3123c131605fca8e29a88fdc4923d86bdc3f40adb2bNicolas Roard        m_atomicSync.unlock();
31375394f5ee0aac2337cdff1597b4e686e22c52833Nicolas Roard        return;
3143c131605fca8e29a88fdc4923d86bdc3f40adb2bNicolas Roard    }
315f6a40880028cf495025747229c627f42e25acc66Chris Craik    if (m_state != Unpainted) {
316d487c56b47c747d3e331ee1892e4c0473363afd2Chris Craik        ALOGV("Warning: started painting tile %p, but was at state %d, ft %p bt %p",
317f6a40880028cf495025747229c627f42e25acc66Chris Craik              this, m_state, m_frontTexture, m_backTexture);
318f6a40880028cf495025747229c627f42e25acc66Chris Craik    }
319f6a40880028cf495025747229c627f42e25acc66Chris Craik    m_state = PaintingStarted;
32062ee9670dd9beeb9a8f21d8737250c081382e2f5Teng-Hui Zhu    TextureInfo* textureInfo = texture->getTextureInfo();
3213c131605fca8e29a88fdc4923d86bdc3f40adb2bNicolas Roard    m_atomicSync.unlock();
322a52793c453c1512d0a18d4ae3108a975f998ae45Derek Sollenberger
323a1e806ed3b2d9e2727d08cc2a3958fce501f6f33Derek Sollenberger    // at this point we can safely check the ownership (if the texture got
324594c6b805969c2673c84d1d1d1a3556ce376ac7aChris Craik    // transferred to another Tile under us)
3258ad3ab0e47f0d5039e89c1873c178f538ec1b0dfChris Craik    if (texture->owner() != this) {
32675394f5ee0aac2337cdff1597b4e686e22c52833Nicolas Roard        return;
327a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard    }
328a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard
329c7e578330aece3c556ef205365c24676687223e2Derek Sollenberger    // swap out the renderer if necessary
330c7e578330aece3c556ef205365c24676687223e2Derek Sollenberger    BaseRenderer::swapRendererIfNeeded(m_renderer);
331232d0b3572d13d9b4fb1211d9d56252a1ede3ed6Derek Sollenberger    // setup the common renderInfo fields;
332232d0b3572d13d9b4fb1211d9d56252a1ede3ed6Derek Sollenberger    TileRenderInfo renderInfo;
333232d0b3572d13d9b4fb1211d9d56252a1ede3ed6Derek Sollenberger    renderInfo.x = x;
334232d0b3572d13d9b4fb1211d9d56252a1ede3ed6Derek Sollenberger    renderInfo.y = y;
335232d0b3572d13d9b4fb1211d9d56252a1ede3ed6Derek Sollenberger    renderInfo.scale = scale;
336232d0b3572d13d9b4fb1211d9d56252a1ede3ed6Derek Sollenberger    renderInfo.tileSize = texture->getSize();
3373c131605fca8e29a88fdc4923d86bdc3f40adb2bNicolas Roard    renderInfo.tilePainter = painter;
3383c131605fca8e29a88fdc4923d86bdc3f40adb2bNicolas Roard    renderInfo.baseTile = this;
339232d0b3572d13d9b4fb1211d9d56252a1ede3ed6Derek Sollenberger    renderInfo.textureInfo = textureInfo;
340232d0b3572d13d9b4fb1211d9d56252a1ede3ed6Derek Sollenberger
341232d0b3572d13d9b4fb1211d9d56252a1ede3ed6Derek Sollenberger    const float tileWidth = renderInfo.tileSize.width();
342232d0b3572d13d9b4fb1211d9d56252a1ede3ed6Derek Sollenberger    const float tileHeight = renderInfo.tileSize.height();
343232d0b3572d13d9b4fb1211d9d56252a1ede3ed6Derek Sollenberger
344e859a34171f2a36877d95197d118d962078f8aa0John Reck    m_renderer->renderTiledContent(renderInfo);
345fca6a67b130c1f97d366460af412ec6e6de14834Derek Sollenberger
34667e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard    m_atomicSync.lock();
3477c554a61cb935660cdc86905d040c781b490150fTeng-Hui Zhu
3488ad3ab0e47f0d5039e89c1873c178f538ec1b0dfChris Craik    if (texture == m_backTexture) {
3495ba4a087b9212ca9ae083f015637f417199d85ccJohn Reck        // set the fullrepaint flags
35062ee9670dd9beeb9a8f21d8737250c081382e2f5Teng-Hui Zhu        m_fullRepaint = false;
35167e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard
3525ba4a087b9212ca9ae083f015637f417199d85ccJohn Reck        // The various checks to see if we are still dirty...
35367e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard
3545ba4a087b9212ca9ae083f015637f417199d85ccJohn Reck        m_dirty = false;
35567e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard
3565ba4a087b9212ca9ae083f015637f417199d85ccJohn Reck        if (m_scale != scale)
3575ba4a087b9212ca9ae083f015637f417199d85ccJohn Reck            m_dirty = true;
35867e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard
359e859a34171f2a36877d95197d118d962078f8aa0John Reck        m_dirtyArea.setEmpty();
360c15781f45f0d19a925be7fd73bd10c318562db70Nicolas Roard
361d487c56b47c747d3e331ee1892e4c0473363afd2Chris Craik        ALOGV("painted tile %p (%d, %d), texture %p, dirty=%d", this, x, y, texture, m_dirty);
362e733717c7b60d2ccfee9c47af4659ffb8e70dd73Chris Craik
363f6a40880028cf495025747229c627f42e25acc66Chris Craik        validatePaint();
364f6a40880028cf495025747229c627f42e25acc66Chris Craik    } else {
365d487c56b47c747d3e331ee1892e4c0473363afd2Chris Craik        ALOGV("tile %p no longer owns texture %p, m_state %d. ft %p bt %p",
366d487c56b47c747d3e331ee1892e4c0473363afd2Chris Craik              this, texture, m_state, m_frontTexture, m_backTexture);
3675ba4a087b9212ca9ae083f015637f417199d85ccJohn Reck    }
36867e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard
36967e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard    m_atomicSync.unlock();
37067e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard}
37167e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard
372594c6b805969c2673c84d1d1d1a3556ce376ac7aChris Craikvoid Tile::discardTextures() {
3738ad3ab0e47f0d5039e89c1873c178f538ec1b0dfChris Craik    android::AutoMutex lock(m_atomicSync);
374d487c56b47c747d3e331ee1892e4c0473363afd2Chris Craik    ALOGV("%p discarding bt %p, ft %p",
375d487c56b47c747d3e331ee1892e4c0473363afd2Chris Craik          this, m_backTexture, m_frontTexture);
3768ad3ab0e47f0d5039e89c1873c178f538ec1b0dfChris Craik    if (m_frontTexture) {
3778ad3ab0e47f0d5039e89c1873c178f538ec1b0dfChris Craik        m_frontTexture->release(this);
3788ad3ab0e47f0d5039e89c1873c178f538ec1b0dfChris Craik        m_frontTexture = 0;
3798ad3ab0e47f0d5039e89c1873c178f538ec1b0dfChris Craik    }
3808ad3ab0e47f0d5039e89c1873c178f538ec1b0dfChris Craik    if (m_backTexture) {
3818ad3ab0e47f0d5039e89c1873c178f538ec1b0dfChris Craik        m_backTexture->release(this);
3828ad3ab0e47f0d5039e89c1873c178f538ec1b0dfChris Craik        m_backTexture = 0;
3838ad3ab0e47f0d5039e89c1873c178f538ec1b0dfChris Craik    }
38462ee9670dd9beeb9a8f21d8737250c081382e2f5Teng-Hui Zhu    m_dirtyArea.setEmpty();
38562ee9670dd9beeb9a8f21d8737250c081382e2f5Teng-Hui Zhu    m_fullRepaint = true;
38662ee9670dd9beeb9a8f21d8737250c081382e2f5Teng-Hui Zhu
3878ad3ab0e47f0d5039e89c1873c178f538ec1b0dfChris Craik    m_dirty = true;
388f6a40880028cf495025747229c627f42e25acc66Chris Craik    m_state = Unpainted;
3898ad3ab0e47f0d5039e89c1873c178f538ec1b0dfChris Craik}
3908ad3ab0e47f0d5039e89c1873c178f538ec1b0dfChris Craik
391594c6b805969c2673c84d1d1d1a3556ce376ac7aChris Craikvoid Tile::discardBackTexture() {
3923a819aac70dd26f675644f6a35b13be5fb3de2f1Chris Craik    android::AutoMutex lock(m_atomicSync);
3933a819aac70dd26f675644f6a35b13be5fb3de2f1Chris Craik    if (m_backTexture) {
3943a819aac70dd26f675644f6a35b13be5fb3de2f1Chris Craik        m_backTexture->release(this);
3953a819aac70dd26f675644f6a35b13be5fb3de2f1Chris Craik        m_backTexture = 0;
3963a819aac70dd26f675644f6a35b13be5fb3de2f1Chris Craik    }
3973ef9d5cc655b8274860b8d15441201d3e621baf5Chris Craik    m_state = Unpainted;
3983ef9d5cc655b8274860b8d15441201d3e621baf5Chris Craik    m_dirty = true;
3993a819aac70dd26f675644f6a35b13be5fb3de2f1Chris Craik}
4003a819aac70dd26f675644f6a35b13be5fb3de2f1Chris Craik
401594c6b805969c2673c84d1d1d1a3556ce376ac7aChris Craikbool Tile::swapTexturesIfNeeded() {
4028ad3ab0e47f0d5039e89c1873c178f538ec1b0dfChris Craik    android::AutoMutex lock(m_atomicSync);
403f6a40880028cf495025747229c627f42e25acc66Chris Craik    if (m_state == ReadyToSwap) {
4048ad3ab0e47f0d5039e89c1873c178f538ec1b0dfChris Craik        // discard old texture and swap the new one in its place
4058ad3ab0e47f0d5039e89c1873c178f538ec1b0dfChris Craik        if (m_frontTexture)
4068ad3ab0e47f0d5039e89c1873c178f538ec1b0dfChris Craik            m_frontTexture->release(this);
4078ad3ab0e47f0d5039e89c1873c178f538ec1b0dfChris Craik
4088ad3ab0e47f0d5039e89c1873c178f538ec1b0dfChris Craik        m_frontTexture = m_backTexture;
4098ad3ab0e47f0d5039e89c1873c178f538ec1b0dfChris Craik        m_backTexture = 0;
410f6a40880028cf495025747229c627f42e25acc66Chris Craik        m_state = UpToDate;
411d487c56b47c747d3e331ee1892e4c0473363afd2Chris Craik        ALOGV("display texture for %p at %d, %d front is now %p, back is %p",
412d487c56b47c747d3e331ee1892e4c0473363afd2Chris Craik              this, m_x, m_y, m_frontTexture, m_backTexture);
413f6a40880028cf495025747229c627f42e25acc66Chris Craik
4148ad3ab0e47f0d5039e89c1873c178f538ec1b0dfChris Craik        return true;
4158ad3ab0e47f0d5039e89c1873c178f538ec1b0dfChris Craik    }
4168ad3ab0e47f0d5039e89c1873c178f538ec1b0dfChris Craik    return false;
4178ad3ab0e47f0d5039e89c1873c178f538ec1b0dfChris Craik}
4188ad3ab0e47f0d5039e89c1873c178f538ec1b0dfChris Craik
419594c6b805969c2673c84d1d1d1a3556ce376ac7aChris Craikvoid Tile::backTextureTransfer() {
420f6a40880028cf495025747229c627f42e25acc66Chris Craik    android::AutoMutex lock(m_atomicSync);
421f6a40880028cf495025747229c627f42e25acc66Chris Craik    if (m_state == PaintingStarted)
422f6a40880028cf495025747229c627f42e25acc66Chris Craik        m_state = TransferredUnvalidated;
423f6a40880028cf495025747229c627f42e25acc66Chris Craik    else if (m_state == ValidatedUntransferred)
424f6a40880028cf495025747229c627f42e25acc66Chris Craik        m_state = ReadyToSwap;
425f6a40880028cf495025747229c627f42e25acc66Chris Craik    else {
426f6a40880028cf495025747229c627f42e25acc66Chris Craik        // shouldn't have transferred a tile in any other state, log
427d487c56b47c747d3e331ee1892e4c0473363afd2Chris Craik        ALOGV("Note: transferred tile %p at %d %d, state wasn't paintingstarted or validated: %d",
428d487c56b47c747d3e331ee1892e4c0473363afd2Chris Craik              this, m_x, m_y, m_state);
429f6a40880028cf495025747229c627f42e25acc66Chris Craik    }
430f6a40880028cf495025747229c627f42e25acc66Chris Craik}
431f6a40880028cf495025747229c627f42e25acc66Chris Craik
432594c6b805969c2673c84d1d1d1a3556ce376ac7aChris Craikvoid Tile::backTextureTransferFail() {
433530c83c6351e05a6939ad0b5bc291da073e77b5bChris Craik    // transfer failed for some reason, mark dirty so it will (repaint and) be
434530c83c6351e05a6939ad0b5bc291da073e77b5bChris Craik    // retransferred.
435530c83c6351e05a6939ad0b5bc291da073e77b5bChris Craik    android::AutoMutex lock(m_atomicSync);
436530c83c6351e05a6939ad0b5bc291da073e77b5bChris Craik    m_state = Unpainted;
4373ef9d5cc655b8274860b8d15441201d3e621baf5Chris Craik    m_dirty = true;
438530c83c6351e05a6939ad0b5bc291da073e77b5bChris Craik    // whether validatePaint is called before or after, it won't do anything
439530c83c6351e05a6939ad0b5bc291da073e77b5bChris Craik}
440530c83c6351e05a6939ad0b5bc291da073e77b5bChris Craik
441e859a34171f2a36877d95197d118d962078f8aa0John Reckvoid Tile::onBlitUpdate()
442e859a34171f2a36877d95197d118d962078f8aa0John Reck{
443e859a34171f2a36877d95197d118d962078f8aa0John Reck    // The front texture was directly updated with a blit, so mark this as clean
444e859a34171f2a36877d95197d118d962078f8aa0John Reck    android::AutoMutex lock(m_atomicSync);
445e859a34171f2a36877d95197d118d962078f8aa0John Reck    m_dirty = false;
446e859a34171f2a36877d95197d118d962078f8aa0John Reck    m_dirtyArea.setEmpty();
447e859a34171f2a36877d95197d118d962078f8aa0John Reck    m_state = Tile::UpToDate;
448e859a34171f2a36877d95197d118d962078f8aa0John Reck}
449e859a34171f2a36877d95197d118d962078f8aa0John Reck
450594c6b805969c2673c84d1d1d1a3556ce376ac7aChris Craikvoid Tile::validatePaint() {
451f6a40880028cf495025747229c627f42e25acc66Chris Craik    // ONLY CALL while m_atomicSync is locked (at the end of paintBitmap())
452f6a40880028cf495025747229c627f42e25acc66Chris Craik
453f6a40880028cf495025747229c627f42e25acc66Chris Craik    if (!m_dirty) {
454f6a40880028cf495025747229c627f42e25acc66Chris Craik        // since after the paint, the tile isn't dirty, 'validate' it - this
455f6a40880028cf495025747229c627f42e25acc66Chris Craik        // may happed before or after the transfer queue operation. Only
456f6a40880028cf495025747229c627f42e25acc66Chris Craik        // when both have happened, mark as 'ReadyToSwap'
457f6a40880028cf495025747229c627f42e25acc66Chris Craik        if (m_state == PaintingStarted)
458f6a40880028cf495025747229c627f42e25acc66Chris Craik            m_state = ValidatedUntransferred;
459309ae897e0ad3493fc6acd97a39c631f90580d57Teng-Hui Zhu        else if (m_state == TransferredUnvalidated) {
4608abedfb0681eb18f62137fffde000a9dbb75c4d2Teng-Hui Zhu            // When the backTexture has been marked pureColor, we will skip the
4618abedfb0681eb18f62137fffde000a9dbb75c4d2Teng-Hui Zhu            // transfer and marked as ReadyToSwap, in this case, we don't want
4628abedfb0681eb18f62137fffde000a9dbb75c4d2Teng-Hui Zhu            // to reset m_dirty bit to true.
463f6a40880028cf495025747229c627f42e25acc66Chris Craik            m_state = ReadyToSwap;
4648abedfb0681eb18f62137fffde000a9dbb75c4d2Teng-Hui Zhu        } else {
465d487c56b47c747d3e331ee1892e4c0473363afd2Chris Craik            ALOGV("Note: validated tile %p at %d %d, state wasn't paintingstarted or transferred %d",
466f6a40880028cf495025747229c627f42e25acc66Chris Craik                  this, m_x, m_y, m_state);
4673ef9d5cc655b8274860b8d15441201d3e621baf5Chris Craik            // failed transferring, in which case mark dirty (since
4683ef9d5cc655b8274860b8d15441201d3e621baf5Chris Craik            // paintBitmap() may have cleared m_dirty)
4693ef9d5cc655b8274860b8d15441201d3e621baf5Chris Craik            m_dirty = true;
470f6a40880028cf495025747229c627f42e25acc66Chris Craik        }
471f6a40880028cf495025747229c627f42e25acc66Chris Craik    } else {
472d487c56b47c747d3e331ee1892e4c0473363afd2Chris Craik        ALOGV("Note: paint was unsuccessful.");
473f6a40880028cf495025747229c627f42e25acc66Chris Craik        m_state = Unpainted;
474f6a40880028cf495025747229c627f42e25acc66Chris Craik    }
475f6a40880028cf495025747229c627f42e25acc66Chris Craik
476f6a40880028cf495025747229c627f42e25acc66Chris Craik}
477f6a40880028cf495025747229c627f42e25acc66Chris Craik
478a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard} // namespace WebCore
479a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard
480a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard#endif // USE(ACCELERATED_COMPOSITING)
481