| 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/output/gl_renderer.h" | 5 #include "cc/output/gl_renderer.h" | 
| 6 | 6 | 
| 7 #include <algorithm> | 7 #include <algorithm> | 
| 8 #include <limits> | 8 #include <limits> | 
| 9 #include <set> | 9 #include <set> | 
| 10 #include <string> | 10 #include <string> | 
| (...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 121       shared_geometry_quad_(gfx::RectF(-0.5f, -0.5f, 1.0f, 1.0f)), | 121       shared_geometry_quad_(gfx::RectF(-0.5f, -0.5f, 1.0f, 1.0f)), | 
| 122       output_surface_(output_surface), | 122       output_surface_(output_surface), | 
| 123       context_(output_surface->context3d()), | 123       context_(output_surface->context3d()), | 
| 124       is_viewport_changed_(false), | 124       is_viewport_changed_(false), | 
| 125       is_backbuffer_discarded_(false), | 125       is_backbuffer_discarded_(false), | 
| 126       discard_backbuffer_when_not_visible_(false), | 126       discard_backbuffer_when_not_visible_(false), | 
| 127       is_using_bind_uniform_(false), | 127       is_using_bind_uniform_(false), | 
| 128       visible_(true), | 128       visible_(true), | 
| 129       is_scissor_enabled_(false), | 129       is_scissor_enabled_(false), | 
| 130       highp_threshold_min_(highp_threshold_min), | 130       highp_threshold_min_(highp_threshold_min), | 
|  | 131       highp_threshold_cache_(0), | 
| 131       on_demand_tile_raster_resource_id_(0) { | 132       on_demand_tile_raster_resource_id_(0) { | 
| 132   DCHECK(context_); | 133   DCHECK(context_); | 
| 133 } | 134 } | 
| 134 | 135 | 
| 135 bool GLRenderer::Initialize() { | 136 bool GLRenderer::Initialize() { | 
| 136   if (!context_->makeContextCurrent()) | 137   if (!context_->makeContextCurrent()) | 
| 137     return false; | 138     return false; | 
| 138 | 139 | 
| 139   context_->pushGroupMarkerEXT("CompositorContext"); | 140   context_->pushGroupMarkerEXT("CompositorContext"); | 
| 140 | 141 | 
| (...skipping 623 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 764     Context()->bindTexture(GL_TEXTURE_2D, texture->getTextureHandle()); | 765     Context()->bindTexture(GL_TEXTURE_2D, texture->getTextureHandle()); | 
| 765   } else { | 766   } else { | 
| 766     contents_resource_lock = make_scoped_ptr( | 767     contents_resource_lock = make_scoped_ptr( | 
| 767         new ResourceProvider::ScopedSamplerGL(resource_provider_, | 768         new ResourceProvider::ScopedSamplerGL(resource_provider_, | 
| 768                                               contents_texture->id(), | 769                                               contents_texture->id(), | 
| 769                                               GL_TEXTURE_2D, | 770                                               GL_TEXTURE_2D, | 
| 770                                               GL_LINEAR)); | 771                                               GL_LINEAR)); | 
| 771   } | 772   } | 
| 772 | 773 | 
| 773   TexCoordPrecision tex_coord_precision = TexCoordPrecisionRequired( | 774   TexCoordPrecision tex_coord_precision = TexCoordPrecisionRequired( | 
| 774       context_, highp_threshold_min_, | 775       context_, &highp_threshold_cache_, highp_threshold_min_, | 
| 775       quad->shared_quad_state->visible_content_rect.bottom_right()); | 776       quad->shared_quad_state->visible_content_rect.bottom_right()); | 
| 776 | 777 | 
| 777   int shader_quad_location = -1; | 778   int shader_quad_location = -1; | 
| 778   int shader_edge_location = -1; | 779   int shader_edge_location = -1; | 
| 779   int shader_mask_sampler_location = -1; | 780   int shader_mask_sampler_location = -1; | 
| 780   int shader_mask_tex_coord_scale_location = -1; | 781   int shader_mask_tex_coord_scale_location = -1; | 
| 781   int shader_mask_tex_coord_offset_location = -1; | 782   int shader_mask_tex_coord_offset_location = -1; | 
| 782   int shader_matrix_location = -1; | 783   int shader_matrix_location = -1; | 
| 783   int shader_alpha_location = -1; | 784   int shader_alpha_location = -1; | 
| 784   int shader_color_matrix_location = -1; | 785   int shader_color_matrix_location = -1; | 
| (...skipping 459 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1244   clamp_tex_rect.Inset(tex_clamp_x, tex_clamp_y, tex_clamp_x, tex_clamp_y); | 1245   clamp_tex_rect.Inset(tex_clamp_x, tex_clamp_y, tex_clamp_x, tex_clamp_y); | 
| 1245 | 1246 | 
| 1246   // Map clamping rectangle to unit square. | 1247   // Map clamping rectangle to unit square. | 
| 1247   float vertex_tex_translate_x = -clamp_geom_rect.x() / clamp_geom_rect.width(); | 1248   float vertex_tex_translate_x = -clamp_geom_rect.x() / clamp_geom_rect.width(); | 
| 1248   float vertex_tex_translate_y = | 1249   float vertex_tex_translate_y = | 
| 1249       -clamp_geom_rect.y() / clamp_geom_rect.height(); | 1250       -clamp_geom_rect.y() / clamp_geom_rect.height(); | 
| 1250   float vertex_tex_scale_x = tile_rect.width() / clamp_geom_rect.width(); | 1251   float vertex_tex_scale_x = tile_rect.width() / clamp_geom_rect.width(); | 
| 1251   float vertex_tex_scale_y = tile_rect.height() / clamp_geom_rect.height(); | 1252   float vertex_tex_scale_y = tile_rect.height() / clamp_geom_rect.height(); | 
| 1252 | 1253 | 
| 1253   TexCoordPrecision tex_coord_precision = TexCoordPrecisionRequired( | 1254   TexCoordPrecision tex_coord_precision = TexCoordPrecisionRequired( | 
| 1254       context_, highp_threshold_min_, quad->texture_size); | 1255       context_, &highp_threshold_cache_, highp_threshold_min_, | 
|  | 1256       quad->texture_size); | 
| 1255 | 1257 | 
| 1256   // Map to normalized texture coordinates. | 1258   // Map to normalized texture coordinates. | 
| 1257   gfx::Size texture_size = quad->texture_size; | 1259   gfx::Size texture_size = quad->texture_size; | 
| 1258   float fragment_tex_translate_x = clamp_tex_rect.x() / texture_size.width(); | 1260   float fragment_tex_translate_x = clamp_tex_rect.x() / texture_size.width(); | 
| 1259   float fragment_tex_translate_y = clamp_tex_rect.y() / texture_size.height(); | 1261   float fragment_tex_translate_y = clamp_tex_rect.y() / texture_size.height(); | 
| 1260   float fragment_tex_scale_x = clamp_tex_rect.width() / texture_size.width(); | 1262   float fragment_tex_scale_x = clamp_tex_rect.width() / texture_size.width(); | 
| 1261   float fragment_tex_scale_y = clamp_tex_rect.height() / texture_size.height(); | 1263   float fragment_tex_scale_y = clamp_tex_rect.height() / texture_size.height(); | 
| 1262 | 1264 | 
| 1263   gfx::Transform device_transform = | 1265   gfx::Transform device_transform = | 
| 1264       frame->window_matrix * frame->projection_matrix * quad->quadTransform(); | 1266       frame->window_matrix * frame->projection_matrix * quad->quadTransform(); | 
| (...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1362       tile_rect.size()); | 1364       tile_rect.size()); | 
| 1363   DrawQuadGeometry( | 1365   DrawQuadGeometry( | 
| 1364       frame, quad->quadTransform(), centered_rect, uniforms.matrix_location); | 1366       frame, quad->quadTransform(), centered_rect, uniforms.matrix_location); | 
| 1365 } | 1367 } | 
| 1366 | 1368 | 
| 1367 void GLRenderer::DrawYUVVideoQuad(const DrawingFrame* frame, | 1369 void GLRenderer::DrawYUVVideoQuad(const DrawingFrame* frame, | 
| 1368                                   const YUVVideoDrawQuad* quad) { | 1370                                   const YUVVideoDrawQuad* quad) { | 
| 1369   SetBlendEnabled(quad->ShouldDrawWithBlending()); | 1371   SetBlendEnabled(quad->ShouldDrawWithBlending()); | 
| 1370 | 1372 | 
| 1371   TexCoordPrecision tex_coord_precision = TexCoordPrecisionRequired( | 1373   TexCoordPrecision tex_coord_precision = TexCoordPrecisionRequired( | 
| 1372       context_, highp_threshold_min_, | 1374       context_, &highp_threshold_cache_, highp_threshold_min_, | 
| 1373       quad->shared_quad_state->visible_content_rect.bottom_right()); | 1375       quad->shared_quad_state->visible_content_rect.bottom_right()); | 
| 1374 | 1376 | 
| 1375   const VideoYUVProgram* program = GetVideoYUVProgram(tex_coord_precision); | 1377   const VideoYUVProgram* program = GetVideoYUVProgram(tex_coord_precision); | 
| 1376   DCHECK(program && (program->initialized() || IsContextLost())); | 1378   DCHECK(program && (program->initialized() || IsContextLost())); | 
| 1377 | 1379 | 
| 1378   GLC(Context(), Context()->activeTexture(GL_TEXTURE1)); | 1380   GLC(Context(), Context()->activeTexture(GL_TEXTURE1)); | 
| 1379   ResourceProvider::ScopedSamplerGL y_plane_lock( | 1381   ResourceProvider::ScopedSamplerGL y_plane_lock( | 
| 1380       resource_provider_, quad->y_plane_resource_id, GL_TEXTURE_2D, GL_LINEAR); | 1382       resource_provider_, quad->y_plane_resource_id, GL_TEXTURE_2D, GL_LINEAR); | 
| 1381   GLC(Context(), Context()->activeTexture(GL_TEXTURE2)); | 1383   GLC(Context(), Context()->activeTexture(GL_TEXTURE2)); | 
| 1382   ResourceProvider::ScopedSamplerGL u_plane_lock( | 1384   ResourceProvider::ScopedSamplerGL u_plane_lock( | 
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1434 | 1436 | 
| 1435 void GLRenderer::DrawStreamVideoQuad(const DrawingFrame* frame, | 1437 void GLRenderer::DrawStreamVideoQuad(const DrawingFrame* frame, | 
| 1436                                      const StreamVideoDrawQuad* quad) { | 1438                                      const StreamVideoDrawQuad* quad) { | 
| 1437   SetBlendEnabled(quad->ShouldDrawWithBlending()); | 1439   SetBlendEnabled(quad->ShouldDrawWithBlending()); | 
| 1438 | 1440 | 
| 1439   static float gl_matrix[16]; | 1441   static float gl_matrix[16]; | 
| 1440 | 1442 | 
| 1441   DCHECK(capabilities_.using_egl_image); | 1443   DCHECK(capabilities_.using_egl_image); | 
| 1442 | 1444 | 
| 1443   TexCoordPrecision tex_coord_precision = TexCoordPrecisionRequired( | 1445   TexCoordPrecision tex_coord_precision = TexCoordPrecisionRequired( | 
| 1444       context_, highp_threshold_min_, | 1446       context_, &highp_threshold_cache_, highp_threshold_min_, | 
| 1445       quad->shared_quad_state->visible_content_rect.bottom_right()); | 1447       quad->shared_quad_state->visible_content_rect.bottom_right()); | 
| 1446 | 1448 | 
| 1447   const VideoStreamTextureProgram* program = | 1449   const VideoStreamTextureProgram* program = | 
| 1448       GetVideoStreamTextureProgram(tex_coord_precision); | 1450       GetVideoStreamTextureProgram(tex_coord_precision); | 
| 1449   SetUseProgram(program->program()); | 1451   SetUseProgram(program->program()); | 
| 1450 | 1452 | 
| 1451   ToGLMatrix(&gl_matrix[0], quad->matrix); | 1453   ToGLMatrix(&gl_matrix[0], quad->matrix); | 
| 1452   GLC(Context(), | 1454   GLC(Context(), | 
| 1453       Context()->uniformMatrix4fv( | 1455       Context()->uniformMatrix4fv( | 
| 1454           program->vertex_shader().tex_matrix_location(), 1, false, gl_matrix)); | 1456           program->vertex_shader().tex_matrix_location(), 1, false, gl_matrix)); | 
| (...skipping 153 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1608   // Clear the cache. | 1610   // Clear the cache. | 
| 1609   draw_cache_.program_id = 0; | 1611   draw_cache_.program_id = 0; | 
| 1610   draw_cache_.uv_xform_data.resize(0); | 1612   draw_cache_.uv_xform_data.resize(0); | 
| 1611   draw_cache_.vertex_opacity_data.resize(0); | 1613   draw_cache_.vertex_opacity_data.resize(0); | 
| 1612   draw_cache_.matrix_data.resize(0); | 1614   draw_cache_.matrix_data.resize(0); | 
| 1613 } | 1615 } | 
| 1614 | 1616 | 
| 1615 void GLRenderer::EnqueueTextureQuad(const DrawingFrame* frame, | 1617 void GLRenderer::EnqueueTextureQuad(const DrawingFrame* frame, | 
| 1616                                     const TextureDrawQuad* quad) { | 1618                                     const TextureDrawQuad* quad) { | 
| 1617   TexCoordPrecision tex_coord_precision = TexCoordPrecisionRequired( | 1619   TexCoordPrecision tex_coord_precision = TexCoordPrecisionRequired( | 
| 1618       context_, highp_threshold_min_, | 1620       context_, &highp_threshold_cache_, highp_threshold_min_, | 
| 1619       quad->shared_quad_state->visible_content_rect.bottom_right()); | 1621       quad->shared_quad_state->visible_content_rect.bottom_right()); | 
| 1620 | 1622 | 
| 1621   // Choose the correct texture program binding | 1623   // Choose the correct texture program binding | 
| 1622   TexTransformTextureProgramBinding binding; | 1624   TexTransformTextureProgramBinding binding; | 
| 1623   if (quad->flipped) | 1625   if (quad->flipped) | 
| 1624     binding.Set(GetTextureProgramFlip(tex_coord_precision), Context()); | 1626     binding.Set(GetTextureProgramFlip(tex_coord_precision), Context()); | 
| 1625   else | 1627   else | 
| 1626     binding.Set(GetTextureProgram(tex_coord_precision), Context()); | 1628     binding.Set(GetTextureProgram(tex_coord_precision), Context()); | 
| 1627 | 1629 | 
| 1628   int resource_id = quad->resource_id; | 1630   int resource_id = quad->resource_id; | 
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1663   quad_rect_matrix = frame->projection_matrix * quad_rect_matrix; | 1665   quad_rect_matrix = frame->projection_matrix * quad_rect_matrix; | 
| 1664 | 1666 | 
| 1665   Float16 m; | 1667   Float16 m; | 
| 1666   quad_rect_matrix.matrix().asColMajorf(m.data); | 1668   quad_rect_matrix.matrix().asColMajorf(m.data); | 
| 1667   draw_cache_.matrix_data.push_back(m); | 1669   draw_cache_.matrix_data.push_back(m); | 
| 1668 } | 1670 } | 
| 1669 | 1671 | 
| 1670 void GLRenderer::DrawTextureQuad(const DrawingFrame* frame, | 1672 void GLRenderer::DrawTextureQuad(const DrawingFrame* frame, | 
| 1671                                  const TextureDrawQuad* quad) { | 1673                                  const TextureDrawQuad* quad) { | 
| 1672   TexCoordPrecision tex_coord_precision = TexCoordPrecisionRequired( | 1674   TexCoordPrecision tex_coord_precision = TexCoordPrecisionRequired( | 
| 1673       context_, highp_threshold_min_, | 1675       context_, &highp_threshold_cache_, highp_threshold_min_, | 
| 1674       quad->shared_quad_state->visible_content_rect.bottom_right()); | 1676       quad->shared_quad_state->visible_content_rect.bottom_right()); | 
| 1675 | 1677 | 
| 1676   TexTransformTextureProgramBinding binding; | 1678   TexTransformTextureProgramBinding binding; | 
| 1677   if (quad->flipped) | 1679   if (quad->flipped) | 
| 1678     binding.Set(GetTextureProgramFlip(tex_coord_precision), Context()); | 1680     binding.Set(GetTextureProgramFlip(tex_coord_precision), Context()); | 
| 1679   else | 1681   else | 
| 1680     binding.Set(GetTextureProgram(tex_coord_precision), Context()); | 1682     binding.Set(GetTextureProgram(tex_coord_precision), Context()); | 
| 1681   SetUseProgram(binding.program_id); | 1683   SetUseProgram(binding.program_id); | 
| 1682   GLC(Context(), Context()->uniform1i(binding.sampler_location, 0)); | 1684   GLC(Context(), Context()->uniform1i(binding.sampler_location, 0)); | 
| 1683   gfx::PointF uv0 = quad->uv_top_left; | 1685   gfx::PointF uv0 = quad->uv_top_left; | 
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1717 | 1719 | 
| 1718   if (!quad->premultiplied_alpha) | 1720   if (!quad->premultiplied_alpha) | 
| 1719     GLC(context_, context_->blendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA)); | 1721     GLC(context_, context_->blendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA)); | 
| 1720 } | 1722 } | 
| 1721 | 1723 | 
| 1722 void GLRenderer::DrawIOSurfaceQuad(const DrawingFrame* frame, | 1724 void GLRenderer::DrawIOSurfaceQuad(const DrawingFrame* frame, | 
| 1723                                    const IOSurfaceDrawQuad* quad) { | 1725                                    const IOSurfaceDrawQuad* quad) { | 
| 1724   SetBlendEnabled(quad->ShouldDrawWithBlending()); | 1726   SetBlendEnabled(quad->ShouldDrawWithBlending()); | 
| 1725 | 1727 | 
| 1726   TexCoordPrecision tex_coord_precision = TexCoordPrecisionRequired( | 1728   TexCoordPrecision tex_coord_precision = TexCoordPrecisionRequired( | 
| 1727       context_, highp_threshold_min_, | 1729       context_,  &highp_threshold_cache_, highp_threshold_min_, | 
| 1728       quad->shared_quad_state->visible_content_rect.bottom_right()); | 1730       quad->shared_quad_state->visible_content_rect.bottom_right()); | 
| 1729 | 1731 | 
| 1730   TexTransformTextureProgramBinding binding; | 1732   TexTransformTextureProgramBinding binding; | 
| 1731   binding.Set(GetTextureIOSurfaceProgram(tex_coord_precision), Context()); | 1733   binding.Set(GetTextureIOSurfaceProgram(tex_coord_precision), Context()); | 
| 1732 | 1734 | 
| 1733   SetUseProgram(binding.program_id); | 1735   SetUseProgram(binding.program_id); | 
| 1734   GLC(Context(), Context()->uniform1i(binding.sampler_location, 0)); | 1736   GLC(Context(), Context()->uniform1i(binding.sampler_location, 0)); | 
| 1735   if (quad->orientation == IOSurfaceDrawQuad::FLIPPED) { | 1737   if (quad->orientation == IOSurfaceDrawQuad::FLIPPED) { | 
| 1736     GLC(Context(), | 1738     GLC(Context(), | 
| 1737         Context()->uniform4f(binding.tex_transform_location, | 1739         Context()->uniform4f(binding.tex_transform_location, | 
| (...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1863       context_->uniformMatrix4fv(matrix_location, 1, false, &gl_matrix[0])); | 1865       context_->uniformMatrix4fv(matrix_location, 1, false, &gl_matrix[0])); | 
| 1864 | 1866 | 
| 1865   GLC(context_, context_->drawElements(GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, 0)); | 1867   GLC(context_, context_->drawElements(GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, 0)); | 
| 1866 } | 1868 } | 
| 1867 | 1869 | 
| 1868 void GLRenderer::CopyTextureToFramebuffer(const DrawingFrame* frame, | 1870 void GLRenderer::CopyTextureToFramebuffer(const DrawingFrame* frame, | 
| 1869                                           int texture_id, | 1871                                           int texture_id, | 
| 1870                                           gfx::Rect rect, | 1872                                           gfx::Rect rect, | 
| 1871                                           const gfx::Transform& draw_matrix) { | 1873                                           const gfx::Transform& draw_matrix) { | 
| 1872   TexCoordPrecision tex_coord_precision = TexCoordPrecisionRequired( | 1874   TexCoordPrecision tex_coord_precision = TexCoordPrecisionRequired( | 
| 1873       context_, highp_threshold_min_, rect.bottom_right()); | 1875       context_, &highp_threshold_cache_, highp_threshold_min_, | 
|  | 1876       rect.bottom_right()); | 
| 1874   const RenderPassProgram* program = GetRenderPassProgram(tex_coord_precision); | 1877   const RenderPassProgram* program = GetRenderPassProgram(tex_coord_precision); | 
| 1875 | 1878 | 
| 1876   GLC(Context(), Context()->bindTexture(GL_TEXTURE_2D, texture_id)); | 1879   GLC(Context(), Context()->bindTexture(GL_TEXTURE_2D, texture_id)); | 
| 1877 | 1880 | 
| 1878   SetUseProgram(program->program()); | 1881   SetUseProgram(program->program()); | 
| 1879   GLC(Context(), | 1882   GLC(Context(), | 
| 1880       Context()->uniform1i(program->fragment_shader().sampler_location(), 0)); | 1883       Context()->uniform1i(program->fragment_shader().sampler_location(), 0)); | 
| 1881   GLC(Context(), | 1884   GLC(Context(), | 
| 1882       Context()->uniform4f(program->vertex_shader().tex_transform_location(), | 1885       Context()->uniform4f(program->vertex_shader().tex_transform_location(), | 
| 1883                            0.0f, | 1886                            0.0f, | 
| (...skipping 898 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 2782     resource_provider_->DeleteResource(on_demand_tile_raster_resource_id_); | 2785     resource_provider_->DeleteResource(on_demand_tile_raster_resource_id_); | 
| 2783 | 2786 | 
| 2784   ReleaseRenderPassTextures(); | 2787   ReleaseRenderPassTextures(); | 
| 2785 } | 2788 } | 
| 2786 | 2789 | 
| 2787 bool GLRenderer::IsContextLost() { | 2790 bool GLRenderer::IsContextLost() { | 
| 2788   return (context_->getGraphicsResetStatusARB() != GL_NO_ERROR); | 2791   return (context_->getGraphicsResetStatusARB() != GL_NO_ERROR); | 
| 2789 } | 2792 } | 
| 2790 | 2793 | 
| 2791 }  // namespace cc | 2794 }  // namespace cc | 
| OLD | NEW | 
|---|