LayerRendererChromium.h revision 54cdeeebc7adcbcd900e8b6a141a8cae27d9a631
1/*
2 * Copyright (C) 2010 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 are
6 * met:
7 *
8 *     * Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 *     * Redistributions in binary form must reproduce the above
11 * copyright notice, this list of conditions and the following disclaimer
12 * in the documentation and/or other materials provided with the
13 * distribution.
14 *     * Neither the name of Google Inc. nor the names of its
15 * contributors may be used to endorse or promote products derived from
16 * this software without specific prior written permission.
17 *
18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29 */
30
31
32#ifndef LayerRendererChromium_h
33#define LayerRendererChromium_h
34
35#if USE(ACCELERATED_COMPOSITING)
36
37#include "ContentLayerChromium.h"
38#include "IntRect.h"
39#include "LayerChromium.h"
40#include "LayerTilerChromium.h"
41#include "RenderSurfaceChromium.h"
42#include "SkBitmap.h"
43#include "VideoLayerChromium.h"
44#include "cc/CCCanvasLayerImpl.h"
45#include "cc/CCHeadsUpDisplay.h"
46#include "cc/CCPluginLayerImpl.h"
47#include "cc/CCVideoLayerImpl.h"
48#include <wtf/HashMap.h>
49#include <wtf/Noncopyable.h>
50#include <wtf/PassOwnPtr.h>
51#include <wtf/PassRefPtr.h>
52#include <wtf/RefCounted.h>
53#include <wtf/Vector.h>
54
55#if USE(CG)
56#include <CoreGraphics/CGContext.h>
57#include <wtf/RetainPtr.h>
58#endif
59
60namespace WebCore {
61
62class CCHeadsUpDisplay;
63class CCLayerImpl;
64class GeometryBinding;
65class GraphicsContext3D;
66
67// Class that handles drawing of composited render layers using GL.
68class LayerRendererChromium : public RefCounted<LayerRendererChromium> {
69public:
70    static PassRefPtr<LayerRendererChromium> create(PassRefPtr<GraphicsContext3D>, PassOwnPtr<TilePaintInterface> contentPaint);
71
72    ~LayerRendererChromium();
73
74    GraphicsContext3D* context();
75
76    void invalidateRootLayerRect(const IntRect& dirtyRect);
77
78    void setViewport(const IntRect& visibleRect, const IntRect& contentRect, const IntPoint& scrollPosition);
79
80    // updates and draws the current layers onto the backbuffer
81    void updateAndDrawLayers();
82
83    // waits for rendering to finish
84    void finish();
85
86    // puts backbuffer onscreen
87    void present();
88
89    IntSize viewportSize() const { return m_viewportVisibleRect.size(); }
90
91    void setRootLayer(PassRefPtr<LayerChromium>);
92    LayerChromium* rootLayer() { return m_rootLayer.get(); }
93    void transferRootLayer(LayerRendererChromium* other) { other->m_rootLayer = m_rootLayer.release(); }
94
95    bool hardwareCompositing() const { return m_hardwareCompositing; }
96
97    void setCompositeOffscreen(bool);
98    bool isCompositingOffscreen() const { return m_compositeOffscreen; }
99
100    unsigned createLayerTexture();
101    void deleteLayerTexture(unsigned);
102
103    static void debugGLCall(GraphicsContext3D*, const char* command, const char* file, int line);
104
105    const TransformationMatrix& projectionMatrix() const { return m_projectionMatrix; }
106
107    void useShader(unsigned);
108
109    bool checkTextureSize(const IntSize&);
110
111    const GeometryBinding* sharedGeometry() const { return m_sharedGeometry.get(); }
112    const LayerChromium::BorderProgram* borderProgram() const { return m_borderProgram.get(); }
113    const CCHeadsUpDisplay::Program* headsUpDisplayProgram() const { return m_headsUpDisplayProgram.get(); }
114    const RenderSurfaceChromium::Program* renderSurfaceProgram() const { return m_renderSurfaceProgram.get(); }
115    const RenderSurfaceChromium::MaskProgram* renderSurfaceMaskProgram() const { return m_renderSurfaceMaskProgram.get(); }
116    const LayerTilerChromium::Program* tilerProgram() const { return m_tilerProgram.get(); }
117    const CCCanvasLayerImpl::Program* canvasLayerProgram() const { return m_canvasLayerProgram.get(); }
118    const CCPluginLayerImpl::Program* pluginLayerProgram() const { return m_pluginLayerProgram.get(); }
119    const CCVideoLayerImpl::RGBAProgram* videoLayerRGBAProgram() const { return m_videoLayerRGBAProgram.get(); }
120    const CCVideoLayerImpl::YUVProgram* videoLayerYUVProgram() const { return m_videoLayerYUVProgram.get(); }
121
122    void resizeOnscreenContent(const IntSize&);
123
124    void getFramebufferPixels(void *pixels, const IntRect& rect);
125
126    TextureManager* textureManager() const { return m_textureManager.get(); }
127
128    CCHeadsUpDisplay* headsUpDisplay() { return m_headsUpDisplay.get(); }
129
130    void setScissorToRect(const IntRect&);
131
132    String layerTreeAsText() const;
133
134    void addChildContext(GraphicsContext3D*);
135    void removeChildContext(GraphicsContext3D*);
136
137private:
138    typedef Vector<RefPtr<CCLayerImpl> > LayerList;
139    typedef HashMap<GraphicsContext3D*, int> ChildContextMap;
140
141    explicit LayerRendererChromium(PassRefPtr<GraphicsContext3D>, PassOwnPtr<TilePaintInterface> contentPaint);
142
143    void updateLayers(LayerList& renderSurfaceLayerList);
144    void updateRootLayerContents();
145    void updatePropertiesAndRenderSurfaces(LayerChromium*, const TransformationMatrix& parentMatrix, LayerList& renderSurfaceLayerList, LayerList& layers);
146
147    void paintLayerContents(const LayerList&);
148    void updateCompositorResourcesRecursive(LayerChromium*);
149
150    void drawLayers(const LayerList& renderSurfaceLayerList);
151    void drawLayer(CCLayerImpl*, RenderSurfaceChromium*);
152
153    void drawRootLayer();
154    LayerTexture* getOffscreenLayerTexture();
155    void copyOffscreenTextureToDisplay();
156
157    bool isLayerVisible(LayerChromium*, const TransformationMatrix&, const IntRect& visibleRect);
158
159    void setDrawViewportRect(const IntRect&, bool flipY);
160
161    bool useRenderSurface(RenderSurfaceChromium*);
162
163    bool makeContextCurrent();
164
165    static bool compareLayerZ(const RefPtr<CCLayerImpl>&, const RefPtr<CCLayerImpl>&);
166
167    void dumpRenderSurfaces(TextStream&, int indent, LayerChromium*) const;
168
169    bool initializeSharedObjects();
170    void cleanupSharedObjects();
171
172    IntRect m_viewportVisibleRect;
173    IntRect m_viewportContentRect;
174    IntPoint m_viewportScrollPosition;
175
176    TransformationMatrix m_projectionMatrix;
177
178    RefPtr<LayerChromium> m_rootLayer;
179    OwnPtr<TilePaintInterface> m_rootLayerContentPaint;
180    OwnPtr<LayerTilerChromium> m_rootLayerContentTiler;
181
182    bool m_hardwareCompositing;
183
184    unsigned m_currentShader;
185    RenderSurfaceChromium* m_currentRenderSurface;
186
187    unsigned m_offscreenFramebufferId;
188    bool m_compositeOffscreen;
189
190#if USE(SKIA)
191    OwnPtr<SkCanvas> m_rootLayerCanvas;
192    OwnPtr<PlatformContextSkia> m_rootLayerSkiaContext;
193    OwnPtr<GraphicsContext> m_rootLayerGraphicsContext;
194#elif USE(CG)
195    Vector<uint8_t> m_rootLayerBackingStore;
196    RetainPtr<CGContextRef> m_rootLayerCGContext;
197    OwnPtr<GraphicsContext> m_rootLayerGraphicsContext;
198#endif
199
200    // Maximum texture dimensions supported.
201    int m_maxTextureSize;
202
203    // Store values that are shared between instances of each layer type
204    // associated with this instance of the compositor. Since there can be
205    // multiple instances of the compositor running in the same renderer process
206    // we cannot store these values in static variables.
207    OwnPtr<GeometryBinding> m_sharedGeometry;
208    OwnPtr<LayerChromium::BorderProgram> m_borderProgram;
209    OwnPtr<CCHeadsUpDisplay::Program> m_headsUpDisplayProgram;
210    OwnPtr<RenderSurfaceChromium::Program> m_renderSurfaceProgram;
211    OwnPtr<RenderSurfaceChromium::MaskProgram> m_renderSurfaceMaskProgram;
212    OwnPtr<LayerTilerChromium::Program> m_tilerProgram;
213    OwnPtr<CCCanvasLayerImpl::Program> m_canvasLayerProgram;
214    OwnPtr<CCVideoLayerImpl::RGBAProgram> m_videoLayerRGBAProgram;
215    OwnPtr<CCVideoLayerImpl::YUVProgram> m_videoLayerYUVProgram;
216    OwnPtr<CCPluginLayerImpl::Program> m_pluginLayerProgram;
217
218    OwnPtr<TextureManager> m_textureManager;
219
220    OwnPtr<CCHeadsUpDisplay> m_headsUpDisplay;
221
222    RefPtr<GraphicsContext3D> m_context;
223    ChildContextMap m_childContexts;
224
225    // If true, the child contexts were copied to the compositor texture targets
226    // and the compositor will need to wait on the proper latches before using
227    // the target textures. If false, the compositor is reusing the textures
228    // from last frame.
229    bool m_childContextsWereCopied;
230
231    bool m_contextSupportsLatch;
232
233    RenderSurfaceChromium* m_defaultRenderSurface;
234};
235
236// Setting DEBUG_GL_CALLS to 1 will call glGetError() after almost every GL
237// call made by the compositor. Useful for debugging rendering issues but
238// will significantly degrade performance.
239#define DEBUG_GL_CALLS 0
240
241#if DEBUG_GL_CALLS && !defined ( NDEBUG )
242#define GLC(context, x) { (x), LayerRendererChromium::debugGLCall(context, #x, __FILE__, __LINE__); }
243#else
244#define GLC(context, x) (x)
245#endif
246
247
248}
249
250#endif // USE(ACCELERATED_COMPOSITING)
251
252#endif
253