summaryrefslogtreecommitdiffstats
path: root/Source/WebCore/platform/graphics/android/TransferQueue.h
blob: dbe29f857a5f49544255d7d006fe3f07627fab64 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
/*
 * Copyright 2011, The Android Open Source Project
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *  * Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 *  * Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY
 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

#ifndef TransferQueue_h
#define TransferQueue_h

#if USE(ACCELERATED_COMPOSITING)

#include "BaseTile.h"
#include "BaseTileTexture.h"
#include "ShaderProgram.h"
#include "TiledPage.h"

namespace WebCore {

struct GLState {
    GLint viewport[4];
    GLboolean scissor[1];
    GLboolean depth[1];
    GLfloat clearColor[4];
};

class TransferQueue {
public:
    TransferQueue();
    ~TransferQueue();

    void updateDirtyBaseTiles();

    void initSharedSurfaceTextures(int width, int height);

    void updateQueueWithBitmap(const TileRenderInfo* renderInfo, int x, int y,
                               const SkBitmap& bitmap);

    void discardQueue();

    void addItemInTransferQueue(const TileRenderInfo* info);

    // Check if the item @ index is ready for update.
    // The lock will be done when returning true.
    bool readyForUpdate();

    void interruptTransferQueue(bool);

    void lockQueue() { m_transferQueueItemLocks.lock(); }
    void unlockQueue() { m_transferQueueItemLocks.unlock(); }

    // This queue can be accessed from UI and TexGen thread, therefore, we need
    // a lock to protect its access
    TileTransferData* m_transferQueue;

    sp<ANativeWindow> m_ANW;

    // EGL wrapper around m_ANW for use by the GaneshRenderer
    EGLSurface m_eglSurface;

private:
    bool getHasGLContext();
    void setHasGLContext(bool hasContext);

    int getNextTransferQueueIndex();

    // Save and restore the GL State while switching from/to FBO.
    void saveGLState();
    void setGLStateForCopy(int width, int height);
    void restoreGLState();

    // Check the current transfer queue item is obsolete or not.
    bool checkObsolete(int index);

    // Before each draw call and the blit operation, clean up all the
    // pendingDiscard items.
    void cleanupTransportQueue();

    void blitTileFromQueue(GLuint fboID, BaseTileTexture* destTex,
                           GLuint srcTexId, GLenum srcTexTarget,
                           int index);

    // Note that the m_transferQueueIndex only changed in the TexGen thread
    // where we are going to move on to update the next item in the queue.
    int m_transferQueueIndex;

    GLuint m_fboID; // The FBO used for copy the SurfTex to each tile

    GLuint m_sharedSurfaceTextureId;

    // GLContext can be lost when WebView destroyed.
    bool m_hasGLContext;

    GLState m_GLStateBeforeBlit;
    sp<android::SurfaceTexture> m_sharedSurfaceTexture;

    int m_emptyItemCount;

    bool m_interruptedByRemovingOp;

    // We are using wait/signal to handle our own queue sync.
    // First of all, if we don't have our own lock, then while WebView is
    // destroyed, the UI thread will wait for the Tex Gen to get out from
    // dequeue operation, which will not succeed. B/c at this moment, we
    // already lost the GL Context.
    // Now we maintain a counter, which is m_emptyItemCount. When this reach
    // 0, then we need the Tex Gen thread to wait. UI thread can signal this
    // wait after calling updateTexImage at the draw call , or after WebView
    // is destroyed.
    android::Mutex m_transferQueueItemLocks;
    android::Condition m_transferQueueItemCond;
};

} // namespace WebCore

#endif // USE(ACCELERATED_COMPOSITING)
#endif // TransferQueue_h