| 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 836 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 847 } | 847 } |
| 848 return device_background_texture.Pass(); | 848 return device_background_texture.Pass(); |
| 849 } | 849 } |
| 850 | 850 |
| 851 skia::RefPtr<SkImage> GLRenderer::ApplyBackgroundFilters( | 851 skia::RefPtr<SkImage> GLRenderer::ApplyBackgroundFilters( |
| 852 DrawingFrame* frame, | 852 DrawingFrame* frame, |
| 853 const RenderPassDrawQuad* quad, | 853 const RenderPassDrawQuad* quad, |
| 854 ScopedResource* background_texture) { | 854 ScopedResource* background_texture) { |
| 855 DCHECK(ShouldApplyBackgroundFilters(quad)); | 855 DCHECK(ShouldApplyBackgroundFilters(quad)); |
| 856 skia::RefPtr<SkImageFilter> filter = RenderSurfaceFilters::BuildImageFilter( | 856 skia::RefPtr<SkImageFilter> filter = RenderSurfaceFilters::BuildImageFilter( |
| 857 quad->background_filters, background_texture->size()); | 857 quad->background_filters, gfx::SizeF(background_texture->size())); |
| 858 | 858 |
| 859 skia::RefPtr<SkImage> background_with_filters = ApplyImageFilter( | 859 skia::RefPtr<SkImage> background_with_filters = ApplyImageFilter( |
| 860 ScopedUseGrContext::Create(this, frame), resource_provider_, quad->rect, | 860 ScopedUseGrContext::Create(this, frame), resource_provider_, quad->rect, |
| 861 quad->filters_scale, filter.get(), background_texture); | 861 quad->filters_scale, filter.get(), background_texture); |
| 862 return background_with_filters; | 862 return background_with_filters; |
| 863 } | 863 } |
| 864 | 864 |
| 865 void GLRenderer::DrawRenderPassQuad(DrawingFrame* frame, | 865 void GLRenderer::DrawRenderPassQuad(DrawingFrame* frame, |
| 866 const RenderPassDrawQuad* quad, | 866 const RenderPassDrawQuad* quad, |
| 867 const gfx::QuadF* clip_region) { | 867 const gfx::QuadF* clip_region) { |
| (...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 963 (quad->ShouldDrawWithBlending() || !IsDefaultBlendMode(blend_mode))); | 963 (quad->ShouldDrawWithBlending() || !IsDefaultBlendMode(blend_mode))); |
| 964 | 964 |
| 965 // TODO(senorblanco): Cache this value so that we don't have to do it for both | 965 // TODO(senorblanco): Cache this value so that we don't have to do it for both |
| 966 // the surface and its replica. Apply filters to the contents texture. | 966 // the surface and its replica. Apply filters to the contents texture. |
| 967 skia::RefPtr<SkImage> filter_image; | 967 skia::RefPtr<SkImage> filter_image; |
| 968 GLuint filter_image_id = 0; | 968 GLuint filter_image_id = 0; |
| 969 SkScalar color_matrix[20]; | 969 SkScalar color_matrix[20]; |
| 970 bool use_color_matrix = false; | 970 bool use_color_matrix = false; |
| 971 if (!quad->filters.IsEmpty()) { | 971 if (!quad->filters.IsEmpty()) { |
| 972 skia::RefPtr<SkImageFilter> filter = RenderSurfaceFilters::BuildImageFilter( | 972 skia::RefPtr<SkImageFilter> filter = RenderSurfaceFilters::BuildImageFilter( |
| 973 quad->filters, contents_texture->size()); | 973 quad->filters, gfx::SizeF(contents_texture->size())); |
| 974 if (filter) { | 974 if (filter) { |
| 975 skia::RefPtr<SkColorFilter> cf; | 975 skia::RefPtr<SkColorFilter> cf; |
| 976 | 976 |
| 977 { | 977 { |
| 978 SkColorFilter* colorfilter_rawptr = NULL; | 978 SkColorFilter* colorfilter_rawptr = NULL; |
| 979 filter->asColorFilter(&colorfilter_rawptr); | 979 filter->asColorFilter(&colorfilter_rawptr); |
| 980 cf = skia::AdoptRef(colorfilter_rawptr); | 980 cf = skia::AdoptRef(colorfilter_rawptr); |
| 981 } | 981 } |
| 982 | 982 |
| 983 if (cf && cf->asColorMatrix(color_matrix) && !filter->getInput(0)) { | 983 if (cf && cf->asColorMatrix(color_matrix) && !filter->getInput(0)) { |
| (...skipping 300 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1284 kAntiAliasingEpsilon; | 1284 kAntiAliasingEpsilon; |
| 1285 } | 1285 } |
| 1286 } // anonymous namespace | 1286 } // anonymous namespace |
| 1287 | 1287 |
| 1288 static gfx::QuadF GetDeviceQuadWithAntialiasingOnExteriorEdges( | 1288 static gfx::QuadF GetDeviceQuadWithAntialiasingOnExteriorEdges( |
| 1289 const LayerQuad& device_layer_edges, | 1289 const LayerQuad& device_layer_edges, |
| 1290 const gfx::Transform& device_transform, | 1290 const gfx::Transform& device_transform, |
| 1291 const gfx::QuadF& tile_quad, | 1291 const gfx::QuadF& tile_quad, |
| 1292 const gfx::QuadF* clip_region, | 1292 const gfx::QuadF* clip_region, |
| 1293 const DrawQuad* quad) { | 1293 const DrawQuad* quad) { |
| 1294 gfx::RectF tile_rect = gfx::RectF(quad->visible_rect); | 1294 auto tile_rect = gfx::RectF(quad->visible_rect); |
| 1295 | 1295 |
| 1296 gfx::PointF bottom_right = tile_quad.p3(); | 1296 gfx::PointF bottom_right = tile_quad.p3(); |
| 1297 gfx::PointF bottom_left = tile_quad.p4(); | 1297 gfx::PointF bottom_left = tile_quad.p4(); |
| 1298 gfx::PointF top_left = tile_quad.p1(); | 1298 gfx::PointF top_left = tile_quad.p1(); |
| 1299 gfx::PointF top_right = tile_quad.p2(); | 1299 gfx::PointF top_right = tile_quad.p2(); |
| 1300 bool clipped = false; | 1300 bool clipped = false; |
| 1301 | 1301 |
| 1302 // Map points to device space. We ignore |clipped|, since the result of | 1302 // Map points to device space. We ignore |clipped|, since the result of |
| 1303 // |MapPoint()| still produces a valid point to draw the quad with. When | 1303 // |MapPoint()| still produces a valid point to draw the quad with. When |
| 1304 // clipped, the point will be outside of the viewport. See crbug.com/416367. | 1304 // clipped, the point will be outside of the viewport. See crbug.com/416367. |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1347 return (clipped_quad->p1() - ideal_rect->p1()).LengthSquared() + | 1347 return (clipped_quad->p1() - ideal_rect->p1()).LengthSquared() + |
| 1348 (clipped_quad->p2() - ideal_rect->p2()).LengthSquared() + | 1348 (clipped_quad->p2() - ideal_rect->p2()).LengthSquared() + |
| 1349 (clipped_quad->p3() - ideal_rect->p3()).LengthSquared() + | 1349 (clipped_quad->p3() - ideal_rect->p3()).LengthSquared() + |
| 1350 (clipped_quad->p4() - ideal_rect->p4()).LengthSquared(); | 1350 (clipped_quad->p4() - ideal_rect->p4()).LengthSquared(); |
| 1351 } | 1351 } |
| 1352 | 1352 |
| 1353 // Attempt to rotate the clipped quad until it lines up the most | 1353 // Attempt to rotate the clipped quad until it lines up the most |
| 1354 // correctly. This is necessary because we check the edges of this | 1354 // correctly. This is necessary because we check the edges of this |
| 1355 // quad against the expected left/right/top/bottom for anti-aliasing. | 1355 // quad against the expected left/right/top/bottom for anti-aliasing. |
| 1356 void AlignQuadToBoundingBox(gfx::QuadF* clipped_quad) { | 1356 void AlignQuadToBoundingBox(gfx::QuadF* clipped_quad) { |
| 1357 gfx::QuadF bounding_quad = gfx::QuadF(clipped_quad->BoundingBox()); | 1357 auto bounding_quad = gfx::QuadF(clipped_quad->BoundingBox()); |
| 1358 gfx::QuadF best_rotation = *clipped_quad; | 1358 gfx::QuadF best_rotation = *clipped_quad; |
| 1359 float least_error_amount = GetTotalQuadError(clipped_quad, &bounding_quad); | 1359 float least_error_amount = GetTotalQuadError(clipped_quad, &bounding_quad); |
| 1360 for (size_t i = 1; i < 4; ++i) { | 1360 for (size_t i = 1; i < 4; ++i) { |
| 1361 clipped_quad->Realign(1); | 1361 clipped_quad->Realign(1); |
| 1362 float new_error = GetTotalQuadError(clipped_quad, &bounding_quad); | 1362 float new_error = GetTotalQuadError(clipped_quad, &bounding_quad); |
| 1363 if (new_error < least_error_amount) { | 1363 if (new_error < least_error_amount) { |
| 1364 least_error_amount = new_error; | 1364 least_error_amount = new_error; |
| 1365 best_rotation = *clipped_quad; | 1365 best_rotation = *clipped_quad; |
| 1366 } | 1366 } |
| 1367 } | 1367 } |
| (...skipping 158 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1526 quad->ShouldDrawWithBlending()) | 1526 quad->ShouldDrawWithBlending()) |
| 1527 return; | 1527 return; |
| 1528 | 1528 |
| 1529 gfx::Transform device_transform = | 1529 gfx::Transform device_transform = |
| 1530 frame->window_matrix * frame->projection_matrix * | 1530 frame->window_matrix * frame->projection_matrix * |
| 1531 quad->shared_quad_state->quad_to_target_transform; | 1531 quad->shared_quad_state->quad_to_target_transform; |
| 1532 device_transform.FlattenTo2d(); | 1532 device_transform.FlattenTo2d(); |
| 1533 if (!device_transform.IsInvertible()) | 1533 if (!device_transform.IsInvertible()) |
| 1534 return; | 1534 return; |
| 1535 | 1535 |
| 1536 gfx::QuadF local_quad = gfx::QuadF(gfx::RectF(tile_rect)); | 1536 auto local_quad = gfx::QuadF(gfx::RectF(tile_rect)); |
| 1537 | 1537 |
| 1538 gfx::QuadF device_layer_quad; | 1538 gfx::QuadF device_layer_quad; |
| 1539 bool use_aa = false; | 1539 bool use_aa = false; |
| 1540 bool allow_aa = settings_->allow_antialiasing && | 1540 bool allow_aa = settings_->allow_antialiasing && |
| 1541 !quad->force_anti_aliasing_off && quad->IsEdge(); | 1541 !quad->force_anti_aliasing_off && quad->IsEdge(); |
| 1542 | 1542 |
| 1543 if (allow_aa) { | 1543 if (allow_aa) { |
| 1544 bool clipped = false; | 1544 bool clipped = false; |
| 1545 bool force_aa = false; | 1545 bool force_aa = false; |
| 1546 device_layer_quad = MathUtil::MapQuad( | 1546 device_layer_quad = MathUtil::MapQuad( |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1591 | 1591 |
| 1592 SetShaderQuadF(local_quad, uniforms.quad_location); | 1592 SetShaderQuadF(local_quad, uniforms.quad_location); |
| 1593 | 1593 |
| 1594 // The transform and vertex data are used to figure out the extents that the | 1594 // The transform and vertex data are used to figure out the extents that the |
| 1595 // un-antialiased quad should have and which vertex this is and the float | 1595 // un-antialiased quad should have and which vertex this is and the float |
| 1596 // quad passed in via uniform is the actual geometry that gets used to draw | 1596 // quad passed in via uniform is the actual geometry that gets used to draw |
| 1597 // it. This is why this centered rect is used and not the original | 1597 // it. This is why this centered rect is used and not the original |
| 1598 // quad_rect. | 1598 // quad_rect. |
| 1599 gfx::RectF centered_rect( | 1599 gfx::RectF centered_rect( |
| 1600 gfx::PointF(-0.5f * tile_rect.width(), -0.5f * tile_rect.height()), | 1600 gfx::PointF(-0.5f * tile_rect.width(), -0.5f * tile_rect.height()), |
| 1601 tile_rect.size()); | 1601 gfx::SizeF(tile_rect.size())); |
| 1602 DrawQuadGeometry(frame, quad->shared_quad_state->quad_to_target_transform, | 1602 DrawQuadGeometry(frame, quad->shared_quad_state->quad_to_target_transform, |
| 1603 centered_rect, uniforms.matrix_location); | 1603 centered_rect, uniforms.matrix_location); |
| 1604 } else { | 1604 } else { |
| 1605 PrepareGeometry(SHARED_BINDING); | 1605 PrepareGeometry(SHARED_BINDING); |
| 1606 SetShaderQuadF(local_quad, uniforms.quad_location); | 1606 SetShaderQuadF(local_quad, uniforms.quad_location); |
| 1607 static float gl_matrix[16]; | 1607 static float gl_matrix[16]; |
| 1608 ToGLMatrix(&gl_matrix[0], | 1608 ToGLMatrix(&gl_matrix[0], |
| 1609 frame->projection_matrix * | 1609 frame->projection_matrix * |
| 1610 quad->shared_quad_state->quad_to_target_transform); | 1610 quad->shared_quad_state->quad_to_target_transform); |
| 1611 gl_->UniformMatrix4fv(uniforms.matrix_location, 1, false, &gl_matrix[0]); | 1611 gl_->UniformMatrix4fv(uniforms.matrix_location, 1, false, &gl_matrix[0]); |
| (...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1722 // Map clamping rectangle to unit square. | 1722 // Map clamping rectangle to unit square. |
| 1723 float vertex_tex_translate_x = -clamp_geom_rect.x() / clamp_geom_rect.width(); | 1723 float vertex_tex_translate_x = -clamp_geom_rect.x() / clamp_geom_rect.width(); |
| 1724 float vertex_tex_translate_y = | 1724 float vertex_tex_translate_y = |
| 1725 -clamp_geom_rect.y() / clamp_geom_rect.height(); | 1725 -clamp_geom_rect.y() / clamp_geom_rect.height(); |
| 1726 float vertex_tex_scale_x = tile_rect.width() / clamp_geom_rect.width(); | 1726 float vertex_tex_scale_x = tile_rect.width() / clamp_geom_rect.width(); |
| 1727 float vertex_tex_scale_y = tile_rect.height() / clamp_geom_rect.height(); | 1727 float vertex_tex_scale_y = tile_rect.height() / clamp_geom_rect.height(); |
| 1728 | 1728 |
| 1729 TexCoordPrecision tex_coord_precision = TexCoordPrecisionRequired( | 1729 TexCoordPrecision tex_coord_precision = TexCoordPrecisionRequired( |
| 1730 gl_, &highp_threshold_cache_, highp_threshold_min_, quad->texture_size); | 1730 gl_, &highp_threshold_cache_, highp_threshold_min_, quad->texture_size); |
| 1731 | 1731 |
| 1732 gfx::QuadF local_quad = gfx::QuadF(gfx::RectF(tile_rect)); | 1732 auto local_quad = gfx::QuadF(gfx::RectF(tile_rect)); |
| 1733 float edge[24]; | 1733 float edge[24]; |
| 1734 SetupQuadForClippingAndAntialiasing(device_transform, quad, &aa_quad, | 1734 SetupQuadForClippingAndAntialiasing(device_transform, quad, &aa_quad, |
| 1735 clip_region, &local_quad, edge); | 1735 clip_region, &local_quad, edge); |
| 1736 ResourceProvider::ScopedSamplerGL quad_resource_lock( | 1736 ResourceProvider::ScopedSamplerGL quad_resource_lock( |
| 1737 resource_provider_, resource_id, | 1737 resource_provider_, resource_id, |
| 1738 quad->nearest_neighbor ? GL_NEAREST : GL_LINEAR); | 1738 quad->nearest_neighbor ? GL_NEAREST : GL_LINEAR); |
| 1739 SamplerType sampler = | 1739 SamplerType sampler = |
| 1740 SamplerTypeFromTextureTarget(quad_resource_lock.target()); | 1740 SamplerTypeFromTextureTarget(quad_resource_lock.target()); |
| 1741 | 1741 |
| 1742 float fragment_tex_translate_x = clamp_tex_rect.x(); | 1742 float fragment_tex_translate_x = clamp_tex_rect.x(); |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1790 | 1790 |
| 1791 SetShaderOpacity(quad->shared_quad_state->opacity, uniforms.alpha_location); | 1791 SetShaderOpacity(quad->shared_quad_state->opacity, uniforms.alpha_location); |
| 1792 SetShaderQuadF(local_quad, uniforms.quad_location); | 1792 SetShaderQuadF(local_quad, uniforms.quad_location); |
| 1793 | 1793 |
| 1794 // The transform and vertex data are used to figure out the extents that the | 1794 // The transform and vertex data are used to figure out the extents that the |
| 1795 // un-antialiased quad should have and which vertex this is and the float | 1795 // un-antialiased quad should have and which vertex this is and the float |
| 1796 // quad passed in via uniform is the actual geometry that gets used to draw | 1796 // quad passed in via uniform is the actual geometry that gets used to draw |
| 1797 // it. This is why this centered rect is used and not the original quad_rect. | 1797 // it. This is why this centered rect is used and not the original quad_rect. |
| 1798 gfx::RectF centered_rect( | 1798 gfx::RectF centered_rect( |
| 1799 gfx::PointF(-0.5f * tile_rect.width(), -0.5f * tile_rect.height()), | 1799 gfx::PointF(-0.5f * tile_rect.width(), -0.5f * tile_rect.height()), |
| 1800 tile_rect.size()); | 1800 gfx::SizeF(tile_rect.size())); |
| 1801 DrawQuadGeometry(frame, quad->shared_quad_state->quad_to_target_transform, | 1801 DrawQuadGeometry(frame, quad->shared_quad_state->quad_to_target_transform, |
| 1802 centered_rect, uniforms.matrix_location); | 1802 centered_rect, uniforms.matrix_location); |
| 1803 } | 1803 } |
| 1804 | 1804 |
| 1805 void GLRenderer::DrawContentQuadNoAA(const DrawingFrame* frame, | 1805 void GLRenderer::DrawContentQuadNoAA(const DrawingFrame* frame, |
| 1806 const ContentDrawQuadBase* quad, | 1806 const ContentDrawQuadBase* quad, |
| 1807 ResourceId resource_id, | 1807 ResourceId resource_id, |
| 1808 const gfx::QuadF* clip_region) { | 1808 const gfx::QuadF* clip_region) { |
| 1809 gfx::RectF tex_coord_rect = MathUtil::ScaleRectProportional( | 1809 gfx::RectF tex_coord_rect = MathUtil::ScaleRectProportional( |
| 1810 quad->tex_coord_rect, gfx::RectF(quad->rect), | 1810 quad->tex_coord_rect, gfx::RectF(quad->rect), |
| (...skipping 292 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2103 case YUVVideoDrawQuad::JPEG: | 2103 case YUVVideoDrawQuad::JPEG: |
| 2104 yuv_to_rgb = yuv_to_rgb_jpeg; | 2104 yuv_to_rgb = yuv_to_rgb_jpeg; |
| 2105 yuv_adjust = yuv_adjust_full; | 2105 yuv_adjust = yuv_adjust_full; |
| 2106 break; | 2106 break; |
| 2107 } | 2107 } |
| 2108 | 2108 |
| 2109 // The transform and vertex data are used to figure out the extents that the | 2109 // The transform and vertex data are used to figure out the extents that the |
| 2110 // un-antialiased quad should have and which vertex this is and the float | 2110 // un-antialiased quad should have and which vertex this is and the float |
| 2111 // quad passed in via uniform is the actual geometry that gets used to draw | 2111 // quad passed in via uniform is the actual geometry that gets used to draw |
| 2112 // it. This is why this centered rect is used and not the original quad_rect. | 2112 // it. This is why this centered rect is used and not the original quad_rect. |
| 2113 gfx::RectF tile_rect = gfx::RectF(quad->rect); | 2113 auto tile_rect = gfx::RectF(quad->rect); |
| 2114 gl_->UniformMatrix3fv(yuv_matrix_location, 1, 0, yuv_to_rgb); | 2114 gl_->UniformMatrix3fv(yuv_matrix_location, 1, 0, yuv_to_rgb); |
| 2115 gl_->Uniform3fv(yuv_adj_location, 1, yuv_adjust); | 2115 gl_->Uniform3fv(yuv_adj_location, 1, yuv_adjust); |
| 2116 | 2116 |
| 2117 SetShaderOpacity(quad->shared_quad_state->opacity, alpha_location); | 2117 SetShaderOpacity(quad->shared_quad_state->opacity, alpha_location); |
| 2118 if (!clip_region) { | 2118 if (!clip_region) { |
| 2119 DrawQuadGeometry(frame, quad->shared_quad_state->quad_to_target_transform, | 2119 DrawQuadGeometry(frame, quad->shared_quad_state->quad_to_target_transform, |
| 2120 tile_rect, matrix_location); | 2120 tile_rect, matrix_location); |
| 2121 } else { | 2121 } else { |
| 2122 float uvs[8] = {0}; | 2122 float uvs[8] = {0}; |
| 2123 GetScaledUVs(quad->visible_rect, clip_region, uvs); | 2123 GetScaledUVs(quad->visible_rect, clip_region, uvs); |
| (...skipping 1406 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3530 texture_id = pending_overlay_resources_.back()->texture_id(); | 3530 texture_id = pending_overlay_resources_.back()->texture_id(); |
| 3531 } | 3531 } |
| 3532 | 3532 |
| 3533 context_support_->ScheduleOverlayPlane( | 3533 context_support_->ScheduleOverlayPlane( |
| 3534 overlay.plane_z_order, overlay.transform, texture_id, | 3534 overlay.plane_z_order, overlay.transform, texture_id, |
| 3535 ToNearestRect(overlay.display_rect), overlay.uv_rect); | 3535 ToNearestRect(overlay.display_rect), overlay.uv_rect); |
| 3536 } | 3536 } |
| 3537 } | 3537 } |
| 3538 | 3538 |
| 3539 } // namespace cc | 3539 } // namespace cc |
| OLD | NEW |