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