OLD | NEW |
1 // Copyright 2012 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 |
| 5 |
| 6 #ifndef CCRendererGL_h |
| 7 #define CCRendererGL_h |
| 8 |
| 9 #if USE(ACCELERATED_COMPOSITING) |
| 10 |
| 11 #include "base/basictypes.h" |
| 12 #include "CCCheckerboardDrawQuad.h" |
| 13 #include "CCDebugBorderDrawQuad.h" |
| 14 #include "CCDirectRenderer.h" |
| 15 #include "CCIOSurfaceDrawQuad.h" |
| 16 #include "CCRenderPassDrawQuad.h" |
| 17 #include "CCRenderer.h" |
| 18 #include "CCSolidColorDrawQuad.h" |
| 19 #include "CCStreamVideoDrawQuad.h" |
| 20 #include "CCTextureDrawQuad.h" |
| 21 #include "CCTileDrawQuad.h" |
| 22 #include "CCYUVVideoDrawQuad.h" |
| 23 #include "Extensions3DChromium.h" |
| 24 #include <wtf/PassOwnPtr.h> |
| 25 |
| 26 namespace WebKit { |
| 27 class WebGraphicsContext3D; |
| 28 } |
| 29 |
| 30 namespace cc { |
| 31 |
| 32 class CCScopedTexture; |
| 33 class GeometryBinding; |
| 34 class ScopedEnsureFramebufferAllocation; |
| 35 |
| 36 // Class that handles drawing of composited render layers using GL. |
| 37 class CCRendererGL : public CCDirectRenderer, |
| 38 public WebKit::WebGraphicsContext3D::WebGraphicsSwapBuffers
CompleteCallbackCHROMIUM, |
| 39 public WebKit::WebGraphicsContext3D::WebGraphicsMemoryAlloc
ationChangedCallbackCHROMIUM , |
| 40 public WebKit::WebGraphicsContext3D::WebGraphicsContextLost
Callback { |
| 41 public: |
| 42 static PassOwnPtr<CCRendererGL> create(CCRendererClient*, CCResourceProvider
*); |
| 43 |
| 44 virtual ~CCRendererGL(); |
| 45 |
| 46 virtual const RendererCapabilities& capabilities() const OVERRIDE; |
| 47 |
| 48 WebKit::WebGraphicsContext3D* context(); |
| 49 |
| 50 virtual void viewportChanged() OVERRIDE; |
| 51 |
| 52 const FloatQuad& sharedGeometryQuad() const { return m_sharedGeometryQuad; } |
| 53 |
| 54 // waits for rendering to finish |
| 55 virtual void finish() OVERRIDE; |
| 56 |
| 57 virtual void doNoOp() OVERRIDE; |
| 58 // puts backbuffer onscreen |
| 59 virtual bool swapBuffers() OVERRIDE; |
| 60 |
| 61 static void debugGLCall(WebKit::WebGraphicsContext3D*, const char* command,
const char* file, int line); |
| 62 |
| 63 const GeometryBinding* sharedGeometry() const { return m_sharedGeometry.get(
); } |
| 64 |
| 65 virtual void getFramebufferPixels(void *pixels, const IntRect&) OVERRIDE; |
| 66 bool getFramebufferTexture(CCScopedTexture*, const IntRect& deviceRect); |
| 67 |
| 68 virtual bool isContextLost() OVERRIDE; |
| 69 |
| 70 virtual void setVisible(bool) OVERRIDE; |
| 71 |
| 72 protected: |
| 73 CCRendererGL(CCRendererClient*, CCResourceProvider*); |
| 74 |
| 75 bool isFramebufferDiscarded() const { return m_isFramebufferDiscarded; } |
| 76 bool initialize(); |
| 77 |
| 78 void releaseRenderPassTextures(); |
| 79 |
| 80 virtual void bindFramebufferToOutputSurface(DrawingFrame&) OVERRIDE; |
| 81 virtual bool bindFramebufferToTexture(DrawingFrame&, const CCScopedTexture*,
const IntRect& framebufferRect) OVERRIDE; |
| 82 virtual void setDrawViewportSize(const IntSize&) OVERRIDE; |
| 83 virtual void enableScissorTestRect(const IntRect& scissorRect) OVERRIDE; |
| 84 virtual void disableScissorTest() OVERRIDE; |
| 85 virtual void clearFramebuffer(DrawingFrame&) OVERRIDE; |
| 86 virtual void drawQuad(DrawingFrame&, const CCDrawQuad*) OVERRIDE; |
| 87 virtual void beginDrawingFrame(DrawingFrame&) OVERRIDE; |
| 88 virtual void finishDrawingFrame(DrawingFrame&) OVERRIDE; |
| 89 virtual bool flippedFramebuffer() const OVERRIDE; |
| 90 |
| 91 private: |
| 92 static void toGLMatrix(float*, const WebKit::WebTransformationMatrix&); |
| 93 |
| 94 void drawCheckerboardQuad(const DrawingFrame&, const CCCheckerboardDrawQuad*
); |
| 95 void drawDebugBorderQuad(const DrawingFrame&, const CCDebugBorderDrawQuad*); |
| 96 PassOwnPtr<CCScopedTexture> drawBackgroundFilters(DrawingFrame&, const CCRen
derPassDrawQuad*, const WebKit::WebFilterOperations&, const WebKit::WebTransform
ationMatrix& deviceTransform); |
| 97 void drawRenderPassQuad(DrawingFrame&, const CCRenderPassDrawQuad*); |
| 98 void drawSolidColorQuad(const DrawingFrame&, const CCSolidColorDrawQuad*); |
| 99 void drawStreamVideoQuad(const DrawingFrame&, const CCStreamVideoDrawQuad*); |
| 100 void drawTextureQuad(const DrawingFrame&, const CCTextureDrawQuad*); |
| 101 void drawIOSurfaceQuad(const DrawingFrame&, const CCIOSurfaceDrawQuad*); |
| 102 void drawTileQuad(const DrawingFrame&, const CCTileDrawQuad*); |
| 103 void drawYUVVideoQuad(const DrawingFrame&, const CCYUVVideoDrawQuad*); |
| 104 |
| 105 void setShaderOpacity(float opacity, int alphaLocation); |
| 106 void setShaderFloatQuad(const FloatQuad&, int quadLocation); |
| 107 void drawQuadGeometry(const DrawingFrame&, const WebKit::WebTransformationMa
trix& drawTransform, const FloatRect& quadRect, int matrixLocation); |
| 108 |
| 109 void copyTextureToFramebuffer(const DrawingFrame&, int textureId, const IntR
ect&, const WebKit::WebTransformationMatrix& drawMatrix); |
| 110 |
| 111 bool useScopedTexture(DrawingFrame&, const CCScopedTexture*, const IntRect&
viewportRect); |
| 112 |
| 113 bool makeContextCurrent(); |
| 114 |
| 115 bool initializeSharedObjects(); |
| 116 void cleanupSharedObjects(); |
| 117 |
| 118 // WebKit::WebGraphicsContext3D::WebGraphicsSwapBuffersCompleteCallbackCHROM
IUM implementation. |
| 119 virtual void onSwapBuffersComplete() OVERRIDE; |
| 120 |
| 121 // WebKit::WebGraphicsContext3D::WebGraphicsMemoryAllocationChangedCallbackC
HROMIUM implementation. |
| 122 virtual void onMemoryAllocationChanged(WebKit::WebGraphicsMemoryAllocation)
OVERRIDE; |
| 123 void onMemoryAllocationChangedOnImplThread(WebKit::WebGraphicsMemoryAllocati
on); |
| 124 void discardFramebuffer(); |
| 125 void ensureFramebuffer(); |
| 126 |
| 127 // WebGraphicsContext3D::WebGraphicsContextLostCallback implementation. |
| 128 virtual void onContextLost() OVERRIDE; |
| 129 |
| 130 RendererCapabilities m_capabilities; |
| 131 |
| 132 unsigned m_offscreenFramebufferId; |
| 133 |
| 134 OwnPtr<GeometryBinding> m_sharedGeometry; |
| 135 FloatQuad m_sharedGeometryQuad; |
| 136 |
| 137 // This block of bindings defines all of the programs used by the compositor
itself. |
| 138 |
| 139 // Tiled layer shaders. |
| 140 typedef ProgramBinding<VertexShaderTile, FragmentShaderRGBATexAlpha> TilePro
gram; |
| 141 typedef ProgramBinding<VertexShaderTile, FragmentShaderRGBATexClampAlphaAA>
TileProgramAA; |
| 142 typedef ProgramBinding<VertexShaderTile, FragmentShaderRGBATexClampSwizzleAl
phaAA> TileProgramSwizzleAA; |
| 143 typedef ProgramBinding<VertexShaderTile, FragmentShaderRGBATexOpaque> TilePr
ogramOpaque; |
| 144 typedef ProgramBinding<VertexShaderTile, FragmentShaderRGBATexSwizzleAlpha>
TileProgramSwizzle; |
| 145 typedef ProgramBinding<VertexShaderTile, FragmentShaderRGBATexSwizzleOpaque>
TileProgramSwizzleOpaque; |
| 146 typedef ProgramBinding<VertexShaderPosTex, FragmentShaderCheckerboard> TileC
heckerboardProgram; |
| 147 |
| 148 // Render surface shaders. |
| 149 typedef ProgramBinding<VertexShaderPosTex, FragmentShaderRGBATexAlpha> Rende
rPassProgram; |
| 150 typedef ProgramBinding<VertexShaderPosTex, FragmentShaderRGBATexAlphaMask> R
enderPassMaskProgram; |
| 151 typedef ProgramBinding<VertexShaderQuad, FragmentShaderRGBATexAlphaAA> Rende
rPassProgramAA; |
| 152 typedef ProgramBinding<VertexShaderQuad, FragmentShaderRGBATexAlphaMaskAA> R
enderPassMaskProgramAA; |
| 153 |
| 154 // Texture shaders. |
| 155 typedef ProgramBinding<VertexShaderPosTexTransform, FragmentShaderRGBATexAlp
ha> TextureProgram; |
| 156 typedef ProgramBinding<VertexShaderPosTexTransform, FragmentShaderRGBATexFli
pAlpha> TextureProgramFlip; |
| 157 typedef ProgramBinding<VertexShaderPosTexTransform, FragmentShaderRGBATexRec
tAlpha> TextureIOSurfaceProgram; |
| 158 |
| 159 // Video shaders. |
| 160 typedef ProgramBinding<VertexShaderVideoTransform, FragmentShaderOESImageExt
ernal> VideoStreamTextureProgram; |
| 161 typedef ProgramBinding<VertexShaderPosTexYUVStretch, FragmentShaderYUVVideo>
VideoYUVProgram; |
| 162 |
| 163 // Special purpose / effects shaders. |
| 164 typedef ProgramBinding<VertexShaderPos, FragmentShaderColor> SolidColorProgr
am; |
| 165 |
| 166 const TileProgram* tileProgram(); |
| 167 const TileProgramOpaque* tileProgramOpaque(); |
| 168 const TileProgramAA* tileProgramAA(); |
| 169 const TileProgramSwizzle* tileProgramSwizzle(); |
| 170 const TileProgramSwizzleOpaque* tileProgramSwizzleOpaque(); |
| 171 const TileProgramSwizzleAA* tileProgramSwizzleAA(); |
| 172 const TileCheckerboardProgram* tileCheckerboardProgram(); |
| 173 |
| 174 const RenderPassProgram* renderPassProgram(); |
| 175 const RenderPassProgramAA* renderPassProgramAA(); |
| 176 const RenderPassMaskProgram* renderPassMaskProgram(); |
| 177 const RenderPassMaskProgramAA* renderPassMaskProgramAA(); |
| 178 |
| 179 const TextureProgram* textureProgram(); |
| 180 const TextureProgramFlip* textureProgramFlip(); |
| 181 const TextureIOSurfaceProgram* textureIOSurfaceProgram(); |
| 182 |
| 183 const VideoYUVProgram* videoYUVProgram(); |
| 184 const VideoStreamTextureProgram* videoStreamTextureProgram(); |
| 185 |
| 186 const SolidColorProgram* solidColorProgram(); |
| 187 |
| 188 OwnPtr<TileProgram> m_tileProgram; |
| 189 OwnPtr<TileProgramOpaque> m_tileProgramOpaque; |
| 190 OwnPtr<TileProgramAA> m_tileProgramAA; |
| 191 OwnPtr<TileProgramSwizzle> m_tileProgramSwizzle; |
| 192 OwnPtr<TileProgramSwizzleOpaque> m_tileProgramSwizzleOpaque; |
| 193 OwnPtr<TileProgramSwizzleAA> m_tileProgramSwizzleAA; |
| 194 OwnPtr<TileCheckerboardProgram> m_tileCheckerboardProgram; |
| 195 |
| 196 OwnPtr<RenderPassProgram> m_renderPassProgram; |
| 197 OwnPtr<RenderPassProgramAA> m_renderPassProgramAA; |
| 198 OwnPtr<RenderPassMaskProgram> m_renderPassMaskProgram; |
| 199 OwnPtr<RenderPassMaskProgramAA> m_renderPassMaskProgramAA; |
| 200 |
| 201 OwnPtr<TextureProgram> m_textureProgram; |
| 202 OwnPtr<TextureProgramFlip> m_textureProgramFlip; |
| 203 OwnPtr<TextureIOSurfaceProgram> m_textureIOSurfaceProgram; |
| 204 |
| 205 OwnPtr<VideoYUVProgram> m_videoYUVProgram; |
| 206 OwnPtr<VideoStreamTextureProgram> m_videoStreamTextureProgram; |
| 207 |
| 208 OwnPtr<SolidColorProgram> m_solidColorProgram; |
| 209 |
| 210 WebKit::WebGraphicsContext3D* m_context; |
| 211 |
| 212 IntRect m_swapBufferRect; |
| 213 bool m_isViewportChanged; |
| 214 bool m_isFramebufferDiscarded; |
| 215 bool m_isUsingBindUniform; |
| 216 bool m_visible; |
| 217 |
| 218 OwnPtr<CCResourceProvider::ScopedWriteLockGL> m_currentFramebufferLock; |
| 219 |
| 220 DISALLOW_COPY_AND_ASSIGN(CCRendererGL); |
| 221 }; |
| 222 |
| 223 |
| 224 // Setting DEBUG_GL_CALLS to 1 will call glGetError() after almost every GL |
| 225 // call made by the compositor. Useful for debugging rendering issues but |
| 226 // will significantly degrade performance. |
| 227 #define DEBUG_GL_CALLS 0 |
| 228 |
| 229 #if DEBUG_GL_CALLS && !defined ( NDEBUG ) |
| 230 #define GLC(context, x) (x, CCRendererGL::debugGLCall(&*context, #x, __FILE__, _
_LINE__)) |
| 231 #else |
| 232 #define GLC(context, x) (x) |
| 233 #endif |
| 234 |
| 235 |
| 236 } |
| 237 |
| 238 #endif // USE(ACCELERATED_COMPOSITING) |
| 239 |
| 240 #endif |
OLD | NEW |