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

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

Issue 605773004: CC: Tile-size cleanup. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Cleanup. Created 6 years, 2 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 | « no previous file | cc/layers/picture_layer_impl_unittest.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 <algorithm> 7 #include <algorithm>
8 #include <limits> 8 #include <limits>
9 #include <set> 9 #include <set>
10 10
(...skipping 26 matching lines...) Expand all
37 // tiling's scale if the desired scale is within this ratio. 37 // tiling's scale if the desired scale is within this ratio.
38 const float kSnapToExistingTilingRatio = 1.2f; 38 const float kSnapToExistingTilingRatio = 1.2f;
39 39
40 // Estimate skewport 60 frames ahead for pre-rasterization on the CPU. 40 // Estimate skewport 60 frames ahead for pre-rasterization on the CPU.
41 const float kCpuSkewportTargetTimeInFrames = 60.0f; 41 const float kCpuSkewportTargetTimeInFrames = 60.0f;
42 42
43 // Don't pre-rasterize on the GPU (except for kBackflingGuardDistancePixels in 43 // Don't pre-rasterize on the GPU (except for kBackflingGuardDistancePixels in
44 // TileManager::BinFromTilePriority). 44 // TileManager::BinFromTilePriority).
45 const float kGpuSkewportTargetTimeInFrames = 0.0f; 45 const float kGpuSkewportTargetTimeInFrames = 0.0f;
46 46
47 // Even for really wide viewports, at some point GPU raster should use
48 // less than 4 tiles to fill the viewport. This is set to 128 as a
49 // sane minimum for now, but we might want to increase with tuning.
50 const int kMinHeightForGpuRasteredTile = 128;
51
52 // When making odd-sized tiles, round them up to increase the chances
53 // of using the same tile size.
54 const int kTileRoundUp = 64;
55
47 } // namespace 56 } // namespace
48 57
49 namespace cc { 58 namespace cc {
50 59
51 PictureLayerImpl::Pair::Pair() : active(NULL), pending(NULL) { 60 PictureLayerImpl::Pair::Pair() : active(NULL), pending(NULL) {
52 } 61 }
53 62
54 PictureLayerImpl::Pair::Pair(PictureLayerImpl* active_layer, 63 PictureLayerImpl::Pair::Pair(PictureLayerImpl* active_layer,
55 PictureLayerImpl* pending_layer) 64 PictureLayerImpl* pending_layer)
56 : active(active_layer), pending(pending_layer) { 65 : active(active_layer), pending(pending_layer) {
(...skipping 610 matching lines...) Expand 10 before | Expand all | Expand 10 after
667 676
668 if (pile_->is_mask()) { 677 if (pile_->is_mask()) {
669 // Masks are not tiled, so if we can't cover the whole mask with one tile, 678 // Masks are not tiled, so if we can't cover the whole mask with one tile,
670 // don't make any tiles at all. Returning an empty size signals this. 679 // don't make any tiles at all. Returning an empty size signals this.
671 if (content_bounds.width() > max_texture_size || 680 if (content_bounds.width() > max_texture_size ||
672 content_bounds.height() > max_texture_size) 681 content_bounds.height() > max_texture_size)
673 return gfx::Size(); 682 return gfx::Size();
674 return content_bounds; 683 return content_bounds;
675 } 684 }
676 685
677 gfx::Size default_tile_size = layer_tree_impl()->settings().default_tile_size; 686 int default_tile_width = 0;
687 int default_tile_height = 0;
678 if (layer_tree_impl()->use_gpu_rasterization()) { 688 if (layer_tree_impl()->use_gpu_rasterization()) {
679 // TODO(ernstm) crbug.com/365877: We need a unified way to override the 689 // For GPU rasterization, we pick an ideal tile size using the viewport
680 // default-tile-size. 690 // so we don't need any settings. The current approach uses 4 tiles
681 default_tile_size = 691 // to cover the viewport vertically.
682 gfx::Size(layer_tree_impl()->device_viewport_size().width(), 692 int viewport_width = layer_tree_impl()->device_viewport_size().width();
683 layer_tree_impl()->device_viewport_size().height() / 4); 693 int viewport_height = layer_tree_impl()->device_viewport_size().height();
684 } 694 default_tile_width = viewport_width;
685 default_tile_size.SetToMin(gfx::Size(max_texture_size, max_texture_size)); 695 default_tile_height = viewport_height / 4;
696 default_tile_height =
697 std::max(default_tile_height, kMinHeightForGpuRasteredTile);
686 698
687 gfx::Size max_untiled_content_size = 699 // Increase the tile-height proportionally when the content width
688 layer_tree_impl()->settings().max_untiled_layer_size; 700 // drops below half the viewport width.
689 max_untiled_content_size.SetToMin( 701 if (content_bounds.width() <= viewport_width / 2)
690 gfx::Size(max_texture_size, max_texture_size)); 702 default_tile_height *= 2;
703 } else {
704 // For CPU rasterization we use tile-size settings.
705 const LayerTreeSettings& settings = layer_tree_impl()->settings();
706 int max_untiled_content_width = settings.max_untiled_layer_size.width();
707 int max_untiled_content_height = settings.max_untiled_layer_size.height();
708 default_tile_width = settings.default_tile_size.width();
709 default_tile_height = settings.default_tile_size.height();
691 710
692 bool any_dimension_too_large = 711 // If the content width is small, increase tile size vertically.
693 content_bounds.width() > max_untiled_content_size.width() || 712 // If the content height is small, increase tile size horizontally.
694 content_bounds.height() > max_untiled_content_size.height(); 713 // If both are less than the untiled-size, use a single tile.
695 714 if (content_bounds.width() < default_tile_width)
696 bool any_dimension_one_tile = 715 default_tile_height = max_untiled_content_height;
697 content_bounds.width() <= default_tile_size.width() || 716 if (content_bounds.height() < default_tile_height)
698 content_bounds.height() <= default_tile_size.height(); 717 default_tile_width = max_untiled_content_width;
699 718 if (content_bounds.width() < max_untiled_content_width &&
700 // If long and skinny, tile at the max untiled content size, and clamp 719 content_bounds.height() < max_untiled_content_height) {
701 // the smaller dimension to the content size, e.g. 1000x12 layer with 720 default_tile_height = max_untiled_content_height;
702 // 500x500 max untiled size would get 500x12 tiles. Also do this 721 default_tile_width = max_untiled_content_width;
703 // if the layer is small. 722 }
704 if (any_dimension_one_tile || !any_dimension_too_large) {
705 int width = std::min(
706 std::max(max_untiled_content_size.width(), default_tile_size.width()),
707 content_bounds.width());
708 int height = std::min(
709 std::max(max_untiled_content_size.height(), default_tile_size.height()),
710 content_bounds.height());
711 // Round up to the closest multiple of 64. This improves recycling and
712 // avoids odd texture sizes.
713 width = RoundUp(width, 64);
714 height = RoundUp(height, 64);
715 return gfx::Size(width, height);
716 } 723 }
717 724
718 return default_tile_size; 725 int tile_width = default_tile_width;
726 int tile_height = default_tile_height;
727
728 // Clamp the tile width/height to the content width/height to save space.
729 if (content_bounds.width() < default_tile_width) {
730 tile_width = std::min(tile_width, content_bounds.width());
731 tile_width = RoundUp(tile_width, kTileRoundUp);
732 tile_width = std::min(tile_width, default_tile_width);
733 }
734 if (content_bounds.height() < default_tile_height) {
735 tile_height = std::min(tile_height, content_bounds.height());
736 tile_height = RoundUp(tile_height, kTileRoundUp);
737 tile_height = std::min(tile_height, default_tile_height);
738 }
739
740 // Under no circumstance should we be larger than the max texture size.
741 tile_width = std::min(tile_width, max_texture_size);
742 tile_height = std::min(tile_height, max_texture_size);
743 return gfx::Size(tile_width, tile_height);
719 } 744 }
720 745
721 void PictureLayerImpl::SyncFromActiveLayer(const PictureLayerImpl* other) { 746 void PictureLayerImpl::SyncFromActiveLayer(const PictureLayerImpl* other) {
722 TRACE_EVENT0("cc", "SyncFromActiveLayer"); 747 TRACE_EVENT0("cc", "SyncFromActiveLayer");
723 DCHECK(!other->needs_post_commit_initialization_); 748 DCHECK(!other->needs_post_commit_initialization_);
724 DCHECK(other->tilings_); 749 DCHECK(other->tilings_);
725 750
726 if (!DrawsContent()) { 751 if (!DrawsContent()) {
727 RemoveAllTilings(); 752 RemoveAllTilings();
728 return; 753 return;
(...skipping 1058 matching lines...) Expand 10 before | Expand all | Expand 10 after
1787 PictureLayerTilingSet::TilingRange tiling_range = CurrentTilingRange(); 1812 PictureLayerTilingSet::TilingRange tiling_range = CurrentTilingRange();
1788 size_t current_tiling_range_offset = current_tiling_ - tiling_range.start; 1813 size_t current_tiling_range_offset = current_tiling_ - tiling_range.start;
1789 return tiling_range.end - 1 - current_tiling_range_offset; 1814 return tiling_range.end - 1 - current_tiling_range_offset;
1790 } 1815 }
1791 } 1816 }
1792 NOTREACHED(); 1817 NOTREACHED();
1793 return 0; 1818 return 0;
1794 } 1819 }
1795 1820
1796 } // namespace cc 1821 } // namespace cc
OLDNEW
« no previous file with comments | « no previous file | cc/layers/picture_layer_impl_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698