Chromium Code Reviews| 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 #include "cc/gl_renderer.h" | 5 #include "cc/gl_renderer.h" |
| 6 | 6 |
| 7 #include <set> | 7 #include <set> |
| 8 #include <string> | 8 #include <string> |
| 9 #include <vector> | 9 #include <vector> |
| 10 | 10 |
| 11 #include "base/debug/trace_event.h" | 11 #include "base/debug/trace_event.h" |
| 12 #include "base/logging.h" | 12 #include "base/logging.h" |
| 13 #include "base/string_util.h" | 13 #include "base/string_util.h" |
| 14 #include "base/strings/string_split.h" | 14 #include "base/strings/string_split.h" |
| 15 #include "build/build_config.h" | 15 #include "build/build_config.h" |
| 16 #include "cc/compositor_frame.h" | 16 #include "cc/compositor_frame.h" |
| 17 #include "cc/compositor_frame_metadata.h" | 17 #include "cc/compositor_frame_metadata.h" |
| 18 #include "cc/context_provider.h" | 18 #include "cc/context_provider.h" |
| 19 #include "cc/damage_tracker.h" | 19 #include "cc/damage_tracker.h" |
| 20 #include "cc/geometry_binding.h" | 20 #include "cc/geometry_binding.h" |
| 21 #include "cc/gl_frame_data.h" | 21 #include "cc/gl_frame_data.h" |
| 22 #include "cc/layer_quad.h" | 22 #include "cc/layer_quad.h" |
| 23 #include "cc/math_util.h" | 23 #include "cc/math_util.h" |
| 24 #include "cc/output_surface.h" | 24 #include "cc/output_surface.h" |
| 25 #include "cc/picture_draw_quad.h" | |
| 25 #include "cc/priority_calculator.h" | 26 #include "cc/priority_calculator.h" |
| 26 #include "cc/proxy.h" | 27 #include "cc/proxy.h" |
| 27 #include "cc/render_pass.h" | 28 #include "cc/render_pass.h" |
| 28 #include "cc/render_surface_filters.h" | 29 #include "cc/render_surface_filters.h" |
| 29 #include "cc/scoped_resource.h" | 30 #include "cc/scoped_resource.h" |
| 30 #include "cc/single_thread_proxy.h" | 31 #include "cc/single_thread_proxy.h" |
| 31 #include "cc/stream_video_draw_quad.h" | 32 #include "cc/stream_video_draw_quad.h" |
| 32 #include "cc/texture_draw_quad.h" | 33 #include "cc/texture_draw_quad.h" |
| 33 #include "cc/video_layer_impl.h" | 34 #include "cc/video_layer_impl.h" |
| 34 #include "gpu/GLES2/gl2extchromium.h" | 35 #include "gpu/GLES2/gl2extchromium.h" |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 95 : DirectRenderer(client, resource_provider), | 96 : DirectRenderer(client, resource_provider), |
| 96 offscreen_framebuffer_id_(0), | 97 offscreen_framebuffer_id_(0), |
| 97 shared_geometry_quad_(gfx::RectF(-0.5f, -0.5f, 1.0f, 1.0f)), | 98 shared_geometry_quad_(gfx::RectF(-0.5f, -0.5f, 1.0f, 1.0f)), |
| 98 output_surface_(output_surface), | 99 output_surface_(output_surface), |
| 99 context_(output_surface->context3d()), | 100 context_(output_surface->context3d()), |
| 100 is_viewport_changed_(false), | 101 is_viewport_changed_(false), |
| 101 is_backbuffer_discarded_(false), | 102 is_backbuffer_discarded_(false), |
| 102 discard_backbuffer_when_not_visible_(false), | 103 discard_backbuffer_when_not_visible_(false), |
| 103 is_using_bind_uniform_(false), | 104 is_using_bind_uniform_(false), |
| 104 visible_(true), | 105 visible_(true), |
| 105 is_scissor_enabled_(false) { | 106 is_scissor_enabled_(false), |
| 107 on_demand_tile_raster_texture_(0), | |
| 108 on_demand_tile_raster_resource_id_(0) { | |
| 106 DCHECK(context_); | 109 DCHECK(context_); |
| 107 } | 110 } |
| 108 | 111 |
| 109 bool GLRenderer::Initialize() { | 112 bool GLRenderer::Initialize() { |
| 110 if (!context_->makeContextCurrent()) | 113 if (!context_->makeContextCurrent()) |
| 111 return false; | 114 return false; |
| 112 | 115 |
| 113 context_->setContextLostCallback(this); | 116 context_->setContextLostCallback(this); |
| 114 context_->pushGroupMarkerEXT("CompositorContext"); | 117 context_->pushGroupMarkerEXT("CompositorContext"); |
| 115 | 118 |
| (...skipping 196 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 312 break; | 315 break; |
| 313 case DrawQuad::TEXTURE_CONTENT: | 316 case DrawQuad::TEXTURE_CONTENT: |
| 314 EnqueueTextureQuad(frame, TextureDrawQuad::MaterialCast(quad)); | 317 EnqueueTextureQuad(frame, TextureDrawQuad::MaterialCast(quad)); |
| 315 break; | 318 break; |
| 316 case DrawQuad::TILED_CONTENT: | 319 case DrawQuad::TILED_CONTENT: |
| 317 DrawTileQuad(frame, TileDrawQuad::MaterialCast(quad)); | 320 DrawTileQuad(frame, TileDrawQuad::MaterialCast(quad)); |
| 318 break; | 321 break; |
| 319 case DrawQuad::YUV_VIDEO_CONTENT: | 322 case DrawQuad::YUV_VIDEO_CONTENT: |
| 320 DrawYUVVideoQuad(frame, YUVVideoDrawQuad::MaterialCast(quad)); | 323 DrawYUVVideoQuad(frame, YUVVideoDrawQuad::MaterialCast(quad)); |
| 321 break; | 324 break; |
| 325 case DrawQuad::PICTURE_CONTENT: | |
|
danakj
2013/03/14 18:00:56
alphabetical please
Leandro Graciá Gil
2013/03/19 17:30:07
Done.
| |
| 326 DrawPictureQuad(frame, PictureDrawQuad::MaterialCast(quad)); | |
| 327 break; | |
| 322 } | 328 } |
| 323 } | 329 } |
| 324 | 330 |
| 325 void GLRenderer::DrawCheckerboardQuad(const DrawingFrame& frame, | 331 void GLRenderer::DrawCheckerboardQuad(const DrawingFrame& frame, |
| 326 const CheckerboardDrawQuad* quad) { | 332 const CheckerboardDrawQuad* quad) { |
| 327 SetBlendEnabled(quad->ShouldDrawWithBlending()); | 333 SetBlendEnabled(quad->ShouldDrawWithBlending()); |
| 328 | 334 |
| 329 const TileCheckerboardProgram* program = GetTileCheckerboardProgram(); | 335 const TileCheckerboardProgram* program = GetTileCheckerboardProgram(); |
| 330 DCHECK(program && (program->initialized() || IsContextLost())); | 336 DCHECK(program && (program->initialized() || IsContextLost())); |
| 331 SetUseProgram(program->program()); | 337 SetUseProgram(program->program()); |
| (...skipping 646 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 978 } | 984 } |
| 979 } | 985 } |
| 980 | 986 |
| 981 SetUseProgram(uniforms.program); | 987 SetUseProgram(uniforms.program); |
| 982 GLC(Context(), Context()->uniform1i(uniforms.sampler_location, 0)); | 988 GLC(Context(), Context()->uniform1i(uniforms.sampler_location, 0)); |
| 983 bool scaled = (tex_to_geom_scale_x != 1.f || tex_to_geom_scale_y != 1.f); | 989 bool scaled = (tex_to_geom_scale_x != 1.f || tex_to_geom_scale_y != 1.f); |
| 984 GLenum filter = (use_aa || scaled || | 990 GLenum filter = (use_aa || scaled || |
| 985 !quad->quadTransform().IsIdentityOrIntegerTranslation()) | 991 !quad->quadTransform().IsIdentityOrIntegerTranslation()) |
| 986 ? GL_LINEAR | 992 ? GL_LINEAR |
| 987 : GL_NEAREST; | 993 : GL_NEAREST; |
| 994 ResourceProvider::ResourceId resource_id = quad->IsPictureQuad() ? | |
|
danakj
2013/03/14 18:00:56
How would you ever get here with IsPictureQuad() t
danakj
2013/03/14 18:01:21
Sorry, ignore this, I answered this myself later.
enne (OOO)
2013/03/15 03:29:28
I'd prefer if you just passed drawTileQuad the res
Leandro Graciá Gil
2013/03/19 17:30:07
I agree. I'm going with the base class. Seems a cl
| |
| 995 on_demand_tile_raster_resource_id_ : quad->resource_id; | |
| 988 ResourceProvider::ScopedSamplerGL quad_resource_lock( | 996 ResourceProvider::ScopedSamplerGL quad_resource_lock( |
| 989 resource_provider_, quad->resource_id, GL_TEXTURE_2D, filter); | 997 resource_provider_, resource_id, GL_TEXTURE_2D, filter); |
| 990 | 998 |
| 991 if (use_aa) { | 999 if (use_aa) { |
| 992 LayerQuad deviceLayerBounds(gfx::QuadF(device_layer_quad.BoundingBox())); | 1000 LayerQuad deviceLayerBounds(gfx::QuadF(device_layer_quad.BoundingBox())); |
| 993 deviceLayerBounds.InflateAntiAliasingDistance(); | 1001 deviceLayerBounds.InflateAntiAliasingDistance(); |
| 994 | 1002 |
| 995 LayerQuad device_layer_edges(device_layer_quad); | 1003 LayerQuad device_layer_edges(device_layer_quad); |
| 996 device_layer_edges.InflateAntiAliasingDistance(); | 1004 device_layer_edges.InflateAntiAliasingDistance(); |
| 997 | 1005 |
| 998 float edge[24]; | 1006 float edge[24]; |
| 999 device_layer_edges.ToFloatArray(edge); | 1007 device_layer_edges.ToFloatArray(edge); |
| (...skipping 198 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1198 GLC(Context(), | 1206 GLC(Context(), |
| 1199 Context()->uniform1i(program->fragmentShader().samplerLocation(), 0)); | 1207 Context()->uniform1i(program->fragmentShader().samplerLocation(), 0)); |
| 1200 | 1208 |
| 1201 SetShaderOpacity(quad->opacity(), program->fragmentShader().alphaLocation()); | 1209 SetShaderOpacity(quad->opacity(), program->fragmentShader().alphaLocation()); |
| 1202 DrawQuadGeometry(frame, | 1210 DrawQuadGeometry(frame, |
| 1203 quad->quadTransform(), | 1211 quad->quadTransform(), |
| 1204 quad->rect, | 1212 quad->rect, |
| 1205 program->vertexShader().matrixLocation()); | 1213 program->vertexShader().matrixLocation()); |
| 1206 } | 1214 } |
| 1207 | 1215 |
| 1216 void GLRenderer::DrawPictureQuad(const DrawingFrame& frame, const PictureDrawQua d* quad) { | |
| 1217 if (on_demand_tile_raster_bitmap_.width() != quad->texture_size.width() || | |
| 1218 on_demand_tile_raster_bitmap_.height() != quad->texture_size.height()) { | |
| 1219 on_demand_tile_raster_bitmap_.setConfig( | |
| 1220 SkBitmap::kARGB_8888_Config, | |
| 1221 quad->texture_size.width(), | |
| 1222 quad->texture_size.height()); | |
| 1223 on_demand_tile_raster_bitmap_.allocPixels(); | |
| 1224 } | |
| 1225 | |
| 1226 SkDevice device(on_demand_tile_raster_bitmap_); | |
| 1227 SkCanvas canvas(&device); | |
| 1228 | |
| 1229 int64 total_pixels_rasterized = 0; | |
| 1230 quad->picture_pile->Raster( | |
| 1231 &canvas, | |
| 1232 quad->content_rect, | |
| 1233 quad->contents_scale, | |
| 1234 &total_pixels_rasterized); | |
| 1235 | |
| 1236 GLC(Context(), Context()->bindTexture( | |
| 1237 GL_TEXTURE_2D, | |
| 1238 on_demand_tile_raster_texture_)); | |
| 1239 | |
| 1240 GLC(Context(), Context()->texImage2D( | |
| 1241 GL_TEXTURE_2D, | |
| 1242 0, | |
| 1243 GL_RGBA, | |
| 1244 quad->texture_size.width(), | |
| 1245 quad->texture_size.height(), | |
| 1246 0, | |
| 1247 GL_RGBA, | |
| 1248 GL_UNSIGNED_BYTE, | |
| 1249 on_demand_tile_raster_bitmap_.getPixels())); | |
| 1250 | |
| 1251 DrawTileQuad(frame, quad); | |
| 1252 } | |
| 1253 | |
| 1208 struct TextureProgramBinding { | 1254 struct TextureProgramBinding { |
| 1209 template <class Program> | 1255 template <class Program> |
| 1210 void Set(Program* program, WebKit::WebGraphicsContext3D* context) { | 1256 void Set(Program* program, WebKit::WebGraphicsContext3D* context) { |
| 1211 DCHECK(program && (program->initialized() || context->isContextLost())); | 1257 DCHECK(program && (program->initialized() || context->isContextLost())); |
| 1212 program_id = program->program(); | 1258 program_id = program->program(); |
| 1213 sampler_location = program->fragmentShader().samplerLocation(); | 1259 sampler_location = program->fragmentShader().samplerLocation(); |
| 1214 matrix_location = program->vertexShader().matrixLocation(); | 1260 matrix_location = program->vertexShader().matrixLocation(); |
| 1215 alpha_location = program->fragmentShader().alphaLocation(); | 1261 alpha_location = program->fragmentShader().alphaLocation(); |
| 1216 } | 1262 } |
| 1217 int program_id; | 1263 int program_id; |
| (...skipping 663 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1881 | 1927 |
| 1882 // We will always need these programs to render, so create the programs | 1928 // We will always need these programs to render, so create the programs |
| 1883 // eagerly so that the shader compilation can start while we do other work. | 1929 // eagerly so that the shader compilation can start while we do other work. |
| 1884 // Other programs are created lazily on first access. | 1930 // Other programs are created lazily on first access. |
| 1885 shared_geometry_ = | 1931 shared_geometry_ = |
| 1886 make_scoped_ptr(new GeometryBinding(context_, QuadVertexRect())); | 1932 make_scoped_ptr(new GeometryBinding(context_, QuadVertexRect())); |
| 1887 render_pass_program_ = make_scoped_ptr(new RenderPassProgram(context_)); | 1933 render_pass_program_ = make_scoped_ptr(new RenderPassProgram(context_)); |
| 1888 tile_program_ = make_scoped_ptr(new TileProgram(context_)); | 1934 tile_program_ = make_scoped_ptr(new TileProgram(context_)); |
| 1889 tile_program_opaque_ = make_scoped_ptr(new TileProgramOpaque(context_)); | 1935 tile_program_opaque_ = make_scoped_ptr(new TileProgramOpaque(context_)); |
| 1890 | 1936 |
| 1937 on_demand_tile_raster_texture_ = Context()->createTexture(); | |
|
vmpstr
2013/03/13 21:03:08
Should this be cleaned up in CleanupSharedObjects?
Leandro Graciá Gil
2013/03/19 17:30:07
Yes. This was accidentally missed while rebasing o
| |
| 1938 on_demand_tile_raster_resource_id_ = | |
| 1939 resource_provider_->CreateResourceFromExternalTexture( | |
| 1940 on_demand_tile_raster_texture_); | |
| 1941 | |
| 1891 GLC(context_, context_->flush()); | 1942 GLC(context_, context_->flush()); |
| 1892 | 1943 |
| 1893 return true; | 1944 return true; |
| 1894 } | 1945 } |
| 1895 | 1946 |
| 1896 const GLRenderer::TileCheckerboardProgram* | 1947 const GLRenderer::TileCheckerboardProgram* |
| 1897 GLRenderer::GetTileCheckerboardProgram() { | 1948 GLRenderer::GetTileCheckerboardProgram() { |
| 1898 if (!tile_checkerboard_program_) | 1949 if (!tile_checkerboard_program_) |
| 1899 tile_checkerboard_program_ = | 1950 tile_checkerboard_program_ = |
| 1900 make_scoped_ptr(new TileCheckerboardProgram(context_)); | 1951 make_scoped_ptr(new TileCheckerboardProgram(context_)); |
| (...skipping 221 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2122 GLC(context_, context_->deleteFramebuffer(offscreen_framebuffer_id_)); | 2173 GLC(context_, context_->deleteFramebuffer(offscreen_framebuffer_id_)); |
| 2123 | 2174 |
| 2124 ReleaseRenderPassTextures(); | 2175 ReleaseRenderPassTextures(); |
| 2125 } | 2176 } |
| 2126 | 2177 |
| 2127 bool GLRenderer::IsContextLost() { | 2178 bool GLRenderer::IsContextLost() { |
| 2128 return (context_->getGraphicsResetStatusARB() != GL_NO_ERROR); | 2179 return (context_->getGraphicsResetStatusARB() != GL_NO_ERROR); |
| 2129 } | 2180 } |
| 2130 | 2181 |
| 2131 } // namespace cc | 2182 } // namespace cc |
| OLD | NEW |