Webkit roll 143935:143980
[chromium-blink-merge.git] / cc / gl_renderer.h
blobb59d1a63efa0b4eed0c52279c1cce4361203ad47
1 // Copyright 2010 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #ifndef CC_GL_RENDERER_H_
6 #define CC_GL_RENDERER_H_
8 #include "cc/cc_export.h"
9 #include "cc/checkerboard_draw_quad.h"
10 #include "cc/debug_border_draw_quad.h"
11 #include "cc/direct_renderer.h"
12 #include "cc/gl_renderer_draw_cache.h"
13 #include "cc/io_surface_draw_quad.h"
14 #include "cc/output_surface.h"
15 #include "cc/render_pass_draw_quad.h"
16 #include "cc/renderer.h"
17 #include "cc/solid_color_draw_quad.h"
18 #include "cc/tile_draw_quad.h"
19 #include "cc/yuv_video_draw_quad.h"
20 #include "third_party/WebKit/Source/Platform/chromium/public/WebGraphicsContext3D.h"
21 #include "third_party/WebKit/Source/Platform/chromium/public/WebGraphicsMemoryAllocation.h"
22 #include "ui/gfx/quad_f.h"
24 namespace cc {
26 class ScopedResource;
27 class StreamVideoDrawQuad;
28 class TextureDrawQuad;
29 class GeometryBinding;
30 class ScopedEnsureFramebufferAllocation;
32 // Class that handles drawing of composited render layers using GL.
33 class CC_EXPORT GLRenderer : public DirectRenderer,
34 public NON_EXPORTED_BASE(WebKit::WebGraphicsContext3D::WebGraphicsSwapBuffersCompleteCallbackCHROMIUM),
35 public NON_EXPORTED_BASE(WebKit::WebGraphicsContext3D::WebGraphicsMemoryAllocationChangedCallbackCHROMIUM),
36 public NON_EXPORTED_BASE(WebKit::WebGraphicsContext3D::WebGraphicsContextLostCallback) {
37 public:
38 static scoped_ptr<GLRenderer> create(RendererClient*, OutputSurface*, ResourceProvider*);
40 virtual ~GLRenderer();
42 virtual const RendererCapabilities& capabilities() const OVERRIDE;
44 WebKit::WebGraphicsContext3D* context();
46 virtual void viewportChanged() OVERRIDE;
48 // waits for rendering to finish
49 virtual void finish() OVERRIDE;
51 virtual void doNoOp() OVERRIDE;
52 // puts backbuffer onscreen
53 virtual bool swapBuffers() OVERRIDE;
55 virtual void getFramebufferPixels(void *pixels, const gfx::Rect&) OVERRIDE;
57 virtual bool isContextLost() OVERRIDE;
59 virtual void setVisible(bool) OVERRIDE;
61 virtual void sendManagedMemoryStats(size_t bytesVisible, size_t bytesVisibleAndNearby, size_t bytesAllocated) OVERRIDE;
63 static void debugGLCall(WebKit::WebGraphicsContext3D*, const char* command, const char* file, int line);
65 protected:
66 GLRenderer(RendererClient*, OutputSurface*, ResourceProvider*);
68 bool isBackbufferDiscarded() const { return m_isBackbufferDiscarded; }
69 bool initialize();
71 const gfx::QuadF& sharedGeometryQuad() const { return m_sharedGeometryQuad; }
72 const GeometryBinding* sharedGeometry() const { return m_sharedGeometry.get(); }
74 bool getFramebufferTexture(ScopedResource*, const gfx::Rect& deviceRect);
75 void releaseRenderPassTextures();
77 virtual void bindFramebufferToOutputSurface(DrawingFrame&) OVERRIDE;
78 virtual bool bindFramebufferToTexture(DrawingFrame&, const ScopedResource*, const gfx::Rect& framebufferRect) OVERRIDE;
79 virtual void setDrawViewportSize(const gfx::Size&) OVERRIDE;
80 virtual void setScissorTestRect(const gfx::Rect& scissorRect) OVERRIDE;
81 virtual void clearFramebuffer(DrawingFrame&) OVERRIDE;
82 virtual void drawQuad(DrawingFrame&, const DrawQuad*) OVERRIDE;
83 virtual void beginDrawingFrame(DrawingFrame&) OVERRIDE;
84 virtual void finishDrawingFrame(DrawingFrame&) OVERRIDE;
85 virtual bool flippedFramebuffer() const OVERRIDE;
86 virtual void ensureScissorTestEnabled() OVERRIDE;
87 virtual void ensureScissorTestDisabled() OVERRIDE;
88 virtual void finishDrawingQuadList() OVERRIDE;
90 private:
91 static void toGLMatrix(float*, const gfx::Transform&);
92 static ManagedMemoryPolicy::PriorityCutoff priorityCutoff(WebKit::WebGraphicsMemoryAllocation::PriorityCutoff);
94 void drawCheckerboardQuad(const DrawingFrame&, const CheckerboardDrawQuad*);
95 void drawDebugBorderQuad(const DrawingFrame&, const DebugBorderDrawQuad*);
96 scoped_ptr<ScopedResource> drawBackgroundFilters(
97 DrawingFrame&, const RenderPassDrawQuad*,
98 const gfx::Transform& contentsDeviceTransform,
99 const gfx::Transform& contentsDeviceTransformInverse);
100 void drawRenderPassQuad(DrawingFrame&, const RenderPassDrawQuad*);
101 void drawSolidColorQuad(const DrawingFrame&, const SolidColorDrawQuad*);
102 void drawStreamVideoQuad(const DrawingFrame&, const StreamVideoDrawQuad*);
103 void drawTextureQuad(const DrawingFrame&, const TextureDrawQuad*);
104 void enqueueTextureQuad(const DrawingFrame&, const TextureDrawQuad*);
105 void flushTextureQuadCache();
106 void drawIOSurfaceQuad(const DrawingFrame&, const IOSurfaceDrawQuad*);
107 void drawTileQuad(const DrawingFrame&, const TileDrawQuad*);
108 void drawYUVVideoQuad(const DrawingFrame&, const YUVVideoDrawQuad*);
110 void setShaderOpacity(float opacity, int alphaLocation);
111 void setShaderQuadF(const gfx::QuadF&, int quadLocation);
112 void drawQuadGeometry(const DrawingFrame&, const gfx::Transform& drawTransform, const gfx::RectF& quadRect, int matrixLocation);
113 void setBlendEnabled(bool enabled);
114 void setUseProgram(unsigned program);
116 void copyTextureToFramebuffer(const DrawingFrame&, int textureId, const gfx::Rect&, const gfx::Transform& drawMatrix);
118 bool useScopedTexture(DrawingFrame&, const ScopedResource*, const gfx::Rect& viewportRect);
120 bool makeContextCurrent();
122 bool initializeSharedObjects();
123 void cleanupSharedObjects();
125 // WebKit::WebGraphicsContext3D::WebGraphicsSwapBuffersCompleteCallbackCHROMIUM implementation.
126 virtual void onSwapBuffersComplete() OVERRIDE;
128 // WebKit::WebGraphicsContext3D::WebGraphicsMemoryAllocationChangedCallbackCHROMIUM implementation.
129 virtual void onMemoryAllocationChanged(WebKit::WebGraphicsMemoryAllocation) OVERRIDE;
130 void discardBackbuffer();
131 void ensureBackbuffer();
132 void enforceMemoryPolicy();
134 // WebGraphicsContext3D::WebGraphicsContextLostCallback implementation.
135 virtual void onContextLost() OVERRIDE;
137 RendererCapabilities m_capabilities;
139 unsigned m_offscreenFramebufferId;
141 scoped_ptr<GeometryBinding> m_sharedGeometry;
142 gfx::QuadF m_sharedGeometryQuad;
144 // This block of bindings defines all of the programs used by the compositor itself.
146 // Tiled layer shaders.
147 typedef ProgramBinding<VertexShaderTile, FragmentShaderRGBATexAlpha> TileProgram;
148 typedef ProgramBinding<VertexShaderTile, FragmentShaderRGBATexClampAlphaAA> TileProgramAA;
149 typedef ProgramBinding<VertexShaderTile, FragmentShaderRGBATexClampSwizzleAlphaAA> TileProgramSwizzleAA;
150 typedef ProgramBinding<VertexShaderTile, FragmentShaderRGBATexOpaque> TileProgramOpaque;
151 typedef ProgramBinding<VertexShaderTile, FragmentShaderRGBATexSwizzleAlpha> TileProgramSwizzle;
152 typedef ProgramBinding<VertexShaderTile, FragmentShaderRGBATexSwizzleOpaque> TileProgramSwizzleOpaque;
153 typedef ProgramBinding<VertexShaderPosTex, FragmentShaderCheckerboard> TileCheckerboardProgram;
155 // Render surface shaders.
156 typedef ProgramBinding<VertexShaderPosTexTransform, FragmentShaderRGBATexAlpha> RenderPassProgram;
157 typedef ProgramBinding<VertexShaderPosTexTransform, FragmentShaderRGBATexAlphaMask> RenderPassMaskProgram;
158 typedef ProgramBinding<VertexShaderQuad, FragmentShaderRGBATexAlphaAA> RenderPassProgramAA;
159 typedef ProgramBinding<VertexShaderQuad, FragmentShaderRGBATexAlphaMaskAA> RenderPassMaskProgramAA;
161 // Texture shaders.
162 typedef ProgramBinding<VertexShaderPosTexTransform, FragmentShaderRGBATexVaryingAlpha> TextureProgram;
163 typedef ProgramBinding<VertexShaderPosTexTransform, FragmentShaderRGBATexFlipVaryingAlpha> TextureProgramFlip;
164 typedef ProgramBinding<VertexShaderPosTexTransform, FragmentShaderRGBATexRectVaryingAlpha> TextureIOSurfaceProgram;
166 // Video shaders.
167 typedef ProgramBinding<VertexShaderVideoTransform, FragmentShaderOESImageExternal> VideoStreamTextureProgram;
168 typedef ProgramBinding<VertexShaderPosTexYUVStretch, FragmentShaderYUVVideo> VideoYUVProgram;
170 // Special purpose / effects shaders.
171 typedef ProgramBinding<VertexShaderPos, FragmentShaderColor> SolidColorProgram;
173 const TileProgram* tileProgram();
174 const TileProgramOpaque* tileProgramOpaque();
175 const TileProgramAA* tileProgramAA();
176 const TileProgramSwizzle* tileProgramSwizzle();
177 const TileProgramSwizzleOpaque* tileProgramSwizzleOpaque();
178 const TileProgramSwizzleAA* tileProgramSwizzleAA();
179 const TileCheckerboardProgram* tileCheckerboardProgram();
181 const RenderPassProgram* renderPassProgram();
182 const RenderPassProgramAA* renderPassProgramAA();
183 const RenderPassMaskProgram* renderPassMaskProgram();
184 const RenderPassMaskProgramAA* renderPassMaskProgramAA();
186 const TextureProgram* textureProgram();
187 const TextureProgramFlip* textureProgramFlip();
188 const TextureIOSurfaceProgram* textureIOSurfaceProgram();
190 const VideoYUVProgram* videoYUVProgram();
191 const VideoStreamTextureProgram* videoStreamTextureProgram();
193 const SolidColorProgram* solidColorProgram();
195 scoped_ptr<TileProgram> m_tileProgram;
196 scoped_ptr<TileProgramOpaque> m_tileProgramOpaque;
197 scoped_ptr<TileProgramAA> m_tileProgramAA;
198 scoped_ptr<TileProgramSwizzle> m_tileProgramSwizzle;
199 scoped_ptr<TileProgramSwizzleOpaque> m_tileProgramSwizzleOpaque;
200 scoped_ptr<TileProgramSwizzleAA> m_tileProgramSwizzleAA;
201 scoped_ptr<TileCheckerboardProgram> m_tileCheckerboardProgram;
203 scoped_ptr<RenderPassProgram> m_renderPassProgram;
204 scoped_ptr<RenderPassProgramAA> m_renderPassProgramAA;
205 scoped_ptr<RenderPassMaskProgram> m_renderPassMaskProgram;
206 scoped_ptr<RenderPassMaskProgramAA> m_renderPassMaskProgramAA;
208 scoped_ptr<TextureProgram> m_textureProgram;
209 scoped_ptr<TextureProgramFlip> m_textureProgramFlip;
210 scoped_ptr<TextureIOSurfaceProgram> m_textureIOSurfaceProgram;
212 scoped_ptr<VideoYUVProgram> m_videoYUVProgram;
213 scoped_ptr<VideoStreamTextureProgram> m_videoStreamTextureProgram;
215 scoped_ptr<SolidColorProgram> m_solidColorProgram;
217 OutputSurface* m_outputSurface;
218 WebKit::WebGraphicsContext3D* m_context;
220 gfx::Rect m_swapBufferRect;
221 gfx::Rect m_scissorRect;
222 bool m_isViewportChanged;
223 bool m_isBackbufferDiscarded;
224 bool m_discardBackbufferWhenNotVisible;
225 bool m_isUsingBindUniform;
226 bool m_visible;
227 bool m_isScissorEnabled;
228 bool m_blendShadow;
229 unsigned m_programShadow;
230 TexturedQuadDrawCache m_drawCache;
232 scoped_ptr<ResourceProvider::ScopedWriteLockGL> m_currentFramebufferLock;
234 scoped_refptr<ResourceProvider::Fence> m_lastSwapFence;
236 DISALLOW_COPY_AND_ASSIGN(GLRenderer);
240 // Setting DEBUG_GL_CALLS to 1 will call glGetError() after almost every GL
241 // call made by the compositor. Useful for debugging rendering issues but
242 // will significantly degrade performance.
243 #define DEBUG_GL_CALLS 0
245 #if DEBUG_GL_CALLS && !defined(NDEBUG)
246 #define GLC(context, x) (x, GLRenderer::debugGLCall(&*context, #x, __FILE__, __LINE__))
247 #else
248 #define GLC(context, x) (x)
249 #endif
254 #endif // CC_GL_RENDERER_H_