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