OLD | NEW |
1 // Copyright 2010 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 | 4 |
5 #ifndef CC_OUTPUT_GL_RENDERER_H_ | 5 #ifndef CC_OUTPUT_GL_RENDERER_H_ |
6 #define CC_OUTPUT_GL_RENDERER_H_ | 6 #define CC_OUTPUT_GL_RENDERER_H_ |
7 | 7 |
8 #include "base/cancelable_callback.h" | 8 #include "base/cancelable_callback.h" |
9 #include "cc/base/cc_export.h" | 9 #include "cc/base/cc_export.h" |
10 #include "cc/base/scoped_ptr_deque.h" | 10 #include "cc/base/scoped_ptr_deque.h" |
(...skipping 21 matching lines...) Expand all Loading... |
32 | 32 |
33 namespace cc { | 33 namespace cc { |
34 | 34 |
35 class GLRendererShaderTest; | 35 class GLRendererShaderTest; |
36 class OutputSurface; | 36 class OutputSurface; |
37 class PictureDrawQuad; | 37 class PictureDrawQuad; |
38 class ScopedResource; | 38 class ScopedResource; |
39 class StreamVideoDrawQuad; | 39 class StreamVideoDrawQuad; |
40 class TextureDrawQuad; | 40 class TextureDrawQuad; |
41 class TextureMailboxDeleter; | 41 class TextureMailboxDeleter; |
42 class StaticGeometryBinding; | 42 class GeometryBinding; |
43 class DynamicGeometryBinding; | |
44 class ScopedEnsureFramebufferAllocation; | 43 class ScopedEnsureFramebufferAllocation; |
45 | 44 |
46 // Class that handles drawing of composited render layers using GL. | 45 // Class that handles drawing of composited render layers using GL. |
47 class CC_EXPORT GLRenderer : public DirectRenderer { | 46 class CC_EXPORT GLRenderer : public DirectRenderer { |
48 public: | 47 public: |
49 class ScopedUseGrContext; | 48 class ScopedUseGrContext; |
50 | 49 |
51 static scoped_ptr<GLRenderer> Create( | 50 static scoped_ptr<GLRenderer> Create( |
52 RendererClient* client, | 51 RendererClient* client, |
53 const RendererSettings* settings, | 52 const RendererSettings* settings, |
(...skipping 25 matching lines...) Expand all Loading... |
79 OutputSurface* output_surface, | 78 OutputSurface* output_surface, |
80 ResourceProvider* resource_provider, | 79 ResourceProvider* resource_provider, |
81 TextureMailboxDeleter* texture_mailbox_deleter, | 80 TextureMailboxDeleter* texture_mailbox_deleter, |
82 int highp_threshold_min); | 81 int highp_threshold_min); |
83 | 82 |
84 void DidChangeVisibility() override; | 83 void DidChangeVisibility() override; |
85 | 84 |
86 bool IsBackbufferDiscarded() const { return is_backbuffer_discarded_; } | 85 bool IsBackbufferDiscarded() const { return is_backbuffer_discarded_; } |
87 | 86 |
88 const gfx::QuadF& SharedGeometryQuad() const { return shared_geometry_quad_; } | 87 const gfx::QuadF& SharedGeometryQuad() const { return shared_geometry_quad_; } |
89 const StaticGeometryBinding* SharedGeometry() const { | 88 const GeometryBinding* SharedGeometry() const { |
90 return shared_geometry_.get(); | 89 return shared_geometry_.get(); |
91 } | 90 } |
92 | 91 |
93 void GetFramebufferPixelsAsync(const DrawingFrame* frame, | 92 void GetFramebufferPixelsAsync(const DrawingFrame* frame, |
94 const gfx::Rect& rect, | 93 const gfx::Rect& rect, |
95 scoped_ptr<CopyOutputRequest> request); | 94 scoped_ptr<CopyOutputRequest> request); |
96 void GetFramebufferTexture(unsigned texture_id, | 95 void GetFramebufferTexture(unsigned texture_id, |
97 ResourceFormat texture_format, | 96 ResourceFormat texture_format, |
98 const gfx::Rect& device_rect); | 97 const gfx::Rect& device_rect); |
99 void ReleaseRenderPassTextures(); | 98 void ReleaseRenderPassTextures(); |
100 enum BoundGeometry { NO_BINDING, SHARED_BINDING, CLIPPED_BINDING }; | 99 |
101 void PrepareGeometry(BoundGeometry geometry_to_bind); | |
102 void SetStencilEnabled(bool enabled); | 100 void SetStencilEnabled(bool enabled); |
103 bool stencil_enabled() const { return stencil_shadow_; } | 101 bool stencil_enabled() const { return stencil_shadow_; } |
104 void SetBlendEnabled(bool enabled); | 102 void SetBlendEnabled(bool enabled); |
105 bool blend_enabled() const { return blend_shadow_; } | 103 bool blend_enabled() const { return blend_shadow_; } |
106 | 104 |
107 void BindFramebufferToOutputSurface(DrawingFrame* frame) override; | 105 void BindFramebufferToOutputSurface(DrawingFrame* frame) override; |
108 bool BindFramebufferToTexture(DrawingFrame* frame, | 106 bool BindFramebufferToTexture(DrawingFrame* frame, |
109 const ScopedResource* resource, | 107 const ScopedResource* resource, |
110 const gfx::Rect& target_rect) override; | 108 const gfx::Rect& target_rect) override; |
111 void SetDrawViewport(const gfx::Rect& window_space_viewport) override; | 109 void SetDrawViewport(const gfx::Rect& window_space_viewport) override; |
112 void SetScissorTestRect(const gfx::Rect& scissor_rect) override; | 110 void SetScissorTestRect(const gfx::Rect& scissor_rect) override; |
113 void DiscardPixels(bool has_external_stencil_test, | 111 void DiscardPixels(bool has_external_stencil_test, |
114 bool draw_rect_covers_full_surface) override; | 112 bool draw_rect_covers_full_surface) override; |
115 void ClearFramebuffer(DrawingFrame* frame, | 113 void ClearFramebuffer(DrawingFrame* frame, |
116 bool has_external_stencil_test) override; | 114 bool has_external_stencil_test) override; |
117 void DoDrawQuad(DrawingFrame* frame, | 115 void DoDrawQuad(DrawingFrame* frame, const class DrawQuad*) override; |
118 const class DrawQuad*, | |
119 const gfx::QuadF* draw_region) override; | |
120 void BeginDrawingFrame(DrawingFrame* frame) override; | 116 void BeginDrawingFrame(DrawingFrame* frame) override; |
121 void FinishDrawingFrame(DrawingFrame* frame) override; | 117 void FinishDrawingFrame(DrawingFrame* frame) override; |
122 bool FlippedFramebuffer(const DrawingFrame* frame) const override; | 118 bool FlippedFramebuffer(const DrawingFrame* frame) const override; |
123 bool FlippedRootFramebuffer() const; | 119 bool FlippedRootFramebuffer() const; |
124 void EnsureScissorTestEnabled() override; | 120 void EnsureScissorTestEnabled() override; |
125 void EnsureScissorTestDisabled() override; | 121 void EnsureScissorTestDisabled() override; |
126 void CopyCurrentRenderPassToBitmap( | 122 void CopyCurrentRenderPassToBitmap( |
127 DrawingFrame* frame, | 123 DrawingFrame* frame, |
128 scoped_ptr<CopyOutputRequest> request) override; | 124 scoped_ptr<CopyOutputRequest> request) override; |
129 void FinishDrawingQuadList() override; | 125 void FinishDrawingQuadList() override; |
130 | 126 |
131 // Returns true if quad requires antialiasing and false otherwise. | 127 // Returns true if quad requires antialiasing and false otherwise. |
132 static bool ShouldAntialiasQuad(const gfx::Transform& device_transform, | 128 static bool ShouldAntialiasQuad(const gfx::Transform& device_transform, |
133 const DrawQuad* quad, | 129 const DrawQuad* quad, |
134 bool force_antialiasing); | 130 bool force_antialiasing); |
135 | 131 |
136 // Inflate the quad and fill edge array for fragment shader. | 132 // Inflate the quad and fill edge array for fragment shader. |
137 // |local_quad| is set to inflated quad. |edge| array is filled with | 133 // |local_quad| is set to inflated quad. |edge| array is filled with |
138 // inflated quad's edge data. | 134 // inflated quad's edge data. |
139 static void SetupQuadForClippingAndAntialiasing( | 135 static void SetupQuadForAntialiasing(const gfx::Transform& device_transform, |
140 const gfx::Transform& device_transform, | 136 const DrawQuad* quad, |
141 const DrawQuad* quad, | 137 gfx::QuadF* local_quad, |
142 bool use_aa, | 138 float edge[24]); |
143 const gfx::QuadF* clip_region, | |
144 gfx::QuadF* local_quad, | |
145 float edge[24]); | |
146 | 139 |
147 private: | 140 private: |
148 friend class GLRendererShaderPixelTest; | 141 friend class GLRendererShaderPixelTest; |
149 friend class GLRendererShaderTest; | 142 friend class GLRendererShaderTest; |
150 | 143 |
151 static void ToGLMatrix(float* gl_matrix, const gfx::Transform& transform); | 144 static void ToGLMatrix(float* gl_matrix, const gfx::Transform& transform); |
152 | 145 |
153 void DrawCheckerboardQuad(const DrawingFrame* frame, | 146 void DrawCheckerboardQuad(const DrawingFrame* frame, |
154 const CheckerboardDrawQuad* quad, | 147 const CheckerboardDrawQuad* quad); |
155 const gfx::QuadF* clip_region); | |
156 void DrawDebugBorderQuad(const DrawingFrame* frame, | 148 void DrawDebugBorderQuad(const DrawingFrame* frame, |
157 const DebugBorderDrawQuad* quad); | 149 const DebugBorderDrawQuad* quad); |
158 static bool IsDefaultBlendMode(SkXfermode::Mode blend_mode) { | 150 static bool IsDefaultBlendMode(SkXfermode::Mode blend_mode) { |
159 return blend_mode == SkXfermode::kSrcOver_Mode; | 151 return blend_mode == SkXfermode::kSrcOver_Mode; |
160 } | 152 } |
161 bool CanApplyBlendModeUsingBlendFunc(SkXfermode::Mode blend_mode); | 153 bool CanApplyBlendModeUsingBlendFunc(SkXfermode::Mode blend_mode); |
162 void ApplyBlendModeUsingBlendFunc(SkXfermode::Mode blend_mode); | 154 void ApplyBlendModeUsingBlendFunc(SkXfermode::Mode blend_mode); |
163 void RestoreBlendFuncToDefault(SkXfermode::Mode blend_mode); | 155 void RestoreBlendFuncToDefault(SkXfermode::Mode blend_mode); |
164 | 156 |
165 gfx::Rect GetBackdropBoundingBoxForRenderPassQuad( | 157 gfx::Rect GetBackdropBoundingBoxForRenderPassQuad( |
166 DrawingFrame* frame, | 158 DrawingFrame* frame, |
167 const RenderPassDrawQuad* quad, | 159 const RenderPassDrawQuad* quad, |
168 const gfx::Transform& contents_device_transform, | 160 const gfx::Transform& contents_device_transform, |
169 const gfx::QuadF* clip_region, | |
170 bool use_aa); | 161 bool use_aa); |
171 scoped_ptr<ScopedResource> GetBackdropTexture(const gfx::Rect& bounding_rect); | 162 scoped_ptr<ScopedResource> GetBackdropTexture(const gfx::Rect& bounding_rect); |
172 | 163 |
173 static bool ShouldApplyBackgroundFilters(DrawingFrame* frame, | 164 static bool ShouldApplyBackgroundFilters(DrawingFrame* frame, |
174 const RenderPassDrawQuad* quad); | 165 const RenderPassDrawQuad* quad); |
175 skia::RefPtr<SkImage> ApplyBackgroundFilters( | 166 skia::RefPtr<SkImage> ApplyBackgroundFilters( |
176 DrawingFrame* frame, | 167 DrawingFrame* frame, |
177 const RenderPassDrawQuad* quad, | 168 const RenderPassDrawQuad* quad, |
178 ScopedResource* background_texture); | 169 ScopedResource* background_texture); |
179 | 170 |
180 void DrawRenderPassQuad(DrawingFrame* frame, | 171 void DrawRenderPassQuad(DrawingFrame* frame, const RenderPassDrawQuad* quad); |
181 const RenderPassDrawQuad* quadi, | |
182 const gfx::QuadF* clip_region); | |
183 void DrawSolidColorQuad(const DrawingFrame* frame, | 172 void DrawSolidColorQuad(const DrawingFrame* frame, |
184 const SolidColorDrawQuad* quad, | 173 const SolidColorDrawQuad* quad); |
185 const gfx::QuadF* clip_region); | |
186 void DrawStreamVideoQuad(const DrawingFrame* frame, | 174 void DrawStreamVideoQuad(const DrawingFrame* frame, |
187 const StreamVideoDrawQuad* quad, | 175 const StreamVideoDrawQuad* quad); |
188 const gfx::QuadF* clip_region); | |
189 void DrawTextureQuad(const DrawingFrame* frame, | |
190 const TextureDrawQuad* quad, | |
191 const gfx::QuadF* clip_region); | |
192 void EnqueueTextureQuad(const DrawingFrame* frame, | 176 void EnqueueTextureQuad(const DrawingFrame* frame, |
193 const TextureDrawQuad* quad, | 177 const TextureDrawQuad* quad); |
194 const gfx::QuadF* clip_region); | 178 void FlushTextureQuadCache(); |
195 void FlushTextureQuadCache(BoundGeometry flush_binding); | |
196 void DrawIOSurfaceQuad(const DrawingFrame* frame, | 179 void DrawIOSurfaceQuad(const DrawingFrame* frame, |
197 const IOSurfaceDrawQuad* quad, | 180 const IOSurfaceDrawQuad* quad); |
198 const gfx::QuadF* clip_region); | 181 void DrawTileQuad(const DrawingFrame* frame, const TileDrawQuad* quad); |
199 void DrawTileQuad(const DrawingFrame* frame, | |
200 const TileDrawQuad* quad, | |
201 const gfx::QuadF* clip_region); | |
202 void DrawContentQuad(const DrawingFrame* frame, | 182 void DrawContentQuad(const DrawingFrame* frame, |
203 const ContentDrawQuadBase* quad, | 183 const ContentDrawQuadBase* quad, |
204 ResourceProvider::ResourceId resource_id, | 184 ResourceProvider::ResourceId resource_id); |
205 const gfx::QuadF* clip_region); | |
206 void DrawContentQuadAA(const DrawingFrame* frame, | 185 void DrawContentQuadAA(const DrawingFrame* frame, |
207 const ContentDrawQuadBase* quad, | 186 const ContentDrawQuadBase* quad, |
208 ResourceProvider::ResourceId resource_id, | 187 ResourceProvider::ResourceId resource_id, |
209 const gfx::Transform& device_transform, | 188 const gfx::Transform& device_transform); |
210 const gfx::QuadF* clip_region); | |
211 void DrawContentQuadNoAA(const DrawingFrame* frame, | 189 void DrawContentQuadNoAA(const DrawingFrame* frame, |
212 const ContentDrawQuadBase* quad, | 190 const ContentDrawQuadBase* quad, |
213 ResourceProvider::ResourceId resource_id, | 191 ResourceProvider::ResourceId resource_id); |
214 const gfx::QuadF* clip_region); | |
215 void DrawYUVVideoQuad(const DrawingFrame* frame, | 192 void DrawYUVVideoQuad(const DrawingFrame* frame, |
216 const YUVVideoDrawQuad* quad, | 193 const YUVVideoDrawQuad* quad); |
217 const gfx::QuadF* clip_region); | |
218 void DrawPictureQuad(const DrawingFrame* frame, | 194 void DrawPictureQuad(const DrawingFrame* frame, |
219 const PictureDrawQuad* quad, | 195 const PictureDrawQuad* quad); |
220 const gfx::QuadF* clip_region); | |
221 | 196 |
222 void SetShaderOpacity(float opacity, int alpha_location); | 197 void SetShaderOpacity(float opacity, int alpha_location); |
223 void SetShaderQuadF(const gfx::QuadF& quad, int quad_location); | 198 void SetShaderQuadF(const gfx::QuadF& quad, int quad_location); |
224 void DrawQuadGeometryClippedByQuadF(const DrawingFrame* frame, | |
225 const gfx::Transform& draw_transform, | |
226 const gfx::RectF& quad_rect, | |
227 const gfx::QuadF& clipping_region_quad, | |
228 int matrix_location, | |
229 const float uv[8]); | |
230 void DrawQuadGeometry(const DrawingFrame* frame, | 199 void DrawQuadGeometry(const DrawingFrame* frame, |
231 const gfx::Transform& draw_transform, | 200 const gfx::Transform& draw_transform, |
232 const gfx::RectF& quad_rect, | 201 const gfx::RectF& quad_rect, |
233 int matrix_location); | 202 int matrix_location); |
234 void SetUseProgram(unsigned program); | 203 void SetUseProgram(unsigned program); |
235 | 204 |
236 bool UseScopedTexture(DrawingFrame* frame, | 205 bool UseScopedTexture(DrawingFrame* frame, |
237 const ScopedResource* resource, | 206 const ScopedResource* resource, |
238 const gfx::Rect& viewport_rect); | 207 const gfx::Rect& viewport_rect); |
239 | 208 |
(...skipping 21 matching lines...) Expand all Loading... |
261 | 230 |
262 typedef ScopedPtrVector<ResourceProvider::ScopedReadLockGL> | 231 typedef ScopedPtrVector<ResourceProvider::ScopedReadLockGL> |
263 OverlayResourceLockList; | 232 OverlayResourceLockList; |
264 OverlayResourceLockList pending_overlay_resources_; | 233 OverlayResourceLockList pending_overlay_resources_; |
265 OverlayResourceLockList in_use_overlay_resources_; | 234 OverlayResourceLockList in_use_overlay_resources_; |
266 | 235 |
267 RendererCapabilitiesImpl capabilities_; | 236 RendererCapabilitiesImpl capabilities_; |
268 | 237 |
269 unsigned offscreen_framebuffer_id_; | 238 unsigned offscreen_framebuffer_id_; |
270 | 239 |
271 scoped_ptr<StaticGeometryBinding> shared_geometry_; | 240 scoped_ptr<GeometryBinding> shared_geometry_; |
272 scoped_ptr<DynamicGeometryBinding> clipped_geometry_; | |
273 gfx::QuadF shared_geometry_quad_; | 241 gfx::QuadF shared_geometry_quad_; |
274 | 242 |
275 // This block of bindings defines all of the programs used by the compositor | 243 // This block of bindings defines all of the programs used by the compositor |
276 // itself. Add any new programs here to GLRendererShaderTest. | 244 // itself. Add any new programs here to GLRendererShaderTest. |
277 | 245 |
278 // Tiled layer shaders. | 246 // Tiled layer shaders. |
279 typedef ProgramBinding<VertexShaderTile, FragmentShaderRGBATexAlpha> | 247 typedef ProgramBinding<VertexShaderTile, FragmentShaderRGBATexAlpha> |
280 TileProgram; | 248 TileProgram; |
281 typedef ProgramBinding<VertexShaderTileAA, FragmentShaderRGBATexClampAlphaAA> | 249 typedef ProgramBinding<VertexShaderTileAA, FragmentShaderRGBATexClampAlphaAA> |
282 TileProgramAA; | 250 TileProgramAA; |
(...skipping 213 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
496 class SyncQuery; | 464 class SyncQuery; |
497 ScopedPtrDeque<SyncQuery> pending_sync_queries_; | 465 ScopedPtrDeque<SyncQuery> pending_sync_queries_; |
498 ScopedPtrDeque<SyncQuery> available_sync_queries_; | 466 ScopedPtrDeque<SyncQuery> available_sync_queries_; |
499 scoped_ptr<SyncQuery> current_sync_query_; | 467 scoped_ptr<SyncQuery> current_sync_query_; |
500 bool use_sync_query_; | 468 bool use_sync_query_; |
501 bool use_blend_equation_advanced_; | 469 bool use_blend_equation_advanced_; |
502 bool use_blend_equation_advanced_coherent_; | 470 bool use_blend_equation_advanced_coherent_; |
503 | 471 |
504 SkBitmap on_demand_tile_raster_bitmap_; | 472 SkBitmap on_demand_tile_raster_bitmap_; |
505 ResourceProvider::ResourceId on_demand_tile_raster_resource_id_; | 473 ResourceProvider::ResourceId on_demand_tile_raster_resource_id_; |
506 BoundGeometry bound_geometry_; | 474 |
507 DISALLOW_COPY_AND_ASSIGN(GLRenderer); | 475 DISALLOW_COPY_AND_ASSIGN(GLRenderer); |
508 }; | 476 }; |
509 | 477 |
510 // Setting DEBUG_GL_CALLS to 1 will call glGetError() after almost every GL | 478 // Setting DEBUG_GL_CALLS to 1 will call glGetError() after almost every GL |
511 // call made by the compositor. Useful for debugging rendering issues but | 479 // call made by the compositor. Useful for debugging rendering issues but |
512 // will significantly degrade performance. | 480 // will significantly degrade performance. |
513 #define DEBUG_GL_CALLS 0 | 481 #define DEBUG_GL_CALLS 0 |
514 | 482 |
515 #if DEBUG_GL_CALLS && !defined(NDEBUG) | 483 #if DEBUG_GL_CALLS && !defined(NDEBUG) |
516 #define GLC(context, x) \ | 484 #define GLC(context, x) \ |
517 (x, GLRenderer::DebugGLCall(&* context, #x, __FILE__, __LINE__)) | 485 (x, GLRenderer::DebugGLCall(&* context, #x, __FILE__, __LINE__)) |
518 #else | 486 #else |
519 #define GLC(context, x) (x) | 487 #define GLC(context, x) (x) |
520 #endif | 488 #endif |
521 | 489 |
522 } // namespace cc | 490 } // namespace cc |
523 | 491 |
524 #endif // CC_OUTPUT_GL_RENDERER_H_ | 492 #endif // CC_OUTPUT_GL_RENDERER_H_ |
OLD | NEW |