| 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 <set> | 8 #include <set> |
| 9 #include <string> | 9 #include <string> |
| 10 #include <vector> | 10 #include <vector> |
| (...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 108 shared_geometry_quad_(gfx::RectF(-0.5f, -0.5f, 1.0f, 1.0f)), | 108 shared_geometry_quad_(gfx::RectF(-0.5f, -0.5f, 1.0f, 1.0f)), |
| 109 output_surface_(output_surface), | 109 output_surface_(output_surface), |
| 110 context_(output_surface->context3d()), | 110 context_(output_surface->context3d()), |
| 111 is_viewport_changed_(false), | 111 is_viewport_changed_(false), |
| 112 is_backbuffer_discarded_(false), | 112 is_backbuffer_discarded_(false), |
| 113 discard_backbuffer_when_not_visible_(false), | 113 discard_backbuffer_when_not_visible_(false), |
| 114 is_using_bind_uniform_(false), | 114 is_using_bind_uniform_(false), |
| 115 visible_(true), | 115 visible_(true), |
| 116 is_scissor_enabled_(false), | 116 is_scissor_enabled_(false), |
| 117 highp_threshold_min_(highp_threshold_min), | 117 highp_threshold_min_(highp_threshold_min), |
| 118 highp_threshold_cache_(0), |
| 118 on_demand_tile_raster_resource_id_(0) { | 119 on_demand_tile_raster_resource_id_(0) { |
| 119 DCHECK(context_); | 120 DCHECK(context_); |
| 120 } | 121 } |
| 121 | 122 |
| 122 bool GLRenderer::Initialize() { | 123 bool GLRenderer::Initialize() { |
| 123 if (!context_->makeContextCurrent()) | 124 if (!context_->makeContextCurrent()) |
| 124 return false; | 125 return false; |
| 125 | 126 |
| 126 context_->pushGroupMarkerEXT("CompositorContext"); | 127 context_->pushGroupMarkerEXT("CompositorContext"); |
| 127 | 128 |
| (...skipping 616 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 744 Context()->bindTexture(GL_TEXTURE_2D, texture->getTextureHandle()); | 745 Context()->bindTexture(GL_TEXTURE_2D, texture->getTextureHandle()); |
| 745 } else { | 746 } else { |
| 746 contents_resource_lock = make_scoped_ptr( | 747 contents_resource_lock = make_scoped_ptr( |
| 747 new ResourceProvider::ScopedSamplerGL(resource_provider_, | 748 new ResourceProvider::ScopedSamplerGL(resource_provider_, |
| 748 contents_texture->id(), | 749 contents_texture->id(), |
| 749 GL_TEXTURE_2D, | 750 GL_TEXTURE_2D, |
| 750 GL_LINEAR)); | 751 GL_LINEAR)); |
| 751 } | 752 } |
| 752 | 753 |
| 753 TexCoordPrecision tex_coord_precision = TexCoordPrecisionRequired( | 754 TexCoordPrecision tex_coord_precision = TexCoordPrecisionRequired( |
| 754 context_, highp_threshold_min_, | 755 context_, &highp_threshold_cache_, highp_threshold_min_, |
| 755 quad->shared_quad_state->visible_content_rect.bottom_right()); | 756 quad->shared_quad_state->visible_content_rect.bottom_right()); |
| 756 | 757 |
| 757 int shader_quad_location = -1; | 758 int shader_quad_location = -1; |
| 758 int shader_edge_location = -1; | 759 int shader_edge_location = -1; |
| 759 int shader_mask_sampler_location = -1; | 760 int shader_mask_sampler_location = -1; |
| 760 int shader_mask_tex_coord_scale_location = -1; | 761 int shader_mask_tex_coord_scale_location = -1; |
| 761 int shader_mask_tex_coord_offset_location = -1; | 762 int shader_mask_tex_coord_offset_location = -1; |
| 762 int shader_matrix_location = -1; | 763 int shader_matrix_location = -1; |
| 763 int shader_alpha_location = -1; | 764 int shader_alpha_location = -1; |
| 764 int shader_color_matrix_location = -1; | 765 int shader_color_matrix_location = -1; |
| (...skipping 454 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1219 clamp_tex_rect.Inset(tex_clamp_x, tex_clamp_y, tex_clamp_x, tex_clamp_y); | 1220 clamp_tex_rect.Inset(tex_clamp_x, tex_clamp_y, tex_clamp_x, tex_clamp_y); |
| 1220 | 1221 |
| 1221 // Map clamping rectangle to unit square. | 1222 // Map clamping rectangle to unit square. |
| 1222 float vertex_tex_translate_x = -clamp_geom_rect.x() / clamp_geom_rect.width(); | 1223 float vertex_tex_translate_x = -clamp_geom_rect.x() / clamp_geom_rect.width(); |
| 1223 float vertex_tex_translate_y = | 1224 float vertex_tex_translate_y = |
| 1224 -clamp_geom_rect.y() / clamp_geom_rect.height(); | 1225 -clamp_geom_rect.y() / clamp_geom_rect.height(); |
| 1225 float vertex_tex_scale_x = tile_rect.width() / clamp_geom_rect.width(); | 1226 float vertex_tex_scale_x = tile_rect.width() / clamp_geom_rect.width(); |
| 1226 float vertex_tex_scale_y = tile_rect.height() / clamp_geom_rect.height(); | 1227 float vertex_tex_scale_y = tile_rect.height() / clamp_geom_rect.height(); |
| 1227 | 1228 |
| 1228 TexCoordPrecision tex_coord_precision = TexCoordPrecisionRequired( | 1229 TexCoordPrecision tex_coord_precision = TexCoordPrecisionRequired( |
| 1229 context_, highp_threshold_min_, quad->texture_size); | 1230 context_, &highp_threshold_cache_, highp_threshold_min_, |
| 1231 quad->texture_size); |
| 1230 | 1232 |
| 1231 // Map to normalized texture coordinates. | 1233 // Map to normalized texture coordinates. |
| 1232 gfx::Size texture_size = quad->texture_size; | 1234 gfx::Size texture_size = quad->texture_size; |
| 1233 float fragment_tex_translate_x = clamp_tex_rect.x() / texture_size.width(); | 1235 float fragment_tex_translate_x = clamp_tex_rect.x() / texture_size.width(); |
| 1234 float fragment_tex_translate_y = clamp_tex_rect.y() / texture_size.height(); | 1236 float fragment_tex_translate_y = clamp_tex_rect.y() / texture_size.height(); |
| 1235 float fragment_tex_scale_x = clamp_tex_rect.width() / texture_size.width(); | 1237 float fragment_tex_scale_x = clamp_tex_rect.width() / texture_size.width(); |
| 1236 float fragment_tex_scale_y = clamp_tex_rect.height() / texture_size.height(); | 1238 float fragment_tex_scale_y = clamp_tex_rect.height() / texture_size.height(); |
| 1237 | 1239 |
| 1238 gfx::Transform device_transform = | 1240 gfx::Transform device_transform = |
| 1239 frame->window_matrix * frame->projection_matrix * quad->quadTransform(); | 1241 frame->window_matrix * frame->projection_matrix * quad->quadTransform(); |
| (...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1337 tile_rect.size()); | 1339 tile_rect.size()); |
| 1338 DrawQuadGeometry( | 1340 DrawQuadGeometry( |
| 1339 frame, quad->quadTransform(), centered_rect, uniforms.matrix_location); | 1341 frame, quad->quadTransform(), centered_rect, uniforms.matrix_location); |
| 1340 } | 1342 } |
| 1341 | 1343 |
| 1342 void GLRenderer::DrawYUVVideoQuad(const DrawingFrame* frame, | 1344 void GLRenderer::DrawYUVVideoQuad(const DrawingFrame* frame, |
| 1343 const YUVVideoDrawQuad* quad) { | 1345 const YUVVideoDrawQuad* quad) { |
| 1344 SetBlendEnabled(quad->ShouldDrawWithBlending()); | 1346 SetBlendEnabled(quad->ShouldDrawWithBlending()); |
| 1345 | 1347 |
| 1346 TexCoordPrecision tex_coord_precision = TexCoordPrecisionRequired( | 1348 TexCoordPrecision tex_coord_precision = TexCoordPrecisionRequired( |
| 1347 context_, highp_threshold_min_, | 1349 context_, &highp_threshold_cache_, highp_threshold_min_, |
| 1348 quad->shared_quad_state->visible_content_rect.bottom_right()); | 1350 quad->shared_quad_state->visible_content_rect.bottom_right()); |
| 1349 | 1351 |
| 1350 const VideoYUVProgram* program = GetVideoYUVProgram(tex_coord_precision); | 1352 const VideoYUVProgram* program = GetVideoYUVProgram(tex_coord_precision); |
| 1351 DCHECK(program && (program->initialized() || IsContextLost())); | 1353 DCHECK(program && (program->initialized() || IsContextLost())); |
| 1352 | 1354 |
| 1353 GLC(Context(), Context()->activeTexture(GL_TEXTURE1)); | 1355 GLC(Context(), Context()->activeTexture(GL_TEXTURE1)); |
| 1354 ResourceProvider::ScopedSamplerGL y_plane_lock( | 1356 ResourceProvider::ScopedSamplerGL y_plane_lock( |
| 1355 resource_provider_, quad->y_plane_resource_id, GL_TEXTURE_2D, GL_LINEAR); | 1357 resource_provider_, quad->y_plane_resource_id, GL_TEXTURE_2D, GL_LINEAR); |
| 1356 GLC(Context(), Context()->activeTexture(GL_TEXTURE2)); | 1358 GLC(Context(), Context()->activeTexture(GL_TEXTURE2)); |
| 1357 ResourceProvider::ScopedSamplerGL u_plane_lock( | 1359 ResourceProvider::ScopedSamplerGL u_plane_lock( |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1409 | 1411 |
| 1410 void GLRenderer::DrawStreamVideoQuad(const DrawingFrame* frame, | 1412 void GLRenderer::DrawStreamVideoQuad(const DrawingFrame* frame, |
| 1411 const StreamVideoDrawQuad* quad) { | 1413 const StreamVideoDrawQuad* quad) { |
| 1412 SetBlendEnabled(quad->ShouldDrawWithBlending()); | 1414 SetBlendEnabled(quad->ShouldDrawWithBlending()); |
| 1413 | 1415 |
| 1414 static float gl_matrix[16]; | 1416 static float gl_matrix[16]; |
| 1415 | 1417 |
| 1416 DCHECK(capabilities_.using_egl_image); | 1418 DCHECK(capabilities_.using_egl_image); |
| 1417 | 1419 |
| 1418 TexCoordPrecision tex_coord_precision = TexCoordPrecisionRequired( | 1420 TexCoordPrecision tex_coord_precision = TexCoordPrecisionRequired( |
| 1419 context_, highp_threshold_min_, | 1421 context_, &highp_threshold_cache_, highp_threshold_min_, |
| 1420 quad->shared_quad_state->visible_content_rect.bottom_right()); | 1422 quad->shared_quad_state->visible_content_rect.bottom_right()); |
| 1421 | 1423 |
| 1422 const VideoStreamTextureProgram* program = | 1424 const VideoStreamTextureProgram* program = |
| 1423 GetVideoStreamTextureProgram(tex_coord_precision); | 1425 GetVideoStreamTextureProgram(tex_coord_precision); |
| 1424 SetUseProgram(program->program()); | 1426 SetUseProgram(program->program()); |
| 1425 | 1427 |
| 1426 ToGLMatrix(&gl_matrix[0], quad->matrix); | 1428 ToGLMatrix(&gl_matrix[0], quad->matrix); |
| 1427 GLC(Context(), | 1429 GLC(Context(), |
| 1428 Context()->uniformMatrix4fv( | 1430 Context()->uniformMatrix4fv( |
| 1429 program->vertex_shader().tex_matrix_location(), 1, false, gl_matrix)); | 1431 program->vertex_shader().tex_matrix_location(), 1, false, gl_matrix)); |
| (...skipping 153 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1583 // Clear the cache. | 1585 // Clear the cache. |
| 1584 draw_cache_.program_id = 0; | 1586 draw_cache_.program_id = 0; |
| 1585 draw_cache_.uv_xform_data.resize(0); | 1587 draw_cache_.uv_xform_data.resize(0); |
| 1586 draw_cache_.vertex_opacity_data.resize(0); | 1588 draw_cache_.vertex_opacity_data.resize(0); |
| 1587 draw_cache_.matrix_data.resize(0); | 1589 draw_cache_.matrix_data.resize(0); |
| 1588 } | 1590 } |
| 1589 | 1591 |
| 1590 void GLRenderer::EnqueueTextureQuad(const DrawingFrame* frame, | 1592 void GLRenderer::EnqueueTextureQuad(const DrawingFrame* frame, |
| 1591 const TextureDrawQuad* quad) { | 1593 const TextureDrawQuad* quad) { |
| 1592 TexCoordPrecision tex_coord_precision = TexCoordPrecisionRequired( | 1594 TexCoordPrecision tex_coord_precision = TexCoordPrecisionRequired( |
| 1593 context_, highp_threshold_min_, | 1595 context_, &highp_threshold_cache_, highp_threshold_min_, |
| 1594 quad->shared_quad_state->visible_content_rect.bottom_right()); | 1596 quad->shared_quad_state->visible_content_rect.bottom_right()); |
| 1595 | 1597 |
| 1596 // Choose the correct texture program binding | 1598 // Choose the correct texture program binding |
| 1597 TexTransformTextureProgramBinding binding; | 1599 TexTransformTextureProgramBinding binding; |
| 1598 if (quad->flipped) | 1600 if (quad->flipped) |
| 1599 binding.Set(GetTextureProgramFlip(tex_coord_precision), Context()); | 1601 binding.Set(GetTextureProgramFlip(tex_coord_precision), Context()); |
| 1600 else | 1602 else |
| 1601 binding.Set(GetTextureProgram(tex_coord_precision), Context()); | 1603 binding.Set(GetTextureProgram(tex_coord_precision), Context()); |
| 1602 | 1604 |
| 1603 int resource_id = quad->resource_id; | 1605 int resource_id = quad->resource_id; |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1638 quad_rect_matrix = frame->projection_matrix * quad_rect_matrix; | 1640 quad_rect_matrix = frame->projection_matrix * quad_rect_matrix; |
| 1639 | 1641 |
| 1640 Float16 m; | 1642 Float16 m; |
| 1641 quad_rect_matrix.matrix().asColMajorf(m.data); | 1643 quad_rect_matrix.matrix().asColMajorf(m.data); |
| 1642 draw_cache_.matrix_data.push_back(m); | 1644 draw_cache_.matrix_data.push_back(m); |
| 1643 } | 1645 } |
| 1644 | 1646 |
| 1645 void GLRenderer::DrawTextureQuad(const DrawingFrame* frame, | 1647 void GLRenderer::DrawTextureQuad(const DrawingFrame* frame, |
| 1646 const TextureDrawQuad* quad) { | 1648 const TextureDrawQuad* quad) { |
| 1647 TexCoordPrecision tex_coord_precision = TexCoordPrecisionRequired( | 1649 TexCoordPrecision tex_coord_precision = TexCoordPrecisionRequired( |
| 1648 context_, highp_threshold_min_, | 1650 context_, &highp_threshold_cache_, highp_threshold_min_, |
| 1649 quad->shared_quad_state->visible_content_rect.bottom_right()); | 1651 quad->shared_quad_state->visible_content_rect.bottom_right()); |
| 1650 | 1652 |
| 1651 TexTransformTextureProgramBinding binding; | 1653 TexTransformTextureProgramBinding binding; |
| 1652 if (quad->flipped) | 1654 if (quad->flipped) |
| 1653 binding.Set(GetTextureProgramFlip(tex_coord_precision), Context()); | 1655 binding.Set(GetTextureProgramFlip(tex_coord_precision), Context()); |
| 1654 else | 1656 else |
| 1655 binding.Set(GetTextureProgram(tex_coord_precision), Context()); | 1657 binding.Set(GetTextureProgram(tex_coord_precision), Context()); |
| 1656 SetUseProgram(binding.program_id); | 1658 SetUseProgram(binding.program_id); |
| 1657 GLC(Context(), Context()->uniform1i(binding.sampler_location, 0)); | 1659 GLC(Context(), Context()->uniform1i(binding.sampler_location, 0)); |
| 1658 gfx::PointF uv0 = quad->uv_top_left; | 1660 gfx::PointF uv0 = quad->uv_top_left; |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1692 | 1694 |
| 1693 if (!quad->premultiplied_alpha) | 1695 if (!quad->premultiplied_alpha) |
| 1694 GLC(context_, context_->blendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA)); | 1696 GLC(context_, context_->blendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA)); |
| 1695 } | 1697 } |
| 1696 | 1698 |
| 1697 void GLRenderer::DrawIOSurfaceQuad(const DrawingFrame* frame, | 1699 void GLRenderer::DrawIOSurfaceQuad(const DrawingFrame* frame, |
| 1698 const IOSurfaceDrawQuad* quad) { | 1700 const IOSurfaceDrawQuad* quad) { |
| 1699 SetBlendEnabled(quad->ShouldDrawWithBlending()); | 1701 SetBlendEnabled(quad->ShouldDrawWithBlending()); |
| 1700 | 1702 |
| 1701 TexCoordPrecision tex_coord_precision = TexCoordPrecisionRequired( | 1703 TexCoordPrecision tex_coord_precision = TexCoordPrecisionRequired( |
| 1702 context_, highp_threshold_min_, | 1704 context_, &highp_threshold_cache_, highp_threshold_min_, |
| 1703 quad->shared_quad_state->visible_content_rect.bottom_right()); | 1705 quad->shared_quad_state->visible_content_rect.bottom_right()); |
| 1704 | 1706 |
| 1705 TexTransformTextureProgramBinding binding; | 1707 TexTransformTextureProgramBinding binding; |
| 1706 binding.Set(GetTextureIOSurfaceProgram(tex_coord_precision), Context()); | 1708 binding.Set(GetTextureIOSurfaceProgram(tex_coord_precision), Context()); |
| 1707 | 1709 |
| 1708 SetUseProgram(binding.program_id); | 1710 SetUseProgram(binding.program_id); |
| 1709 GLC(Context(), Context()->uniform1i(binding.sampler_location, 0)); | 1711 GLC(Context(), Context()->uniform1i(binding.sampler_location, 0)); |
| 1710 if (quad->orientation == IOSurfaceDrawQuad::FLIPPED) { | 1712 if (quad->orientation == IOSurfaceDrawQuad::FLIPPED) { |
| 1711 GLC(Context(), | 1713 GLC(Context(), |
| 1712 Context()->uniform4f(binding.tex_transform_location, | 1714 Context()->uniform4f(binding.tex_transform_location, |
| (...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1845 context_->uniformMatrix4fv(matrix_location, 1, false, &gl_matrix[0])); | 1847 context_->uniformMatrix4fv(matrix_location, 1, false, &gl_matrix[0])); |
| 1846 | 1848 |
| 1847 GLC(context_, context_->drawElements(GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, 0)); | 1849 GLC(context_, context_->drawElements(GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, 0)); |
| 1848 } | 1850 } |
| 1849 | 1851 |
| 1850 void GLRenderer::CopyTextureToFramebuffer(const DrawingFrame* frame, | 1852 void GLRenderer::CopyTextureToFramebuffer(const DrawingFrame* frame, |
| 1851 int texture_id, | 1853 int texture_id, |
| 1852 gfx::Rect rect, | 1854 gfx::Rect rect, |
| 1853 const gfx::Transform& draw_matrix) { | 1855 const gfx::Transform& draw_matrix) { |
| 1854 TexCoordPrecision tex_coord_precision = TexCoordPrecisionRequired( | 1856 TexCoordPrecision tex_coord_precision = TexCoordPrecisionRequired( |
| 1855 context_, highp_threshold_min_, rect.bottom_right()); | 1857 context_, &highp_threshold_cache_, highp_threshold_min_, |
| 1858 rect.bottom_right()); |
| 1856 const RenderPassProgram* program = GetRenderPassProgram(tex_coord_precision); | 1859 const RenderPassProgram* program = GetRenderPassProgram(tex_coord_precision); |
| 1857 | 1860 |
| 1858 GLC(Context(), Context()->bindTexture(GL_TEXTURE_2D, texture_id)); | 1861 GLC(Context(), Context()->bindTexture(GL_TEXTURE_2D, texture_id)); |
| 1859 | 1862 |
| 1860 SetUseProgram(program->program()); | 1863 SetUseProgram(program->program()); |
| 1861 GLC(Context(), | 1864 GLC(Context(), |
| 1862 Context()->uniform1i(program->fragment_shader().sampler_location(), 0)); | 1865 Context()->uniform1i(program->fragment_shader().sampler_location(), 0)); |
| 1863 GLC(Context(), | 1866 GLC(Context(), |
| 1864 Context()->uniform4f(program->vertex_shader().tex_transform_location(), | 1867 Context()->uniform4f(program->vertex_shader().tex_transform_location(), |
| 1865 0.0f, | 1868 0.0f, |
| (...skipping 769 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2635 resource_provider_->DeleteResource(on_demand_tile_raster_resource_id_); | 2638 resource_provider_->DeleteResource(on_demand_tile_raster_resource_id_); |
| 2636 | 2639 |
| 2637 ReleaseRenderPassTextures(); | 2640 ReleaseRenderPassTextures(); |
| 2638 } | 2641 } |
| 2639 | 2642 |
| 2640 bool GLRenderer::IsContextLost() { | 2643 bool GLRenderer::IsContextLost() { |
| 2641 return (context_->getGraphicsResetStatusARB() != GL_NO_ERROR); | 2644 return (context_->getGraphicsResetStatusARB() != GL_NO_ERROR); |
| 2642 } | 2645 } |
| 2643 | 2646 |
| 2644 } // namespace cc | 2647 } // namespace cc |
| OLD | NEW |