Tile.cpp revision 3c131605fca8e29a88fdc4923d86bdc3f40adb2b
1a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard/* 2a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard * Copyright 2010, The Android Open Source Project 3a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard * 4a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard * Redistribution and use in source and binary forms, with or without 5a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard * modification, are permitted provided that the following conditions 6a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard * are met: 7a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard * * Redistributions of source code must retain the above copyright 8a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard * notice, this list of conditions and the following disclaimer. 9a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard * * Redistributions in binary form must reproduce the above copyright 10a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard * notice, this list of conditions and the following disclaimer in the 11a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard * documentation and/or other materials provided with the distribution. 12a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard * 13a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY 14a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 15a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 16a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR 17a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 18a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 19a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 20a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 21a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 22a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 23a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 24a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard */ 25a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard 26a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard#include "config.h" 27a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard#include "BaseTile.h" 28a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard 29a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard#if USE(ACCELERATED_COMPOSITING) 30a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard 31a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard#include "GLUtils.h" 32f85cf343a02e85633e6b68c7f5db3c033b780607Teng-Hui Zhu#include "RasterRenderer.h" 33fca6a67b130c1f97d366460af412ec6e6de14834Derek Sollenberger#include "TextureInfo.h" 34a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard#include "TilesManager.h" 35a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard 363a7a2aa023d51b1806d4063ab0ea5ef7d488556fNicolas Roard#include <cutils/atomic.h> 37a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard 38a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard#ifdef DEBUG 39a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard 40a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard#include <cutils/log.h> 41a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard#include <wtf/CurrentTime.h> 42fca6a67b130c1f97d366460af412ec6e6de14834Derek Sollenberger#include <wtf/text/CString.h> 43a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard 44a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard#undef XLOG 45a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard#define XLOG(...) android_printLog(ANDROID_LOG_DEBUG, "BaseTile", __VA_ARGS__) 46a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard 47a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard#else 48a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard 49a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard#undef XLOG 50a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard#define XLOG(...) 51a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard 52a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard#endif // DEBUG 53a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard 54a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roardnamespace WebCore { 55a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard 563c131605fca8e29a88fdc4923d86bdc3f40adb2bNicolas RoardBaseTile::BaseTile(bool isLayerTile) 5772a76070d36a51926c224d230f1503c46f30da60Chris Craik : m_glWebViewState(0) 583c131605fca8e29a88fdc4923d86bdc3f40adb2bNicolas Roard , m_painter(0) 59ffc715a2e6382fe9e331557c35fafc426507b8f5Derek Sollenberger , m_x(-1) 60ffc715a2e6382fe9e331557c35fafc426507b8f5Derek Sollenberger , m_y(-1) 613c131605fca8e29a88fdc4923d86bdc3f40adb2bNicolas Roard , m_page(0) 623c131605fca8e29a88fdc4923d86bdc3f40adb2bNicolas Roard , m_usedLevel(-1) 63a52793c453c1512d0a18d4ae3108a975f998ae45Derek Sollenberger , m_texture(0) 64a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard , m_scale(1) 65a1e806ed3b2d9e2727d08cc2a3958fce501f6f33Derek Sollenberger , m_dirty(true) 66417789b7c56928a5fcb610583346d07ffa380900John Reck , m_repaintPending(false) 67c9ab9bf00ba3ce8289f917675f81b40e4438a864Teng-Hui Zhu , m_usable(true) 68a1e806ed3b2d9e2727d08cc2a3958fce501f6f33Derek Sollenberger , m_lastDirtyPicture(0) 69a1e806ed3b2d9e2727d08cc2a3958fce501f6f33Derek Sollenberger , m_lastPaintedPicture(0) 703c131605fca8e29a88fdc4923d86bdc3f40adb2bNicolas Roard , m_isLayerTile(isLayerTile) 71a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard{ 72a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard#ifdef DEBUG_COUNT 73da44133fe92ec11fa6b904c498e7e5cd23a43cbfNicolas Roard ClassTracker::instance()->increment("BaseTile"); 74a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard#endif 75f85cf343a02e85633e6b68c7f5db3c033b780607Teng-Hui Zhu m_currentDirtyAreaIndex = 0; 768dfdf8aa25b250ed3b8c0a443cf1cbaf9bd12c5bDerek Sollenberger m_renderer = new RasterRenderer(); 77f85cf343a02e85633e6b68c7f5db3c033b780607Teng-Hui Zhu 78f85cf343a02e85633e6b68c7f5db3c033b780607Teng-Hui Zhu // For EglImage Mode, the internal buffer should be 2. 79f85cf343a02e85633e6b68c7f5db3c033b780607Teng-Hui Zhu // And for Async Surface Texture mode, this is 3. 80f85cf343a02e85633e6b68c7f5db3c033b780607Teng-Hui Zhu if (TilesManager::instance()->getSharedTextureMode() == EglImageMode) 81f85cf343a02e85633e6b68c7f5db3c033b780607Teng-Hui Zhu m_maxBufferNumber = 2; 82f85cf343a02e85633e6b68c7f5db3c033b780607Teng-Hui Zhu else 83f85cf343a02e85633e6b68c7f5db3c033b780607Teng-Hui Zhu m_maxBufferNumber = 3; 84f85cf343a02e85633e6b68c7f5db3c033b780607Teng-Hui Zhu 85f85cf343a02e85633e6b68c7f5db3c033b780607Teng-Hui Zhu m_dirtyArea = new SkRegion[m_maxBufferNumber]; 86f85cf343a02e85633e6b68c7f5db3c033b780607Teng-Hui Zhu m_fullRepaint = new bool[m_maxBufferNumber]; 87f85cf343a02e85633e6b68c7f5db3c033b780607Teng-Hui Zhu for (int i = 0; i < m_maxBufferNumber; i++) 88f85cf343a02e85633e6b68c7f5db3c033b780607Teng-Hui Zhu m_fullRepaint[i] = true; 89a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard} 90a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard 91a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas RoardBaseTile::~BaseTile() 92a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard{ 93a1e806ed3b2d9e2727d08cc2a3958fce501f6f33Derek Sollenberger setUsedLevel(-1); 94c9ab9bf00ba3ce8289f917675f81b40e4438a864Teng-Hui Zhu if (m_texture) 9590455eb70cca2df540942299b35bb3bd8261cb0bDerek Sollenberger m_texture->release(this); 9690455eb70cca2df540942299b35bb3bd8261cb0bDerek Sollenberger 978dfdf8aa25b250ed3b8c0a443cf1cbaf9bd12c5bDerek Sollenberger delete m_renderer; 98f85cf343a02e85633e6b68c7f5db3c033b780607Teng-Hui Zhu delete[] m_dirtyArea; 99f85cf343a02e85633e6b68c7f5db3c033b780607Teng-Hui Zhu delete[] m_fullRepaint; 1008dfdf8aa25b250ed3b8c0a443cf1cbaf9bd12c5bDerek Sollenberger 101a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard#ifdef DEBUG_COUNT 102da44133fe92ec11fa6b904c498e7e5cd23a43cbfNicolas Roard ClassTracker::instance()->decrement("BaseTile"); 103a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard#endif 104a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard} 105a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard 1063a7a2aa023d51b1806d4063ab0ea5ef7d488556fNicolas Roard// All the following functions must be called from the main GL thread. 1073a7a2aa023d51b1806d4063ab0ea5ef7d488556fNicolas Roard 1083c131605fca8e29a88fdc4923d86bdc3f40adb2bNicolas Roardvoid BaseTile::setContents(TilePainter* painter, int x, int y, float scale) 109ffc715a2e6382fe9e331557c35fafc426507b8f5Derek Sollenberger{ 110ffc715a2e6382fe9e331557c35fafc426507b8f5Derek Sollenberger android::AutoMutex lock(m_atomicSync); 1113c131605fca8e29a88fdc4923d86bdc3f40adb2bNicolas Roard if ((m_painter != painter) 1123c131605fca8e29a88fdc4923d86bdc3f40adb2bNicolas Roard || (m_x != x) 1133c131605fca8e29a88fdc4923d86bdc3f40adb2bNicolas Roard || (m_y != y) 1143c131605fca8e29a88fdc4923d86bdc3f40adb2bNicolas Roard || (m_scale != scale)) 1153c131605fca8e29a88fdc4923d86bdc3f40adb2bNicolas Roard fullInval(); 1163c131605fca8e29a88fdc4923d86bdc3f40adb2bNicolas Roard 1173c131605fca8e29a88fdc4923d86bdc3f40adb2bNicolas Roard m_painter = painter; 118ffc715a2e6382fe9e331557c35fafc426507b8f5Derek Sollenberger m_x = x; 119ffc715a2e6382fe9e331557c35fafc426507b8f5Derek Sollenberger m_y = y; 1203c131605fca8e29a88fdc4923d86bdc3f40adb2bNicolas Roard m_scale = scale; 121ffc715a2e6382fe9e331557c35fafc426507b8f5Derek Sollenberger} 122ffc715a2e6382fe9e331557c35fafc426507b8f5Derek Sollenberger 123a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roardvoid BaseTile::reserveTexture() 124a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard{ 125ec182c75fb35d955a9115fbaf516f648a48ed0e1Derek Sollenberger BaseTileTexture* texture = TilesManager::instance()->getAvailableTexture(this); 126a1e806ed3b2d9e2727d08cc2a3958fce501f6f33Derek Sollenberger 127a1e806ed3b2d9e2727d08cc2a3958fce501f6f33Derek Sollenberger android::AutoMutex lock(m_atomicSync); 1285ba4a087b9212ca9ae083f015637f417199d85ccJohn Reck if (texture && m_texture != texture) { 129a1e806ed3b2d9e2727d08cc2a3958fce501f6f33Derek Sollenberger m_lastPaintedPicture = 0; 13067e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard fullInval(); 131a1e806ed3b2d9e2727d08cc2a3958fce501f6f33Derek Sollenberger } 1323c131605fca8e29a88fdc4923d86bdc3f40adb2bNicolas Roard m_texture = texture; 1333c131605fca8e29a88fdc4923d86bdc3f40adb2bNicolas Roard if (m_texture) 1343c131605fca8e29a88fdc4923d86bdc3f40adb2bNicolas Roard m_texture->setUsedLevel(m_usedLevel); 135a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard} 136a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard 137ec182c75fb35d955a9115fbaf516f648a48ed0e1Derek Sollenbergerbool BaseTile::removeTexture(BaseTileTexture* texture) 138a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard{ 139245e0cdd9ea80915059080a2bedbb9ebb5cc646cNicolas Roard XLOG("%x removeTexture res: %x... page %x", this, m_texture, m_page); 1403a7a2aa023d51b1806d4063ab0ea5ef7d488556fNicolas Roard // We update atomically, so paintBitmap() can see the correct value 141a1e806ed3b2d9e2727d08cc2a3958fce501f6f33Derek Sollenberger android::AutoMutex lock(m_atomicSync); 142fed0f3819356e8f1bdb6fd97c0265e2bfff1dacbNicolas Roard if (m_texture == texture) 143fed0f3819356e8f1bdb6fd97c0265e2bfff1dacbNicolas Roard m_texture = 0; 14481ec1fafcb2c1bc433ec34b6ae4ea78d1ea7d3a8Nicolas Roard return true; 1453a7a2aa023d51b1806d4063ab0ea5ef7d488556fNicolas Roard} 1463a7a2aa023d51b1806d4063ab0ea5ef7d488556fNicolas Roard 14767e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roardvoid BaseTile::fullInval() 14867e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard{ 149f85cf343a02e85633e6b68c7f5db3c033b780607Teng-Hui Zhu for (int i = 0; i < m_maxBufferNumber; i++) { 150f85cf343a02e85633e6b68c7f5db3c033b780607Teng-Hui Zhu m_dirtyArea[i].setEmpty(); 151f85cf343a02e85633e6b68c7f5db3c033b780607Teng-Hui Zhu m_fullRepaint[i] = true; 152f85cf343a02e85633e6b68c7f5db3c033b780607Teng-Hui Zhu } 15367e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard m_dirty = true; 15467e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard} 15567e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard 15667e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roardvoid BaseTile::markAsDirty(int unsigned pictureCount, 15767e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard const SkRegion& dirtyArea) 158a1e806ed3b2d9e2727d08cc2a3958fce501f6f33Derek Sollenberger{ 159a1e806ed3b2d9e2727d08cc2a3958fce501f6f33Derek Sollenberger android::AutoMutex lock(m_atomicSync); 160a1e806ed3b2d9e2727d08cc2a3958fce501f6f33Derek Sollenberger m_lastDirtyPicture = pictureCount; 161f85cf343a02e85633e6b68c7f5db3c033b780607Teng-Hui Zhu for (int i = 0; i < m_maxBufferNumber; i++) 162f85cf343a02e85633e6b68c7f5db3c033b780607Teng-Hui Zhu m_dirtyArea[i].op(dirtyArea, SkRegion::kUnion_Op); 16367e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard m_dirty = true; 164a1e806ed3b2d9e2727d08cc2a3958fce501f6f33Derek Sollenberger} 165a1e806ed3b2d9e2727d08cc2a3958fce501f6f33Derek Sollenberger 166c9ab9bf00ba3ce8289f917675f81b40e4438a864Teng-Hui Zhuvoid BaseTile::setUsable(bool usable) 167c9ab9bf00ba3ce8289f917675f81b40e4438a864Teng-Hui Zhu{ 168c9ab9bf00ba3ce8289f917675f81b40e4438a864Teng-Hui Zhu android::AutoMutex lock(m_atomicSync); 169c9ab9bf00ba3ce8289f917675f81b40e4438a864Teng-Hui Zhu m_usable = usable; 170c9ab9bf00ba3ce8289f917675f81b40e4438a864Teng-Hui Zhu} 171c9ab9bf00ba3ce8289f917675f81b40e4438a864Teng-Hui Zhu 172c9ab9bf00ba3ce8289f917675f81b40e4438a864Teng-Hui Zhu 173a1e806ed3b2d9e2727d08cc2a3958fce501f6f33Derek Sollenbergerbool BaseTile::isDirty() 174a1e806ed3b2d9e2727d08cc2a3958fce501f6f33Derek Sollenberger{ 175a1e806ed3b2d9e2727d08cc2a3958fce501f6f33Derek Sollenberger android::AutoMutex lock(m_atomicSync); 176a1e806ed3b2d9e2727d08cc2a3958fce501f6f33Derek Sollenberger return m_dirty; 177a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard} 178a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard 179417789b7c56928a5fcb610583346d07ffa380900John Reckbool BaseTile::isRepaintPending() 180417789b7c56928a5fcb610583346d07ffa380900John Reck{ 181417789b7c56928a5fcb610583346d07ffa380900John Reck android::AutoMutex lock(m_atomicSync); 182417789b7c56928a5fcb610583346d07ffa380900John Reck return m_repaintPending; 183417789b7c56928a5fcb610583346d07ffa380900John Reck} 184417789b7c56928a5fcb610583346d07ffa380900John Reck 185417789b7c56928a5fcb610583346d07ffa380900John Reckvoid BaseTile::setRepaintPending(bool pending) 186417789b7c56928a5fcb610583346d07ffa380900John Reck{ 187417789b7c56928a5fcb610583346d07ffa380900John Reck android::AutoMutex lock(m_atomicSync); 188417789b7c56928a5fcb610583346d07ffa380900John Reck m_repaintPending = pending; 189417789b7c56928a5fcb610583346d07ffa380900John Reck} 190417789b7c56928a5fcb610583346d07ffa380900John Reck 191a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roardvoid BaseTile::setUsedLevel(int usedLevel) 192a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard{ 193a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard if (m_texture) 194a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard m_texture->setUsedLevel(usedLevel); 1953c131605fca8e29a88fdc4923d86bdc3f40adb2bNicolas Roard m_usedLevel = usedLevel; 196a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard} 197a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard 198417789b7c56928a5fcb610583346d07ffa380900John Reckint BaseTile::usedLevel() 199417789b7c56928a5fcb610583346d07ffa380900John Reck{ 200417789b7c56928a5fcb610583346d07ffa380900John Reck if (m_texture) 201417789b7c56928a5fcb610583346d07ffa380900John Reck return m_texture->usedLevel(); 2023c131605fca8e29a88fdc4923d86bdc3f40adb2bNicolas Roard return m_usedLevel; 203417789b7c56928a5fcb610583346d07ffa380900John Reck} 204417789b7c56928a5fcb610583346d07ffa380900John Reck 2053c131605fca8e29a88fdc4923d86bdc3f40adb2bNicolas Roard 2061deed5ff76dad5d0783c0e07639338f1d6b08a67Nicolas Roardvoid BaseTile::draw(float transparency, SkRect& rect, float scale) 207a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard{ 2081deed5ff76dad5d0783c0e07639338f1d6b08a67Nicolas Roard if (m_x < 0 || m_y < 0 || m_scale != scale) 20967e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard return; 21067e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard 211a1e806ed3b2d9e2727d08cc2a3958fce501f6f33Derek Sollenberger // No need to mutex protect reads of m_texture as it is only written to by 212a1e806ed3b2d9e2727d08cc2a3958fce501f6f33Derek Sollenberger // the consumer thread. 213a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard if (!m_texture) { 214245e0cdd9ea80915059080a2bedbb9ebb5cc646cNicolas Roard XLOG("%x on page %x (%d, %d) trying to draw, but no m_texture!", this, m_page, x(), y()); 215a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard return; 216a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard } 217a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard 218c9ab9bf00ba3ce8289f917675f81b40e4438a864Teng-Hui Zhu // Early return if set to un-usable in purpose! 2190bdd7f2d73cad03535071e5de0ba3d2f5feb1b00Teng-Hui Zhu m_atomicSync.lock(); 2200bdd7f2d73cad03535071e5de0ba3d2f5feb1b00Teng-Hui Zhu bool usable = m_usable; 2210bdd7f2d73cad03535071e5de0ba3d2f5feb1b00Teng-Hui Zhu bool isTexturePainted = m_lastPaintedPicture; 2220bdd7f2d73cad03535071e5de0ba3d2f5feb1b00Teng-Hui Zhu m_atomicSync.unlock(); 22344009dc8813df9eb0815bf581740a7c365f3b515Teng-Hui Zhu if (!usable) { 22444009dc8813df9eb0815bf581740a7c365f3b515Teng-Hui Zhu XLOG("early return at BaseTile::draw b/c tile set to unusable !"); 22544009dc8813df9eb0815bf581740a7c365f3b515Teng-Hui Zhu return; 22644009dc8813df9eb0815bf581740a7c365f3b515Teng-Hui Zhu } 22744009dc8813df9eb0815bf581740a7c365f3b515Teng-Hui Zhu if (!isTexturePainted) { 22844009dc8813df9eb0815bf581740a7c365f3b515Teng-Hui Zhu XLOG("early return at BaseTile::draw b/c tile is not painted !"); 229c9ab9bf00ba3ce8289f917675f81b40e4438a864Teng-Hui Zhu return; 230c9ab9bf00ba3ce8289f917675f81b40e4438a864Teng-Hui Zhu } 231c9ab9bf00ba3ce8289f917675f81b40e4438a864Teng-Hui Zhu 232a52793c453c1512d0a18d4ae3108a975f998ae45Derek Sollenberger TextureInfo* textureInfo = m_texture->consumerLock(); 233a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard if (!textureInfo) { 234a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard XLOG("%x (%d, %d) trying to draw, but no textureInfo!", this, x(), y()); 235a52793c453c1512d0a18d4ae3108a975f998ae45Derek Sollenberger m_texture->consumerRelease(); 236a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard return; 237a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard } 238a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard 23967e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard if (m_texture->readyFor(this)) { 2403c131605fca8e29a88fdc4923d86bdc3f40adb2bNicolas Roard XLOG("draw tile %x : %d, %d, %.2f with texture %x", this, x(), y(), scale(), m_texture); 2413c131605fca8e29a88fdc4923d86bdc3f40adb2bNicolas Roard if (isLayerTile()) 2423c131605fca8e29a88fdc4923d86bdc3f40adb2bNicolas Roard TilesManager::instance()->shader()->drawLayerQuad(*m_painter->transform(), 2433c131605fca8e29a88fdc4923d86bdc3f40adb2bNicolas Roard rect, textureInfo->m_textureId, 2443c131605fca8e29a88fdc4923d86bdc3f40adb2bNicolas Roard transparency, true, 2453c131605fca8e29a88fdc4923d86bdc3f40adb2bNicolas Roard textureInfo->getTextureTarget()); 2463c131605fca8e29a88fdc4923d86bdc3f40adb2bNicolas Roard else 2473c131605fca8e29a88fdc4923d86bdc3f40adb2bNicolas Roard TilesManager::instance()->shader()->drawQuad(rect, textureInfo->m_textureId, 2483c131605fca8e29a88fdc4923d86bdc3f40adb2bNicolas Roard transparency, 2493c131605fca8e29a88fdc4923d86bdc3f40adb2bNicolas Roard textureInfo->getTextureTarget()); 25067e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard } 251a52793c453c1512d0a18d4ae3108a975f998ae45Derek Sollenberger m_texture->consumerRelease(); 252a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard} 253a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard 254a1e806ed3b2d9e2727d08cc2a3958fce501f6f33Derek Sollenbergerbool BaseTile::isTileReady() 255a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard{ 256a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard if (!m_texture) 257a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard return false; 258a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard if (m_texture->owner() != this) 259a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard return false; 260a1e806ed3b2d9e2727d08cc2a3958fce501f6f33Derek Sollenberger 261a1e806ed3b2d9e2727d08cc2a3958fce501f6f33Derek Sollenberger android::AutoMutex lock(m_atomicSync); 26267e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard if (m_dirty) 26367e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard return false; 26467e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard 26567e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard m_texture->consumerLock(); 26667e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard bool ready = m_texture->readyFor(this); 26767e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard m_texture->consumerRelease(); 26867e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard 26967e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard if (ready) 27067e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard return true; 27167e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard 27267e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard m_dirty = true; 27367e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard return false; 274a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard} 275a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard 2763a7a2aa023d51b1806d4063ab0ea5ef7d488556fNicolas Roard// This is called from the texture generation thread 27775394f5ee0aac2337cdff1597b4e686e22c52833Nicolas Roardvoid BaseTile::paintBitmap() 278a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard{ 279a1e806ed3b2d9e2727d08cc2a3958fce501f6f33Derek Sollenberger // We acquire the values below atomically. This ensures that we are reading 280a1e806ed3b2d9e2727d08cc2a3958fce501f6f33Derek Sollenberger // values correctly across cores. Further, once we have these values they 281a1e806ed3b2d9e2727d08cc2a3958fce501f6f33Derek Sollenberger // can be updated by other threads without consequence. 282a1e806ed3b2d9e2727d08cc2a3958fce501f6f33Derek Sollenberger m_atomicSync.lock(); 283a1e806ed3b2d9e2727d08cc2a3958fce501f6f33Derek Sollenberger bool dirty = m_dirty; 284ec182c75fb35d955a9115fbaf516f648a48ed0e1Derek Sollenberger BaseTileTexture* texture = m_texture; 285f85cf343a02e85633e6b68c7f5db3c033b780607Teng-Hui Zhu SkRegion dirtyArea = m_dirtyArea[m_currentDirtyAreaIndex]; 2863a7a2aa023d51b1806d4063ab0ea5ef7d488556fNicolas Roard float scale = m_scale; 287be61abb47b98988ca94bd839a1e17c3267365dc9Nicolas Roard const int x = m_x; 288be61abb47b98988ca94bd839a1e17c3267365dc9Nicolas Roard const int y = m_y; 2893c131605fca8e29a88fdc4923d86bdc3f40adb2bNicolas Roard TilePainter* painter = m_painter; 290cf1ae53e7b2853d1148ecd784379f12dffda9d43Nicolas Roard 2913c131605fca8e29a88fdc4923d86bdc3f40adb2bNicolas Roard if (!dirty || !texture) { 2923c131605fca8e29a88fdc4923d86bdc3f40adb2bNicolas Roard m_atomicSync.unlock(); 29375394f5ee0aac2337cdff1597b4e686e22c52833Nicolas Roard return; 2943c131605fca8e29a88fdc4923d86bdc3f40adb2bNicolas Roard } 295a1e806ed3b2d9e2727d08cc2a3958fce501f6f33Derek Sollenberger 2967e3773d591be20a4ddb1ef7df2709fd7655b7917Nicolas Roard texture->producerAcquireContext(); 297a52793c453c1512d0a18d4ae3108a975f998ae45Derek Sollenberger TextureInfo* textureInfo = texture->producerLock(); 2983c131605fca8e29a88fdc4923d86bdc3f40adb2bNicolas Roard m_atomicSync.unlock(); 299a52793c453c1512d0a18d4ae3108a975f998ae45Derek Sollenberger 300a1e806ed3b2d9e2727d08cc2a3958fce501f6f33Derek Sollenberger // at this point we can safely check the ownership (if the texture got 301a1e806ed3b2d9e2727d08cc2a3958fce501f6f33Derek Sollenberger // transferred to another BaseTile under us) 302a52793c453c1512d0a18d4ae3108a975f998ae45Derek Sollenberger if (texture->owner() != this || texture->usedLevel() > 1) { 303a52793c453c1512d0a18d4ae3108a975f998ae45Derek Sollenberger texture->producerRelease(); 30475394f5ee0aac2337cdff1597b4e686e22c52833Nicolas Roard return; 305a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard } 306a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard 30767e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard unsigned int pictureCount = 0; 30867e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard 309232d0b3572d13d9b4fb1211d9d56252a1ede3ed6Derek Sollenberger // setup the common renderInfo fields; 310232d0b3572d13d9b4fb1211d9d56252a1ede3ed6Derek Sollenberger TileRenderInfo renderInfo; 311232d0b3572d13d9b4fb1211d9d56252a1ede3ed6Derek Sollenberger renderInfo.x = x; 312232d0b3572d13d9b4fb1211d9d56252a1ede3ed6Derek Sollenberger renderInfo.y = y; 313232d0b3572d13d9b4fb1211d9d56252a1ede3ed6Derek Sollenberger renderInfo.scale = scale; 314232d0b3572d13d9b4fb1211d9d56252a1ede3ed6Derek Sollenberger renderInfo.tileSize = texture->getSize(); 3153c131605fca8e29a88fdc4923d86bdc3f40adb2bNicolas Roard renderInfo.tilePainter = painter; 3163c131605fca8e29a88fdc4923d86bdc3f40adb2bNicolas Roard renderInfo.baseTile = this; 317232d0b3572d13d9b4fb1211d9d56252a1ede3ed6Derek Sollenberger renderInfo.textureInfo = textureInfo; 318232d0b3572d13d9b4fb1211d9d56252a1ede3ed6Derek Sollenberger 319232d0b3572d13d9b4fb1211d9d56252a1ede3ed6Derek Sollenberger const float tileWidth = renderInfo.tileSize.width(); 320232d0b3572d13d9b4fb1211d9d56252a1ede3ed6Derek Sollenberger const float tileHeight = renderInfo.tileSize.height(); 321232d0b3572d13d9b4fb1211d9d56252a1ede3ed6Derek Sollenberger 32267e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard SkRegion::Iterator cliperator(dirtyArea); 32367e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard 32467e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard bool fullRepaint = false; 325f85cf343a02e85633e6b68c7f5db3c033b780607Teng-Hui Zhu 326fca6a67b130c1f97d366460af412ec6e6de14834Derek Sollenberger // TODO: Implement the partial invalidate in Surface Texture Mode 327f85cf343a02e85633e6b68c7f5db3c033b780607Teng-Hui Zhu if (m_fullRepaint[m_currentDirtyAreaIndex] 328f85cf343a02e85633e6b68c7f5db3c033b780607Teng-Hui Zhu || textureInfo->m_width != tileWidth 329f85cf343a02e85633e6b68c7f5db3c033b780607Teng-Hui Zhu || textureInfo->m_height != tileHeight 330f85cf343a02e85633e6b68c7f5db3c033b780607Teng-Hui Zhu || textureInfo->getSharedTextureMode() == SurfaceTextureMode) { 33167e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard fullRepaint = true; 332fca6a67b130c1f97d366460af412ec6e6de14834Derek Sollenberger } 33367e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard 334fca6a67b130c1f97d366460af412ec6e6de14834Derek Sollenberger if (!fullRepaint) { 33567e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard while (!cliperator.done()) { 33667e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard SkRect dirtyRect; 33767e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard dirtyRect.set(cliperator.rect()); 33867e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard 339bc235f4153cd55951a65bfcda6dc4b6c655d8cadTeng-Hui Zhu // compute the rect to corresponds to pixels 340bc235f4153cd55951a65bfcda6dc4b6c655d8cadTeng-Hui Zhu SkRect realTileRect; 341fca6a67b130c1f97d366460af412ec6e6de14834Derek Sollenberger realTileRect.fLeft = x * tileWidth; 342fca6a67b130c1f97d366460af412ec6e6de14834Derek Sollenberger realTileRect.fTop = y * tileHeight; 343fca6a67b130c1f97d366460af412ec6e6de14834Derek Sollenberger realTileRect.fRight = realTileRect.fLeft + tileWidth; 344fca6a67b130c1f97d366460af412ec6e6de14834Derek Sollenberger realTileRect.fBottom = realTileRect.fTop + tileHeight; 345bc235f4153cd55951a65bfcda6dc4b6c655d8cadTeng-Hui Zhu 346bc235f4153cd55951a65bfcda6dc4b6c655d8cadTeng-Hui Zhu // scale the dirtyRect for intersect computation. 347bc235f4153cd55951a65bfcda6dc4b6c655d8cadTeng-Hui Zhu SkRect realDirtyRect = SkRect::MakeWH(dirtyRect.width() * scale, 348bc235f4153cd55951a65bfcda6dc4b6c655d8cadTeng-Hui Zhu dirtyRect.height() * scale); 349bc235f4153cd55951a65bfcda6dc4b6c655d8cadTeng-Hui Zhu realDirtyRect.offset(dirtyRect.fLeft * scale, dirtyRect.fTop * scale); 350bc235f4153cd55951a65bfcda6dc4b6c655d8cadTeng-Hui Zhu 351fca6a67b130c1f97d366460af412ec6e6de14834Derek Sollenberger // set realTileRect to the intersection of itself and the dirty rect 352bc235f4153cd55951a65bfcda6dc4b6c655d8cadTeng-Hui Zhu if (!realTileRect.intersect(realDirtyRect)) { 35367e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard cliperator.next(); 35467e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard continue; 35567e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard } 35667e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard 357fca6a67b130c1f97d366460af412ec6e6de14834Derek Sollenberger // initialize finalRealRect to the rounded values of realTileRect 35867e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard SkIRect finalRealRect; 359fca6a67b130c1f97d366460af412ec6e6de14834Derek Sollenberger realTileRect.roundOut(&finalRealRect); 360fca6a67b130c1f97d366460af412ec6e6de14834Derek Sollenberger 361fca6a67b130c1f97d366460af412ec6e6de14834Derek Sollenberger // stash the int values of the current width and height 362fca6a67b130c1f97d366460af412ec6e6de14834Derek Sollenberger const int iWidth = finalRealRect.width(); 363fca6a67b130c1f97d366460af412ec6e6de14834Derek Sollenberger const int iHeight = finalRealRect.height(); 364fca6a67b130c1f97d366460af412ec6e6de14834Derek Sollenberger 365fca6a67b130c1f97d366460af412ec6e6de14834Derek Sollenberger if (iWidth == tileWidth || iHeight == tileHeight) { 366fca6a67b130c1f97d366460af412ec6e6de14834Derek Sollenberger fullRepaint = true; 367fca6a67b130c1f97d366460af412ec6e6de14834Derek Sollenberger break; 368fca6a67b130c1f97d366460af412ec6e6de14834Derek Sollenberger } 369fca6a67b130c1f97d366460af412ec6e6de14834Derek Sollenberger 370fca6a67b130c1f97d366460af412ec6e6de14834Derek Sollenberger // translate the rect into tile space coordinates 371fca6a67b130c1f97d366460af412ec6e6de14834Derek Sollenberger finalRealRect.fLeft = finalRealRect.fLeft % static_cast<int>(tileWidth); 372fca6a67b130c1f97d366460af412ec6e6de14834Derek Sollenberger finalRealRect.fTop = finalRealRect.fTop % static_cast<int>(tileHeight); 373fca6a67b130c1f97d366460af412ec6e6de14834Derek Sollenberger finalRealRect.fRight = finalRealRect.fLeft + iWidth; 374fca6a67b130c1f97d366460af412ec6e6de14834Derek Sollenberger finalRealRect.fBottom = finalRealRect.fTop + iHeight; 37567e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard 376232d0b3572d13d9b4fb1211d9d56252a1ede3ed6Derek Sollenberger renderInfo.invalRect = &finalRealRect; 377232d0b3572d13d9b4fb1211d9d56252a1ede3ed6Derek Sollenberger renderInfo.measurePerf = false; 37867e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard 3798dfdf8aa25b250ed3b8c0a443cf1cbaf9bd12c5bDerek Sollenberger pictureCount = m_renderer->renderTiledContent(renderInfo); 38067e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard 38167e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard cliperator.next(); 38267e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard } 38367e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard } 384fca6a67b130c1f97d366460af412ec6e6de14834Derek Sollenberger 385fca6a67b130c1f97d366460af412ec6e6de14834Derek Sollenberger if (fullRepaint) { 386fca6a67b130c1f97d366460af412ec6e6de14834Derek Sollenberger SkIRect rect; 387fca6a67b130c1f97d366460af412ec6e6de14834Derek Sollenberger rect.set(0, 0, tileWidth, tileHeight); 388fca6a67b130c1f97d366460af412ec6e6de14834Derek Sollenberger 389232d0b3572d13d9b4fb1211d9d56252a1ede3ed6Derek Sollenberger renderInfo.invalRect = ▭ 390232d0b3572d13d9b4fb1211d9d56252a1ede3ed6Derek Sollenberger renderInfo.measurePerf = TilesManager::instance()->getShowVisualIndicator(); 391232d0b3572d13d9b4fb1211d9d56252a1ede3ed6Derek Sollenberger 3928dfdf8aa25b250ed3b8c0a443cf1cbaf9bd12c5bDerek Sollenberger pictureCount = m_renderer->renderTiledContent(renderInfo); 393fca6a67b130c1f97d366460af412ec6e6de14834Derek Sollenberger } 394fca6a67b130c1f97d366460af412ec6e6de14834Derek Sollenberger 39567e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard XLOG("%x update texture %x for tile %d, %d scale %.2f (m_scale: %.2f)", this, textureInfo, x, y, scale, m_scale); 396b33016812afef21c69df5ab3d5b85eab5fef7c5cDerek Sollenberger 39767e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard m_atomicSync.lock(); 3983c131605fca8e29a88fdc4923d86bdc3f40adb2bNicolas Roard texture->setTile(textureInfo, x, y, scale, painter, pictureCount); 39967e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard texture->producerReleaseAndSwap(); 40067e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard 4015ba4a087b9212ca9ae083f015637f417199d85ccJohn Reck if (texture == m_texture) { 4025ba4a087b9212ca9ae083f015637f417199d85ccJohn Reck m_lastPaintedPicture = pictureCount; 403a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard 4045ba4a087b9212ca9ae083f015637f417199d85ccJohn Reck // set the fullrepaint flags 405f85cf343a02e85633e6b68c7f5db3c033b780607Teng-Hui Zhu m_fullRepaint[m_currentDirtyAreaIndex] = false; 40667e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard 4075ba4a087b9212ca9ae083f015637f417199d85ccJohn Reck // The various checks to see if we are still dirty... 40867e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard 4095ba4a087b9212ca9ae083f015637f417199d85ccJohn Reck m_dirty = false; 41067e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard 4115ba4a087b9212ca9ae083f015637f417199d85ccJohn Reck if (m_scale != scale) 4125ba4a087b9212ca9ae083f015637f417199d85ccJohn Reck m_dirty = true; 41367e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard 414fca6a67b130c1f97d366460af412ec6e6de14834Derek Sollenberger if (fullRepaint) 415f85cf343a02e85633e6b68c7f5db3c033b780607Teng-Hui Zhu m_dirtyArea[m_currentDirtyAreaIndex].setEmpty(); 416fca6a67b130c1f97d366460af412ec6e6de14834Derek Sollenberger else 417f85cf343a02e85633e6b68c7f5db3c033b780607Teng-Hui Zhu m_dirtyArea[m_currentDirtyAreaIndex].op(dirtyArea, SkRegion::kDifference_Op); 41867e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard 419f85cf343a02e85633e6b68c7f5db3c033b780607Teng-Hui Zhu if (!m_dirtyArea[m_currentDirtyAreaIndex].isEmpty()) 4205ba4a087b9212ca9ae083f015637f417199d85ccJohn Reck m_dirty = true; 42167e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard 4225ba4a087b9212ca9ae083f015637f417199d85ccJohn Reck // Now we can swap the dirty areas 423f85cf343a02e85633e6b68c7f5db3c033b780607Teng-Hui Zhu // TODO: For surface texture in Async mode, the index will be updated 424f85cf343a02e85633e6b68c7f5db3c033b780607Teng-Hui Zhu // according to the current buffer just dequeued. 425f85cf343a02e85633e6b68c7f5db3c033b780607Teng-Hui Zhu m_currentDirtyAreaIndex = (m_currentDirtyAreaIndex+1) % m_maxBufferNumber; 42667e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard 427f85cf343a02e85633e6b68c7f5db3c033b780607Teng-Hui Zhu if (!m_dirtyArea[m_currentDirtyAreaIndex].isEmpty()) 4285ba4a087b9212ca9ae083f015637f417199d85ccJohn Reck m_dirty = true; 429c15781f45f0d19a925be7fd73bd10c318562db70Nicolas Roard 4305ba4a087b9212ca9ae083f015637f417199d85ccJohn Reck if (!m_dirty) 4315ba4a087b9212ca9ae083f015637f417199d85ccJohn Reck m_usable = true; 4325ba4a087b9212ca9ae083f015637f417199d85ccJohn Reck } 43367e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard 43467e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard m_atomicSync.unlock(); 43567e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard} 43667e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard 437a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard} // namespace WebCore 438a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard 439a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard#endif // USE(ACCELERATED_COMPOSITING) 440