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