Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(85)

Side by Side Diff: cc/layers/picture_layer_impl.cc

Issue 2565643002: [5/5] Add translated rasterization for PictureLayerImpl (Closed)
Patch Set: forgot to update cc_perftests too Created 3 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « cc/layers/picture_layer_impl.h ('k') | cc/layers/picture_layer_impl_perftest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2012 The Chromium Authors. All rights reserved. 1 // Copyright 2012 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/layers/picture_layer_impl.h" 5 #include "cc/layers/picture_layer_impl.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 #include <stdint.h> 8 #include <stdint.h>
9 9
10 #include <algorithm> 10 #include <algorithm>
(...skipping 726 matching lines...) Expand 10 before | Expand all | Expand 10 after
737 } 737 }
738 738
739 const PictureLayerTiling* PictureLayerImpl::GetPendingOrActiveTwinTiling( 739 const PictureLayerTiling* PictureLayerImpl::GetPendingOrActiveTwinTiling(
740 const PictureLayerTiling* tiling) const { 740 const PictureLayerTiling* tiling) const {
741 PictureLayerImpl* twin_layer = GetPendingOrActiveTwinLayer(); 741 PictureLayerImpl* twin_layer = GetPendingOrActiveTwinLayer();
742 if (!twin_layer) 742 if (!twin_layer)
743 return nullptr; 743 return nullptr;
744 const PictureLayerTiling* twin_tiling = 744 const PictureLayerTiling* twin_tiling =
745 twin_layer->tilings_->FindTilingWithScaleKey( 745 twin_layer->tilings_->FindTilingWithScaleKey(
746 tiling->contents_scale_key()); 746 tiling->contents_scale_key());
747 DCHECK(tiling->raster_transform().translation() == gfx::Vector2dF()); 747 if (twin_tiling &&
748 DCHECK(!twin_tiling || 748 twin_tiling->raster_transform() == tiling->raster_transform())
749 twin_tiling->raster_transform().translation() == gfx::Vector2dF()); 749 return twin_tiling;
750 return twin_tiling; 750 return nullptr;
751 } 751 }
752 752
753 bool PictureLayerImpl::RequiresHighResToDraw() const { 753 bool PictureLayerImpl::RequiresHighResToDraw() const {
754 return layer_tree_impl()->RequiresHighResToDraw(); 754 return layer_tree_impl()->RequiresHighResToDraw();
755 } 755 }
756 756
757 gfx::Rect PictureLayerImpl::GetEnclosingRectInTargetSpace() const { 757 gfx::Rect PictureLayerImpl::GetEnclosingRectInTargetSpace() const {
758 return GetScaledEnclosingRectInTargetSpace(MaximumTilingContentsScale()); 758 return GetScaledEnclosingRectInTargetSpace(MaximumTilingContentsScale());
759 } 759 }
760 760
(...skipping 149 matching lines...) Expand 10 before | Expand all | Expand 10 after
910 } 910 }
911 911
912 void PictureLayerImpl::SetUseTransformedRasterization(bool use) { 912 void PictureLayerImpl::SetUseTransformedRasterization(bool use) {
913 if (use_transformed_rasterization_ == use) 913 if (use_transformed_rasterization_ == use)
914 return; 914 return;
915 915
916 use_transformed_rasterization_ = use; 916 use_transformed_rasterization_ = use;
917 NoteLayerPropertyChanged(); 917 NoteLayerPropertyChanged();
918 } 918 }
919 919
920 PictureLayerTiling* PictureLayerImpl::AddTiling(float contents_scale) { 920 PictureLayerTiling* PictureLayerImpl::AddTiling(
921 const gfx::AxisTransform2d& contents_transform) {
921 DCHECK(CanHaveTilings()); 922 DCHECK(CanHaveTilings());
922 DCHECK_GE(contents_scale, MinimumContentsScale()); 923 DCHECK_GE(contents_transform.scale(), MinimumContentsScale());
923 DCHECK_LE(contents_scale, MaximumContentsScale()); 924 DCHECK_LE(contents_transform.scale(), MaximumContentsScale());
924 DCHECK(raster_source_->HasRecordings()); 925 DCHECK(raster_source_->HasRecordings());
925 return tilings_->AddTiling( 926 return tilings_->AddTiling(contents_transform, raster_source_);
926 gfx::AxisTransform2d(contents_scale, gfx::Vector2dF()), raster_source_);
927 } 927 }
928 928
929 void PictureLayerImpl::RemoveAllTilings() { 929 void PictureLayerImpl::RemoveAllTilings() {
930 tilings_->RemoveAllTilings(); 930 tilings_->RemoveAllTilings();
931 // If there are no tilings, then raster scales are no longer meaningful. 931 // If there are no tilings, then raster scales are no longer meaningful.
932 ResetRasterScale(); 932 ResetRasterScale();
933 } 933 }
934 934
935 void PictureLayerImpl::AddTilingsForRasterScale() { 935 void PictureLayerImpl::AddTilingsForRasterScale() {
936 // Reset all resolution enums on tilings, we'll be setting new values in this 936 // Reset all resolution enums on tilings, we'll be setting new values in this
937 // function. 937 // function.
938 tilings_->MarkAllTilingsNonIdeal(); 938 tilings_->MarkAllTilingsNonIdeal();
939 939
940 PictureLayerTiling* high_res = 940 PictureLayerTiling* high_res =
941 tilings_->FindTilingWithScaleKey(raster_contents_scale_); 941 tilings_->FindTilingWithScaleKey(raster_contents_scale_);
942 // Note: This function is always invoked when raster scale is recomputed,
943 // but not necessarily changed. This means raster translation update is also
944 // always done when there are significant changes that triggered raster scale
945 // recomputation.
946 gfx::Vector2dF raster_translation =
947 CalculateRasterTranslation(raster_contents_scale_);
948 if (high_res &&
949 high_res->raster_transform().translation() != raster_translation) {
950 tilings_->Remove(high_res);
951 high_res = nullptr;
952 }
942 if (!high_res) { 953 if (!high_res) {
943 // We always need a high res tiling, so create one if it doesn't exist. 954 // We always need a high res tiling, so create one if it doesn't exist.
944 high_res = AddTiling(raster_contents_scale_); 955 high_res = AddTiling(
956 gfx::AxisTransform2d(raster_contents_scale_, raster_translation));
945 } else if (high_res->may_contain_low_resolution_tiles()) { 957 } else if (high_res->may_contain_low_resolution_tiles()) {
946 // If the tiling we find here was LOW_RESOLUTION previously, it may not be 958 // If the tiling we find here was LOW_RESOLUTION previously, it may not be
947 // fully rastered, so destroy the old tiles. 959 // fully rastered, so destroy the old tiles.
948 high_res->Reset(); 960 high_res->Reset();
949 // Reset the flag now that we'll make it high res, it will have fully 961 // Reset the flag now that we'll make it high res, it will have fully
950 // rastered content. 962 // rastered content.
951 high_res->reset_may_contain_low_resolution_tiles(); 963 high_res->reset_may_contain_low_resolution_tiles();
952 } 964 }
953 high_res->set_resolution(HIGH_RESOLUTION); 965 high_res->set_resolution(HIGH_RESOLUTION);
954 966
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after
1031 tilings_->FindTilingWithScaleKey(low_res_raster_contents_scale_); 1043 tilings_->FindTilingWithScaleKey(low_res_raster_contents_scale_);
1032 DCHECK(!low_res || low_res->resolution() != HIGH_RESOLUTION); 1044 DCHECK(!low_res || low_res->resolution() != HIGH_RESOLUTION);
1033 1045
1034 // Only create new low res tilings when the transform is static. This 1046 // Only create new low res tilings when the transform is static. This
1035 // prevents wastefully creating a paired low res tiling for every new high 1047 // prevents wastefully creating a paired low res tiling for every new high
1036 // res tiling during a pinch or a CSS animation. 1048 // res tiling during a pinch or a CSS animation.
1037 bool is_pinching = layer_tree_impl()->PinchGestureActive(); 1049 bool is_pinching = layer_tree_impl()->PinchGestureActive();
1038 bool is_animating = draw_properties().screen_space_transform_is_animating; 1050 bool is_animating = draw_properties().screen_space_transform_is_animating;
1039 if (!is_pinching && !is_animating) { 1051 if (!is_pinching && !is_animating) {
1040 if (!low_res) 1052 if (!low_res)
1041 low_res = AddTiling(low_res_raster_contents_scale_); 1053 low_res = AddTiling(gfx::AxisTransform2d(low_res_raster_contents_scale_,
1054 gfx::Vector2dF()));
1042 low_res->set_resolution(LOW_RESOLUTION); 1055 low_res->set_resolution(LOW_RESOLUTION);
1043 } 1056 }
1044 } 1057 }
1045 1058
1046 void PictureLayerImpl::RecalculateRasterScales() { 1059 void PictureLayerImpl::RecalculateRasterScales() {
1047 if (is_directly_composited_image_) { 1060 if (is_directly_composited_image_) {
1048 if (!raster_source_scale_) 1061 if (!raster_source_scale_)
1049 raster_source_scale_ = 1.f; 1062 raster_source_scale_ = 1.f;
1050 1063
1051 float min_scale = MinimumContentsScale(); 1064 float min_scale = MinimumContentsScale();
(...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after
1197 } 1210 }
1198 1211
1199 PictureLayerTilingSet* twin_set = twin ? twin->tilings_.get() : nullptr; 1212 PictureLayerTilingSet* twin_set = twin ? twin->tilings_.get() : nullptr;
1200 tilings_->CleanUpTilings(min_acceptable_high_res_scale, 1213 tilings_->CleanUpTilings(min_acceptable_high_res_scale,
1201 max_acceptable_high_res_scale, used_tilings, 1214 max_acceptable_high_res_scale, used_tilings,
1202 twin_set); 1215 twin_set);
1203 DCHECK_GT(tilings_->num_tilings(), 0u); 1216 DCHECK_GT(tilings_->num_tilings(), 0u);
1204 SanityCheckTilingState(); 1217 SanityCheckTilingState();
1205 } 1218 }
1206 1219
1220 gfx::Vector2dF PictureLayerImpl::CalculateRasterTranslation(
1221 float raster_scale) {
1222 if (!use_transformed_rasterization_)
1223 return gfx::Vector2dF();
1224
1225 DCHECK(!draw_properties().screen_space_transform_is_animating);
1226 gfx::Transform draw_transform = DrawTransform();
1227 DCHECK(draw_transform.IsScaleOrTranslation());
1228
1229 // It is only useful to align the content space to the target space if their
1230 // relative pixel ratio is some small rational number. Currently we only
1231 // align if the relative pixel ratio is 1:1.
1232 // Good match if the maximum alignment error on a layer of size 10000px
1233 // does not exceed 0.001px.
1234 static constexpr float kErrorThreshold = 0.0000001f;
1235 if (std::abs(draw_transform.matrix().getFloat(0, 0) - raster_scale) >
1236 kErrorThreshold ||
1237 std::abs(draw_transform.matrix().getFloat(1, 1) - raster_scale) >
1238 kErrorThreshold)
1239 return gfx::Vector2dF();
1240
1241 // Extract the fractional part of layer origin in the target space.
1242 float origin_x = draw_transform.matrix().getFloat(0, 3);
1243 float origin_y = draw_transform.matrix().getFloat(1, 3);
1244 return gfx::Vector2dF(origin_x - floorf(origin_x),
1245 origin_y - floorf(origin_y));
1246 }
1247
1207 float PictureLayerImpl::MinimumContentsScale() const { 1248 float PictureLayerImpl::MinimumContentsScale() const {
1208 float setting_min = layer_tree_impl()->settings().minimum_contents_scale; 1249 float setting_min = layer_tree_impl()->settings().minimum_contents_scale;
1209 1250
1210 // If the contents scale is less than 1 / width (also for height), 1251 // If the contents scale is less than 1 / width (also for height),
1211 // then it will end up having less than one pixel of content in that 1252 // then it will end up having less than one pixel of content in that
1212 // dimension. Bump the minimum contents scale up in this case to prevent 1253 // dimension. Bump the minimum contents scale up in this case to prevent
1213 // this from happening. 1254 // this from happening.
1214 int min_dimension = std::min(raster_source_->GetSize().width(), 1255 int min_dimension = std::min(raster_source_->GetSize().width(),
1215 raster_source_->GetSize().height()); 1256 raster_source_->GetSize().height());
1216 if (!min_dimension) 1257 if (!min_dimension)
(...skipping 221 matching lines...) Expand 10 before | Expand all | Expand 10 after
1438 } 1479 }
1439 1480
1440 invalidation_.Union(invalidation); 1481 invalidation_.Union(invalidation);
1441 tilings_->UpdateTilingsForImplSideInvalidation(invalidation); 1482 tilings_->UpdateTilingsForImplSideInvalidation(invalidation);
1442 SetNeedsPushProperties(); 1483 SetNeedsPushProperties();
1443 TRACE_EVENT_END1("cc", "PictureLayerImpl::InvalidateRegionForImages", 1484 TRACE_EVENT_END1("cc", "PictureLayerImpl::InvalidateRegionForImages",
1444 "Invalidation", invalidation.ToString()); 1485 "Invalidation", invalidation.ToString());
1445 } 1486 }
1446 1487
1447 } // namespace cc 1488 } // namespace cc
OLDNEW
« no previous file with comments | « cc/layers/picture_layer_impl.h ('k') | cc/layers/picture_layer_impl_perftest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698