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#ifndef Tile_h 27594c6b805969c2673c84d1d1d1a3556ce376ac7aChris Craik#define Tile_h 28a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard 29a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard#if USE(ACCELERATED_COMPOSITING) 30a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard 318dfdf8aa25b250ed3b8c0a443cf1cbaf9bd12c5bDerek Sollenberger#include "BaseRenderer.h" 3232ce41e0241790f20e63cafea4d3c1db87423eecChris Craik#include "FloatPoint.h" 33a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard#include "SkRect.h" 3467e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard#include "SkRegion.h" 359cb2c64b0e05541c6e78a17de554436f933351fbNicolas Roard#include "TextureOwner.h" 363c131605fca8e29a88fdc4923d86bdc3f40adb2bNicolas Roard#include "TilePainter.h" 37a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard 38a1e806ed3b2d9e2727d08cc2a3958fce501f6f33Derek Sollenberger#include <utils/threads.h> 39a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard 40a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roardnamespace WebCore { 41a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard 42fca6a67b130c1f97d366460af412ec6e6de14834Derek Sollenbergerclass TextureInfo; 43594c6b805969c2673c84d1d1d1a3556ce376ac7aChris Craikclass TileTexture; 4472a76070d36a51926c224d230f1503c46f30da60Chris Craikclass GLWebViewState; 45a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard 46a52793c453c1512d0a18d4ae3108a975f998ae45Derek Sollenberger/** 47a52793c453c1512d0a18d4ae3108a975f998ae45Derek Sollenberger * An individual tile that is used to construct part of a webpage's BaseLayer of 48a52793c453c1512d0a18d4ae3108a975f998ae45Derek Sollenberger * content. Each tile is assigned to a TiledPage and is responsible for drawing 49a52793c453c1512d0a18d4ae3108a975f998ae45Derek Sollenberger * and displaying their section of the page. The lifecycle of a tile is: 50a52793c453c1512d0a18d4ae3108a975f998ae45Derek Sollenberger * 51a52793c453c1512d0a18d4ae3108a975f998ae45Derek Sollenberger * 1. Each tile is created on the main GL thread and assigned to a specific 52a52793c453c1512d0a18d4ae3108a975f998ae45Derek Sollenberger * location within a TiledPage. 53a52793c453c1512d0a18d4ae3108a975f998ae45Derek Sollenberger * 2. When needed the tile is passed to the background thread where it paints 54a52793c453c1512d0a18d4ae3108a975f998ae45Derek Sollenberger * the BaseLayer's most recent PictureSet to a bitmap which is then uploaded 55a52793c453c1512d0a18d4ae3108a975f998ae45Derek Sollenberger * to the GPU. 56a52793c453c1512d0a18d4ae3108a975f998ae45Derek Sollenberger * 3. After the bitmap is uploaded to the GPU the main GL thread then uses the 57e6a08abad427194f5eb95ba75b77211fa8498997Chris Craik * tile's drawGL() function to display the tile to the screen. 58a52793c453c1512d0a18d4ae3108a975f998ae45Derek Sollenberger * 4. Steps 2-3 are repeated as necessary. 59a52793c453c1512d0a18d4ae3108a975f998ae45Derek Sollenberger * 5. The tile is destroyed when the user navigates to a new page. 60a52793c453c1512d0a18d4ae3108a975f998ae45Derek Sollenberger * 61a52793c453c1512d0a18d4ae3108a975f998ae45Derek Sollenberger */ 62594c6b805969c2673c84d1d1d1a3556ce376ac7aChris Craikclass Tile : public TextureOwner { 63a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roardpublic: 64f6a40880028cf495025747229c627f42e25acc66Chris Craik 65f6a40880028cf495025747229c627f42e25acc66Chris Craik // eventually, m_dirty might be rolled into the state machine, but note 66f6a40880028cf495025747229c627f42e25acc66Chris Craik // that a tile that's continually marked dirty from animation should still 67f6a40880028cf495025747229c627f42e25acc66Chris Craik // progress through the state machine and be drawn periodically (esp. for 68f6a40880028cf495025747229c627f42e25acc66Chris Craik // layers) 69f6a40880028cf495025747229c627f42e25acc66Chris Craik 70f6a40880028cf495025747229c627f42e25acc66Chris Craik // /-> TransferredUnvalidated (TQ interrupts paint) -\ (TQ & paint done) 71f6a40880028cf495025747229c627f42e25acc66Chris Craik // Unpainted -> PaintingStarted -- -> ReadyToSwap -> UpToDate 72f6a40880028cf495025747229c627f42e25acc66Chris Craik // ^ \-> ValidatedUntransferred (paint finish before TQ) -/ 73f6a40880028cf495025747229c627f42e25acc66Chris Craik // | 74f6a40880028cf495025747229c627f42e25acc66Chris Craik // \--... (From any state when marked dirty. should usually come from UpToDate if the updates are locked) 75f6a40880028cf495025747229c627f42e25acc66Chris Craik // 76f6a40880028cf495025747229c627f42e25acc66Chris Craik 77f6a40880028cf495025747229c627f42e25acc66Chris Craik enum TextureState{ 78f6a40880028cf495025747229c627f42e25acc66Chris Craik // back texture is completely unpainted 79f6a40880028cf495025747229c627f42e25acc66Chris Craik Unpainted = 0, 80f6a40880028cf495025747229c627f42e25acc66Chris Craik // has started painting, but haven't been transferred or validated 81f6a40880028cf495025747229c627f42e25acc66Chris Craik PaintingStarted = 1, 82f6a40880028cf495025747229c627f42e25acc66Chris Craik // back texture painted, transferred before validating in PaintBitmap() 83f6a40880028cf495025747229c627f42e25acc66Chris Craik TransferredUnvalidated = 2, 84f6a40880028cf495025747229c627f42e25acc66Chris Craik // back texture painted, validated before transferring in TransferQueue 85f6a40880028cf495025747229c627f42e25acc66Chris Craik ValidatedUntransferred = 3, 86f6a40880028cf495025747229c627f42e25acc66Chris Craik // back texture has been blitted, will be swapped when next available 87f6a40880028cf495025747229c627f42e25acc66Chris Craik ReadyToSwap = 4, 88f6a40880028cf495025747229c627f42e25acc66Chris Craik // has been swapped, is ready to draw, all is well 89f6a40880028cf495025747229c627f42e25acc66Chris Craik UpToDate = 5, 90f6a40880028cf495025747229c627f42e25acc66Chris Craik }; 91f6a40880028cf495025747229c627f42e25acc66Chris Craik 92594c6b805969c2673c84d1d1d1a3556ce376ac7aChris Craik Tile(bool isLayerTile = false); 93594c6b805969c2673c84d1d1d1a3556ce376ac7aChris Craik ~Tile(); 94a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard 953c131605fca8e29a88fdc4923d86bdc3f40adb2bNicolas Roard bool isLayerTile() { return m_isLayerTile; } 963c131605fca8e29a88fdc4923d86bdc3f40adb2bNicolas Roard 97c51715092b8d3be1b51cce8bae61750cbcf342c4Chris Craik void setContents(int x, int y, float scale, bool isExpandedPrefetchTile); 98ffc715a2e6382fe9e331557c35fafc426507b8f5Derek Sollenberger 99a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard void reserveTexture(); 1008ad3ab0e47f0d5039e89c1873c178f538ec1b0dfChris Craik 101a1e806ed3b2d9e2727d08cc2a3958fce501f6f33Derek Sollenberger bool isTileReady(); 1028ad3ab0e47f0d5039e89c1873c178f538ec1b0dfChris Craik 103afe34397d6d4655c908f0995e760772980722da3Teng-Hui Zhu // Return false when real draw didn't happen for any reason. 104afe34397d6d4655c908f0995e760772980722da3Teng-Hui Zhu bool drawGL(float opacity, const SkRect& rect, float scale, 105a31d28d03260660f592ad6914f5375b47e823aa5Teng-Hui Zhu const TransformationMatrix* transform, 10632ce41e0241790f20e63cafea4d3c1db87423eecChris Craik bool forceBlending, bool usePointSampling, 107485445e9a624fe92ca04a1d0e92c1f71aaf8cd8fTeng-Hui Zhu const FloatRect& fillPortion); 108a52793c453c1512d0a18d4ae3108a975f998ae45Derek Sollenberger 109a52793c453c1512d0a18d4ae3108a975f998ae45Derek Sollenberger // the only thread-safe function called by the background thread 11092db4f76a7eca8f91084ec2eedde77b161786f23Chris Craik void paintBitmap(TilePainter* painter); 111a52793c453c1512d0a18d4ae3108a975f998ae45Derek Sollenberger 112fa807bd31774157959640810e564fbe64338e8e3Nicolas Roard bool intersectWithRect(int x, int y, int tileWidth, int tileHeight, 113fa807bd31774157959640810e564fbe64338e8e3Nicolas Roard float scale, const SkRect& dirtyRect, 114fa807bd31774157959640810e564fbe64338e8e3Nicolas Roard SkRect& realTileRect); 115e48d27773894f36d85e5c2e2052ab90d502e1c72Chris Craik bool isTileVisible(const IntRect& viewTileBounds); 116fa807bd31774157959640810e564fbe64338e8e3Nicolas Roard 117bd3f93b66934582acd0b6c70bcf60ca643b36eadChris Craik void markAsDirty(); 118f7ad77dc2a981834d664fd24022c3dfade69c8aaChris Craik void markAsDirty(const SkRegion& dirtyArea); 119a1e806ed3b2d9e2727d08cc2a3958fce501f6f33Derek Sollenberger bool isDirty(); 120e859a34171f2a36877d95197d118d962078f8aa0John Reck const SkRegion& dirtyArea() { return m_dirtyArea; } 121885e650b12d781be054b31ae6221925a0184dc33Chris Craik virtual bool isRepaintPending(); 122417789b7c56928a5fcb610583346d07ffa380900John Reck void setRepaintPending(bool pending); 123a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard float scale() const { return m_scale; } 124f6a40880028cf495025747229c627f42e25acc66Chris Craik TextureState textureState() const { return m_state; } 125a52793c453c1512d0a18d4ae3108a975f998ae45Derek Sollenberger 126a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard int x() const { return m_x; } 127a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard int y() const { return m_y; } 128594c6b805969c2673c84d1d1d1a3556ce376ac7aChris Craik TileTexture* frontTexture() { return m_frontTexture; } 129594c6b805969c2673c84d1d1d1a3556ce376ac7aChris Craik TileTexture* backTexture() { return m_backTexture; } 1300c274b96c2dfb5a83b12a99f1ca9069378f73bdbChris Craik TileTexture* lastDrawnTexture() { return m_lastDrawnTexture; } 131f6a40880028cf495025747229c627f42e25acc66Chris Craik 132f6a40880028cf495025747229c627f42e25acc66Chris Craik // only used for prioritization - the higher, the more relevant the tile is 133f6a40880028cf495025747229c627f42e25acc66Chris Craik unsigned long long drawCount() { return m_drawCount; } 1348ad3ab0e47f0d5039e89c1873c178f538ec1b0dfChris Craik void discardTextures(); 1353a819aac70dd26f675644f6a35b13be5fb3de2f1Chris Craik void discardBackTexture(); 1368ad3ab0e47f0d5039e89c1873c178f538ec1b0dfChris Craik bool swapTexturesIfNeeded(); 137f6a40880028cf495025747229c627f42e25acc66Chris Craik void backTextureTransfer(); 138530c83c6351e05a6939ad0b5bc291da073e77b5bChris Craik void backTextureTransferFail(); 139e859a34171f2a36877d95197d118d962078f8aa0John Reck void onBlitUpdate(); 140a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard 1419cb2c64b0e05541c6e78a17de554436f933351fbNicolas Roard // TextureOwner implementation 142594c6b805969c2673c84d1d1d1a3556ce376ac7aChris Craik virtual bool removeTexture(TileTexture* texture); 1439cb2c64b0e05541c6e78a17de554436f933351fbNicolas Roard 144a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roardprivate: 145bd3f93b66934582acd0b6c70bcf60ca643b36eadChris Craik void markAsDirtyInternal(); 146f6a40880028cf495025747229c627f42e25acc66Chris Craik void validatePaint(); 147f6a40880028cf495025747229c627f42e25acc66Chris Craik 148a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard int m_x; 149a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard int m_y; 150a52793c453c1512d0a18d4ae3108a975f998ae45Derek Sollenberger 151a1e806ed3b2d9e2727d08cc2a3958fce501f6f33Derek Sollenberger // The remaining variables can be updated throughout the lifetime of the object 1528ad3ab0e47f0d5039e89c1873c178f538ec1b0dfChris Craik 153594c6b805969c2673c84d1d1d1a3556ce376ac7aChris Craik TileTexture* m_frontTexture; 154594c6b805969c2673c84d1d1d1a3556ce376ac7aChris Craik TileTexture* m_backTexture; 1550c274b96c2dfb5a83b12a99f1ca9069378f73bdbChris Craik TileTexture* m_lastDrawnTexture; 156a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard float m_scale; 1578ad3ab0e47f0d5039e89c1873c178f538ec1b0dfChris Craik 1588ad3ab0e47f0d5039e89c1873c178f538ec1b0dfChris Craik // used to signal that the that the tile is out-of-date and needs to be 1598ad3ab0e47f0d5039e89c1873c178f538ec1b0dfChris Craik // redrawn in the backTexture 160a1e806ed3b2d9e2727d08cc2a3958fce501f6f33Derek Sollenberger bool m_dirty; 161f6a40880028cf495025747229c627f42e25acc66Chris Craik 16255ff9f5ac537f2b11ae997f1029bdccb87008825Chris Craik // number of repaints pending 16355ff9f5ac537f2b11ae997f1029bdccb87008825Chris Craik int m_repaintsPending; 16467e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard 16567e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard // store the dirty region 16662ee9670dd9beeb9a8f21d8737250c081382e2f5Teng-Hui Zhu SkRegion m_dirtyArea; 16762ee9670dd9beeb9a8f21d8737250c081382e2f5Teng-Hui Zhu bool m_fullRepaint; 16867e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard 169a1e806ed3b2d9e2727d08cc2a3958fce501f6f33Derek Sollenberger // This mutex serves two purposes. (1) It ensures that certain operations 170a1e806ed3b2d9e2727d08cc2a3958fce501f6f33Derek Sollenberger // happen atomically and (2) it makes sure those operations are synchronized 171a1e806ed3b2d9e2727d08cc2a3958fce501f6f33Derek Sollenberger // across all threads and cores. 172a1e806ed3b2d9e2727d08cc2a3958fce501f6f33Derek Sollenberger android::Mutex m_atomicSync; 173a1e806ed3b2d9e2727d08cc2a3958fce501f6f33Derek Sollenberger 1748dfdf8aa25b250ed3b8c0a443cf1cbaf9bd12c5bDerek Sollenberger BaseRenderer* m_renderer; 1753c131605fca8e29a88fdc4923d86bdc3f40adb2bNicolas Roard 1763c131605fca8e29a88fdc4923d86bdc3f40adb2bNicolas Roard bool m_isLayerTile; 177808dc42f1e6a574778bc9e8bd41beb7bd9aef06fChris Craik 1788ad3ab0e47f0d5039e89c1873c178f538ec1b0dfChris Craik // the most recent GL draw before this tile was prepared. used for 1798ad3ab0e47f0d5039e89c1873c178f538ec1b0dfChris Craik // prioritization and caching. tiles with old drawcounts and textures they 1808ad3ab0e47f0d5039e89c1873c178f538ec1b0dfChris Craik // own are used for new tiles and rendering 1818ad3ab0e47f0d5039e89c1873c178f538ec1b0dfChris Craik unsigned long long m_drawCount; 182f6a40880028cf495025747229c627f42e25acc66Chris Craik 183f6a40880028cf495025747229c627f42e25acc66Chris Craik // Tracks the state of painting for the tile. High level overview: 184f6a40880028cf495025747229c627f42e25acc66Chris Craik // 1) Unpainted - until paint starts (and if marked dirty, in most cases) 185f6a40880028cf495025747229c627f42e25acc66Chris Craik // 2) PaintingStarted - until paint completes 186f6a40880028cf495025747229c627f42e25acc66Chris Craik // 3) TransferredUnvalidated - if transferred first 187f6a40880028cf495025747229c627f42e25acc66Chris Craik // or ValidatedUntransferred - if validated first 188f6a40880028cf495025747229c627f42e25acc66Chris Craik // 4) ReadyToSwap - if painted and transferred, but not swapped 189f6a40880028cf495025747229c627f42e25acc66Chris Craik // 5) UpToDate - until marked dirty again 190f6a40880028cf495025747229c627f42e25acc66Chris Craik TextureState m_state; 191a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard}; 192a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard 193a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard} // namespace WebCore 194a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard 195a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard#endif // USE(ACCELERATED_COMPOSITING) 196594c6b805969c2673c84d1d1d1a3556ce376ac7aChris Craik#endif // Tile_h 197