a41c0d564b63813ba63a6ced58e04d69c38f2dea
[WebKit-https.git] / Source / WebCore / platform / graphics / chromium / cc / CCThreadProxy.h
1 /*
2  * Copyright (C) 2011 Google Inc. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1.  Redistributions of source code must retain the above copyright
8  *     notice, this list of conditions and the following disclaimer.
9  * 2.  Redistributions in binary form must reproduce the above copyright
10  *     notice, this list of conditions and the following disclaimer in the
11  *     documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
15  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
16  * DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
17  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
18  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
19  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
20  * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
21  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
22  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
23  */
24
25 #ifndef CCThreadProxy_h
26 #define CCThreadProxy_h
27
28 #include "cc/CCCompletionEvent.h"
29 #include "cc/CCLayerTreeHostImpl.h"
30 #include "cc/CCProxy.h"
31 #include "cc/CCScheduler.h"
32 #include "cc/CCThread.h"
33 #include <wtf/OwnPtr.h>
34
35 namespace WebCore {
36
37 class CCInputHandler;
38 class CCLayerTreeHost;
39 class CCScheduler;
40 class CCScopedThreadProxy;
41 class CCTextureUpdater;
42 class CCThread;
43
44 class CCThreadProxy : public CCProxy, CCLayerTreeHostImplClient, CCSchedulerClient {
45 public:
46     static PassOwnPtr<CCProxy> create(CCLayerTreeHost*);
47
48     virtual ~CCThreadProxy();
49
50     // CCProxy implementation
51     virtual bool compositeAndReadback(void *pixels, const IntRect&);
52     virtual GraphicsContext3D* context();
53     virtual void finishAllRendering();
54     virtual bool isStarted() const;
55     virtual bool initializeLayerRenderer();
56     virtual int compositorIdentifier() const;
57     virtual const LayerRendererCapabilities& layerRendererCapabilities() const;
58     virtual void loseCompositorContext(int numTimes);
59     virtual void setNeedsAnimate();
60     virtual void setNeedsCommit();
61     virtual void setNeedsRedraw();
62     virtual void setVisible(bool);
63     virtual void start();
64     virtual void stop();
65
66     // CCLayerTreeHostImplClient implementation
67     virtual void onSwapBuffersCompleteOnImplThread();
68     virtual void setNeedsRedrawOnImplThread();
69     virtual void setNeedsCommitOnImplThread();
70
71     // CCSchedulerClient implementation
72     virtual bool canDraw();
73     virtual bool hasMoreResourceUpdates() const;
74     virtual void scheduledActionBeginFrame();
75     virtual void scheduledActionDrawAndSwap();
76     virtual void scheduledActionUpdateMoreResources();
77     virtual void scheduledActionCommit();
78
79 private:
80     explicit CCThreadProxy(CCLayerTreeHost*);
81
82     // Called on main thread
83     void beginFrameAndCommit(int sequenceNumber, double frameBeginTime, PassOwnPtr<CCScrollAndScaleSet>);
84     void didCommitAndDrawFrame();
85     void didCompleteSwapBuffers();
86
87     // Called on impl thread
88     struct ReadbackRequest {
89         CCCompletionEvent completion;
90         bool success;
91         void* pixels;
92         IntRect rect;
93     };
94     PassOwnPtr<CCThread::Task> createBeginFrameAndCommitTaskOnImplThread();
95     void obtainBeginFrameAndCommitTaskFromCCThread(CCCompletionEvent*, CCThread::Task**);
96     void beginFrameCompleteOnImplThread(CCCompletionEvent*);
97     void requestReadbackOnImplThread(ReadbackRequest*);
98     void finishAllRenderingOnImplThread(CCCompletionEvent*);
99     void initializeImplOnImplThread(CCCompletionEvent*);
100     void initializeLayerRendererOnImplThread(GraphicsContext3D*, CCCompletionEvent*, bool* initializeSucceeded, LayerRendererCapabilities*, int* compositorIdentifier);
101     void setVisibleOnImplThread(CCCompletionEvent*, bool visible);
102     void layerTreeHostClosedOnImplThread(CCCompletionEvent*);
103
104     // Accessed on main thread only.
105     bool m_animateRequested;
106     bool m_commitRequested;
107     CCLayerTreeHost* m_layerTreeHost;
108     int m_compositorIdentifier;
109     LayerRendererCapabilities m_layerRendererCapabilitiesMainThreadCopy;
110     bool m_started;
111     int m_lastExecutedBeginFrameAndCommitSequenceNumber;
112
113     // Used on the CCThread only.
114     OwnPtr<CCLayerTreeHostImpl> m_layerTreeHostImpl;
115     int m_numBeginFrameAndCommitsIssuedOnImplThread;
116
117     OwnPtr<CCInputHandler> m_inputHandlerOnImplThread;
118
119     OwnPtr<CCScheduler> m_schedulerOnImplThread;
120
121     RefPtr<CCScopedThreadProxy> m_mainThreadProxy;
122
123     // Set when the main thread is waiing on a readback.
124     ReadbackRequest* m_readbackRequestOnImplThread;
125
126     // Set when the main thread is waiting on a finishAllRendering call.
127     CCCompletionEvent* m_finishAllRenderingCompletionEventOnImplThread;
128
129     // Set when the main thread is waiting on a commit to complete.
130     CCCompletionEvent* m_commitCompletionEventOnImplThread;
131     OwnPtr<CCTextureUpdater> m_currentTextureUpdaterOnImplThread;
132
133     // Set when the next draw should post didCommitAndDrawFrame to the main thread.
134     bool m_nextFrameIsNewlyCommittedFrameOnImplThread;
135 };
136
137 }
138
139 #endif