diff options
-rw-r--r-- | cc/BUILD.gn | 3 | ||||
-rw-r--r-- | cc/cc.gyp | 2 | ||||
-rw-r--r-- | cc/cc_tests.gyp | 1 | ||||
-rw-r--r-- | cc/debug/picture_record_benchmark.cc | 2 | ||||
-rw-r--r-- | cc/debug/rasterize_and_record_benchmark.cc | 3 | ||||
-rw-r--r-- | cc/layers/picture_layer.cc | 16 | ||||
-rw-r--r-- | cc/layers/picture_layer.h | 2 | ||||
-rw-r--r-- | cc/resources/picture_pile.cc | 175 | ||||
-rw-r--r-- | cc/resources/picture_pile.h | 77 | ||||
-rw-r--r-- | cc/resources/picture_pile_base.cc | 205 | ||||
-rw-r--r-- | cc/resources/picture_pile_base.h | 137 | ||||
-rw-r--r-- | cc/resources/picture_pile_impl.cc | 6 | ||||
-rw-r--r-- | cc/resources/picture_pile_impl.h | 18 | ||||
-rw-r--r-- | cc/resources/picture_pile_unittest.cc | 216 | ||||
-rw-r--r-- | cc/resources/recording_source.h | 3 | ||||
-rw-r--r-- | cc/test/fake_picture_pile.h | 53 | ||||
-rw-r--r-- | cc/test/fake_picture_pile_impl.cc | 27 | ||||
-rw-r--r-- | cc/test/fake_picture_pile_impl.h | 2 | ||||
-rw-r--r-- | ui/compositor/layer.cc | 1 |
19 files changed, 416 insertions, 533 deletions
diff --git a/cc/BUILD.gn b/cc/BUILD.gn index 0b59c7e..37e471d 100644 --- a/cc/BUILD.gn +++ b/cc/BUILD.gn @@ -355,8 +355,6 @@ component("cc") { "resources/picture_layer_tiling_set.h", "resources/picture_pile.cc", "resources/picture_pile.h", - "resources/picture_pile_base.cc", - "resources/picture_pile_base.h", "resources/picture_pile_impl.cc", "resources/picture_pile_impl.h", "resources/pixel_buffer_raster_worker_pool.cc", @@ -544,6 +542,7 @@ source_set("test_support") { "test/fake_picture_layer_impl.h", "test/fake_picture_layer_tiling_client.cc", "test/fake_picture_layer_tiling_client.h", + "test/fake_picture_pile.h", "test/fake_picture_pile_impl.cc", "test/fake_picture_pile_impl.h", "test/fake_proxy.cc", @@ -383,8 +383,6 @@ 'resources/picture_layer_tiling_set.h', 'resources/picture_pile.cc', 'resources/picture_pile.h', - 'resources/picture_pile_base.cc', - 'resources/picture_pile_base.h', 'resources/picture_pile_impl.cc', 'resources/picture_pile_impl.h', 'resources/pixel_buffer_raster_worker_pool.cc', diff --git a/cc/cc_tests.gyp b/cc/cc_tests.gyp index 75267ef..db58318 100644 --- a/cc/cc_tests.gyp +++ b/cc/cc_tests.gyp @@ -170,6 +170,7 @@ 'test/fake_picture_layer_impl.h', 'test/fake_picture_layer_tiling_client.cc', 'test/fake_picture_layer_tiling_client.h', + 'test/fake_picture_pile.h', 'test/fake_picture_pile_impl.cc', 'test/fake_picture_pile_impl.h', 'test/fake_proxy.cc', diff --git a/cc/debug/picture_record_benchmark.cc b/cc/debug/picture_record_benchmark.cc index 5f832ae..ab50c7c 100644 --- a/cc/debug/picture_record_benchmark.cc +++ b/cc/debug/picture_record_benchmark.cc @@ -10,8 +10,10 @@ #include "base/values.h" #include "cc/layers/layer.h" #include "cc/layers/picture_layer.h" +#include "cc/resources/picture.h" #include "cc/trees/layer_tree_host.h" #include "cc/trees/layer_tree_host_common.h" +#include "third_party/skia/include/core/SkBBHFactory.h" #include "ui/gfx/geometry/rect.h" namespace cc { diff --git a/cc/debug/rasterize_and_record_benchmark.cc b/cc/debug/rasterize_and_record_benchmark.cc index f24dce3..a2052ab 100644 --- a/cc/debug/rasterize_and_record_benchmark.cc +++ b/cc/debug/rasterize_and_record_benchmark.cc @@ -15,6 +15,7 @@ #include "cc/debug/rasterize_and_record_benchmark_impl.h" #include "cc/layers/layer.h" #include "cc/layers/picture_layer.h" +#include "cc/resources/picture_pile.h" #include "cc/trees/layer_tree_host.h" #include "cc/trees/layer_tree_host_common.h" #include "ui/gfx/geometry/rect.h" @@ -106,7 +107,7 @@ void RasterizeAndRecordBenchmark::RunOnLayer(PictureLayer* layer) { gfx::Size tile_grid_size = host_->settings().default_tile_size; SkTileGridFactory::TileGridInfo tile_grid_info; - PicturePileBase::ComputeTileGridInfo(tile_grid_size, &tile_grid_info); + PicturePile::ComputeTileGridInfo(tile_grid_size, &tile_grid_info); gfx::Rect visible_content_rect = gfx::ScaleToEnclosingRect( layer->visible_content_rect(), 1.f / layer->contents_scale_x()); diff --git a/cc/layers/picture_layer.cc b/cc/layers/picture_layer.cc index a6b68cc..5d45cae 100644 --- a/cc/layers/picture_layer.cc +++ b/cc/layers/picture_layer.cc @@ -7,6 +7,7 @@ #include "base/auto_reset.h" #include "cc/layers/content_layer_client.h" #include "cc/layers/picture_layer_impl.h" +#include "cc/resources/picture_pile.h" #include "cc/trees/layer_tree_impl.h" #include "third_party/skia/include/core/SkPictureRecorder.h" #include "ui/gfx/geometry/rect_conversions.h" @@ -40,17 +41,18 @@ void PictureLayer::PushPropertiesTo(LayerImpl* base_layer) { gfx::Size impl_bounds = layer_impl->bounds(); gfx::Size recording_source_bounds = recording_source_->GetSize(); - // If update called, then pile size must match bounds pushed to impl layer. + // If update called, then recording source size must match bounds pushed to + // impl layer. DCHECK_IMPLIES(update_source_frame_number_ == source_frame_number, impl_bounds == recording_source_bounds) - << " bounds " << impl_bounds.ToString() << " pile " + << " bounds " << impl_bounds.ToString() << " recording source " << recording_source_bounds.ToString(); if (update_source_frame_number_ != source_frame_number && recording_source_bounds != impl_bounds) { // Update may not get called for the layer (if it's not in the viewport - // for example, even though it has resized making the pile no longer - // valid. In this case just destroy the pile. + // for example, even though it has resized making the recording source no + // longer valid. In this case just destroy the recording source. recording_source_->SetEmptyBounds(); } @@ -136,8 +138,8 @@ bool PictureLayer::Update(ResourceUpdateQueue* queue, if (updated) { SetNeedsPushProperties(); } else { - // If this invalidation did not affect the pile, then it can be cleared as - // an optimization. + // If this invalidation did not affect the recording source, then it can be + // cleared as an optimization. recording_invalidation_.Clear(); } @@ -162,7 +164,7 @@ void PictureLayer::UpdateCanUseLCDText() { } skia::RefPtr<SkPicture> PictureLayer::GetPicture() const { - // We could either flatten the PicturePile into a single SkPicture, + // We could either flatten the RecordingSource into a single SkPicture, // or paint a fresh one depending on what we intend to do with the // picture. For now we just paint a fresh one to get consistent results. if (!DrawsContent()) diff --git a/cc/layers/picture_layer.h b/cc/layers/picture_layer.h index 3da9668..2969ee1 100644 --- a/cc/layers/picture_layer.h +++ b/cc/layers/picture_layer.h @@ -9,12 +9,12 @@ #include "cc/debug/devtools_instrumentation.h" #include "cc/debug/micro_benchmark_controller.h" #include "cc/layers/layer.h" -#include "cc/resources/picture_pile.h" #include "cc/trees/occlusion_tracker.h" namespace cc { class ContentLayerClient; +class RecordingSource; class ResourceUpdateQueue; class CC_EXPORT PictureLayer : public Layer { diff --git a/cc/resources/picture_pile.cc b/cc/resources/picture_pile.cc index 7f80929..ab138ca 100644 --- a/cc/resources/picture_pile.cc +++ b/cc/resources/picture_pile.cc @@ -22,6 +22,24 @@ const int kPixelDistanceToRecord = 8000; // operations. const int kOpCountThatIsOkToAnalyze = 10; +// Dimensions of the tiles in this picture pile as well as the dimensions of +// the base picture in each tile. +const int kBasePictureSize = 512; +const int kTileGridBorderPixels = 1; +#ifdef NDEBUG +const bool kDefaultClearCanvasSetting = false; +#else +const bool kDefaultClearCanvasSetting = true; +#endif + +// Invalidation frequency settings. kInvalidationFrequencyThreshold is a value +// between 0 and 1 meaning invalidation frequency between 0% and 100% that +// indicates when to stop invalidating offscreen regions. +// kFrequentInvalidationDistanceThreshold defines what it means to be +// "offscreen" in terms of distance to visible in css pixels. +const float kInvalidationFrequencyThreshold = 0.75f; +const int kFrequentInvalidationDistanceThreshold = 512; + // TODO(humper): The density threshold here is somewhat arbitrary; need a // way to set // this from the command line so we can write a benchmark // script and find a sweet spot. @@ -149,8 +167,21 @@ float ClusterTiles(const std::vector<gfx::Rect>& invalid_tiles, namespace cc { PicturePile::PicturePile() - : is_suitable_for_gpu_rasterization_(true), - pixel_record_distance_(kPixelDistanceToRecord) { + : min_contents_scale_(0), + slow_down_raster_scale_factor_for_debug_(0), + contents_opaque_(false), + contents_fill_bounds_completely_(false), + clear_canvas_with_debug_color_(kDefaultClearCanvasSetting), + has_any_recordings_(false), + is_mask_(false), + is_solid_color_(false), + solid_color_(SK_ColorTRANSPARENT), + pixel_record_distance_(kPixelDistanceToRecord), + is_suitable_for_gpu_rasterization_(true) { + tiling_.SetMaxTextureSize(gfx::Size(kBasePictureSize, kBasePictureSize)); + tile_grid_info_.fTileInterval.setEmpty(); + tile_grid_info_.fMargin.setEmpty(); + tile_grid_info_.fOffset.setZero(); } PicturePile::~PicturePile() { @@ -173,7 +204,7 @@ bool PicturePile::UpdateAndExpandInvalidation( bool updated = false; Region resize_invalidation; - gfx::Size old_tiling_size = tiling_size(); + gfx::Size old_tiling_size = GetSize(); if (old_tiling_size != layer_size) { tiling_.SetTilingSize(layer_size); updated = true; @@ -182,17 +213,17 @@ bool PicturePile::UpdateAndExpandInvalidation( gfx::Rect interest_rect = visible_layer_rect; interest_rect.Inset(-pixel_record_distance_, -pixel_record_distance_); recorded_viewport_ = interest_rect; - recorded_viewport_.Intersect(gfx::Rect(tiling_size())); + recorded_viewport_.Intersect(gfx::Rect(GetSize())); gfx::Rect interest_rect_over_tiles = tiling_.ExpandRectToTileBounds(interest_rect); gfx::Size min_tiling_size( - std::min(tiling_size().width(), old_tiling_size.width()), - std::min(tiling_size().height(), old_tiling_size.height())); + std::min(GetSize().width(), old_tiling_size.width()), + std::min(GetSize().height(), old_tiling_size.height())); gfx::Size max_tiling_size( - std::max(tiling_size().width(), old_tiling_size.width()), - std::max(tiling_size().height(), old_tiling_size.height())); + std::max(GetSize().width(), old_tiling_size.width()), + std::max(GetSize().height(), old_tiling_size.height())); if (old_tiling_size != layer_size) { has_any_recordings_ = false; @@ -388,7 +419,7 @@ bool PicturePile::UpdateAndExpandInvalidation( // Detect cases where the full pile is invalidated, in this situation we // can just drop/invalidate everything. if (invalidation->Contains(gfx::Rect(old_tiling_size)) || - invalidation->Contains(gfx::Rect(tiling_size()))) { + invalidation->Contains(gfx::Rect(GetSize()))) { for (auto& it : picture_map_) updated = it.second.Invalidate(frame_number) || updated; } else { @@ -539,7 +570,7 @@ bool PicturePile::UpdateAndExpandInvalidation( } gfx::Size PicturePile::GetSize() const { - return tiling_size(); + return tiling_.tiling_size(); } void PicturePile::SetEmptyBounds() { @@ -548,23 +579,51 @@ void PicturePile::SetEmptyBounds() { } void PicturePile::SetMinContentsScale(float min_contents_scale) { - PicturePileBase::SetMinContentsScale(min_contents_scale); + DCHECK(min_contents_scale); + if (min_contents_scale_ == min_contents_scale) + return; + + // Picture contents are played back scaled. When the final contents scale is + // less than 1 (i.e. low res), then multiple recorded pixels will be used + // to raster one final pixel. To avoid splitting a final pixel across + // pictures (which would result in incorrect rasterization due to blending), a + // buffer margin is added so that any picture can be snapped to integral + // final pixels. + // + // For example, if a 1/4 contents scale is used, then that would be 3 buffer + // pixels, since that's the minimum number of pixels to add so that resulting + // content can be snapped to a four pixel aligned grid. + int buffer_pixels = static_cast<int>(ceil(1 / min_contents_scale) - 1); + buffer_pixels = std::max(0, buffer_pixels); + SetBufferPixels(buffer_pixels); + min_contents_scale_ = min_contents_scale; +} + +// static +void PicturePile::ComputeTileGridInfo(const gfx::Size& tile_grid_size, + SkTileGridFactory::TileGridInfo* info) { + DCHECK(info); + info->fTileInterval.set(tile_grid_size.width() - 2 * kTileGridBorderPixels, + tile_grid_size.height() - 2 * kTileGridBorderPixels); + DCHECK_GT(info->fTileInterval.width(), 0); + DCHECK_GT(info->fTileInterval.height(), 0); + info->fMargin.set(kTileGridBorderPixels, kTileGridBorderPixels); + // Offset the tile grid coordinate space to take into account the fact + // that the top-most and left-most tiles do not have top and left borders + // respectively. + info->fOffset.set(-kTileGridBorderPixels, -kTileGridBorderPixels); } void PicturePile::SetTileGridSize(const gfx::Size& tile_grid_size) { - PicturePileBase::SetTileGridSize(tile_grid_size); + ComputeTileGridInfo(tile_grid_size, &tile_grid_info_); } void PicturePile::SetSlowdownRasterScaleFactor(int factor) { slow_down_raster_scale_factor_for_debug_ = factor; } -void PicturePile::SetShowDebugPictureBorders(bool show) { - show_debug_picture_borders_ = show; -} - void PicturePile::SetIsMask(bool is_mask) { - set_is_mask(is_mask); + is_mask_ = is_mask; } void PicturePile::SetUnsuitableForGpuRasterizationForTesting() { @@ -576,11 +635,12 @@ bool PicturePile::IsSuitableForGpuRasterization() const { } scoped_refptr<RasterSource> PicturePile::CreateRasterSource() const { - return PicturePileImpl::CreateFromOther(this); + return scoped_refptr<RasterSource>( + PicturePileImpl::CreateFromPicturePile(this)); } SkTileGridFactory::TileGridInfo PicturePile::GetTileGridInfoForTesting() const { - return PicturePileBase::GetTileGridInfoForTesting(); + return tile_grid_info_; } bool PicturePile::CanRasterSlowTileCheck(const gfx::Rect& layer_rect) const { @@ -628,4 +688,81 @@ void PicturePile::DetermineIfSolidColor() { is_solid_color_ = canvas.GetColorIfSolid(&solid_color_); } +gfx::Rect PicturePile::PaddedRect(const PictureMapKey& key) const { + gfx::Rect tile = tiling_.TileBounds(key.first, key.second); + return PadRect(tile); +} + +gfx::Rect PicturePile::PadRect(const gfx::Rect& rect) const { + gfx::Rect padded_rect = rect; + padded_rect.Inset(-buffer_pixels(), -buffer_pixels(), -buffer_pixels(), + -buffer_pixels()); + return padded_rect; +} + +void PicturePile::Clear() { + picture_map_.clear(); + recorded_viewport_ = gfx::Rect(); + has_any_recordings_ = false; + is_solid_color_ = false; +} + +PicturePile::PictureInfo::PictureInfo() : last_frame_number_(0) { +} + +PicturePile::PictureInfo::~PictureInfo() { +} + +void PicturePile::PictureInfo::AdvanceInvalidationHistory(int frame_number) { + DCHECK_GE(frame_number, last_frame_number_); + if (frame_number == last_frame_number_) + return; + + invalidation_history_ <<= (frame_number - last_frame_number_); + last_frame_number_ = frame_number; +} + +bool PicturePile::PictureInfo::Invalidate(int frame_number) { + AdvanceInvalidationHistory(frame_number); + invalidation_history_.set(0); + + bool did_invalidate = !!picture_.get(); + picture_ = NULL; + return did_invalidate; +} + +bool PicturePile::PictureInfo::NeedsRecording(int frame_number, + int distance_to_visible) { + AdvanceInvalidationHistory(frame_number); + + // We only need recording if we don't have a picture. Furthermore, we only + // need a recording if we're within frequent invalidation distance threshold + // or the invalidation is not frequent enough (below invalidation frequency + // threshold). + return !picture_.get() && + ((distance_to_visible <= kFrequentInvalidationDistanceThreshold) || + (GetInvalidationFrequency() < kInvalidationFrequencyThreshold)); +} + +void PicturePile::SetBufferPixels(int new_buffer_pixels) { + if (new_buffer_pixels == buffer_pixels()) + return; + + Clear(); + tiling_.SetBorderTexels(new_buffer_pixels); +} + +void PicturePile::PictureInfo::SetPicture(scoped_refptr<Picture> picture) { + picture_ = picture; +} + +const Picture* PicturePile::PictureInfo::GetPicture() const { + return picture_.get(); +} + +float PicturePile::PictureInfo::GetInvalidationFrequency() const { + return invalidation_history_.count() / + static_cast<float>(INVALIDATION_FRAMES_TRACKED); +} + } // namespace cc diff --git a/cc/resources/picture_pile.h b/cc/resources/picture_pile.h index 4ad57b3..ffd9b52 100644 --- a/cc/resources/picture_pile.h +++ b/cc/resources/picture_pile.h @@ -5,21 +5,21 @@ #ifndef CC_RESOURCES_PICTURE_PILE_H_ #define CC_RESOURCES_PICTURE_PILE_H_ +#include <bitset> + #include "base/memory/ref_counted.h" -#include "cc/resources/picture_pile_base.h" +#include "cc/base/tiling_data.h" #include "cc/resources/recording_source.h" namespace cc { -class ContentLayerClient; class PicturePileImpl; -class Region; -class RenderingStatsInstrumentation; -class CC_EXPORT PicturePile : public PicturePileBase, public RecordingSource { +class CC_EXPORT PicturePile : public RecordingSource { public: PicturePile(); ~PicturePile() override; + // RecordingSource overrides. bool UpdateAndExpandInvalidation( ContentLayerClient* painter, Region* invalidation, @@ -30,32 +30,91 @@ class CC_EXPORT PicturePile : public PicturePileBase, public RecordingSource { const gfx::Rect& visible_layer_rect, int frame_number, Picture::RecordingMode recording_mode) override; - gfx::Size GetSize() const override; + gfx::Size GetSize() const final; void SetEmptyBounds() override; void SetMinContentsScale(float min_contents_scale) override; void SetTileGridSize(const gfx::Size& tile_grid_size) override; void SetSlowdownRasterScaleFactor(int factor) override; - void SetShowDebugPictureBorders(bool show) override; void SetIsMask(bool is_mask) override; bool IsSuitableForGpuRasterization() const override; scoped_refptr<RasterSource> CreateRasterSource() const override; void SetUnsuitableForGpuRasterizationForTesting() override; SkTileGridFactory::TileGridInfo GetTileGridInfoForTesting() const override; - void SetPixelRecordDistanceForTesting(int d) { pixel_record_distance_ = d; } + static void ComputeTileGridInfo(const gfx::Size& tile_grid_size, + SkTileGridFactory::TileGridInfo* info); protected: + class CC_EXPORT PictureInfo { + public: + enum { INVALIDATION_FRAMES_TRACKED = 32 }; + + PictureInfo(); + ~PictureInfo(); + + bool Invalidate(int frame_number); + bool NeedsRecording(int frame_number, int distance_to_visible); + void SetPicture(scoped_refptr<Picture> picture); + const Picture* GetPicture() const; + + float GetInvalidationFrequencyForTesting() const { + return GetInvalidationFrequency(); + } + + private: + void AdvanceInvalidationHistory(int frame_number); + float GetInvalidationFrequency() const; + + int last_frame_number_; + scoped_refptr<const Picture> picture_; + std::bitset<INVALIDATION_FRAMES_TRACKED> invalidation_history_; + }; + + typedef std::pair<int, int> PictureMapKey; + typedef base::hash_map<PictureMapKey, PictureInfo> PictureMap; + // An internal CanRaster check that goes to the picture_map rather than // using the recorded_viewport hint. bool CanRasterSlowTileCheck(const gfx::Rect& layer_rect) const; + void Clear(); + + gfx::Rect PaddedRect(const PictureMapKey& key) const; + gfx::Rect PadRect(const gfx::Rect& rect) const; + + int buffer_pixels() const { return tiling_.border_texels(); } + + // A picture pile is a tiled set of pictures. The picture map is a map of tile + // indices to picture infos. + PictureMap picture_map_; + TilingData tiling_; + + // If non-empty, all pictures tiles inside this rect are recorded. There may + // be recordings outside this rect, but everything inside the rect is + // recorded. + gfx::Rect recorded_viewport_; + float min_contents_scale_; + SkTileGridFactory::TileGridInfo tile_grid_info_; + SkColor background_color_; + int slow_down_raster_scale_factor_for_debug_; + bool contents_opaque_; + bool contents_fill_bounds_completely_; + bool clear_canvas_with_debug_color_; + // A hint about whether there are any recordings. This may be a false + // positive. + bool has_any_recordings_; + bool is_mask_; + bool is_solid_color_; + SkColor solid_color_; + int pixel_record_distance_; + private: friend class PicturePileImpl; void DetermineIfSolidColor(); + void SetBufferPixels(int buffer_pixels); bool is_suitable_for_gpu_rasterization_; - int pixel_record_distance_; DISALLOW_COPY_AND_ASSIGN(PicturePile); }; diff --git a/cc/resources/picture_pile_base.cc b/cc/resources/picture_pile_base.cc deleted file mode 100644 index 1184cf1..0000000 --- a/cc/resources/picture_pile_base.cc +++ /dev/null @@ -1,205 +0,0 @@ -// Copyright 2013 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "cc/resources/picture_pile_base.h" - -#include <algorithm> -#include <set> -#include <vector> - -#include "base/debug/trace_event_argument.h" -#include "base/logging.h" -#include "base/values.h" -#include "cc/debug/traced_value.h" -#include "third_party/skia/include/core/SkColor.h" -#include "ui/gfx/geometry/rect_conversions.h" - -namespace { -// Dimensions of the tiles in this picture pile as well as the dimensions of -// the base picture in each tile. -const int kBasePictureSize = 512; -const int kTileGridBorderPixels = 1; -#ifdef NDEBUG -const bool kDefaultClearCanvasSetting = false; -#else -const bool kDefaultClearCanvasSetting = true; -#endif - -// Invalidation frequency settings. kInvalidationFrequencyThreshold is a value -// between 0 and 1 meaning invalidation frequency between 0% and 100% that -// indicates when to stop invalidating offscreen regions. -// kFrequentInvalidationDistanceThreshold defines what it means to be -// "offscreen" in terms of distance to visible in css pixels. -const float kInvalidationFrequencyThreshold = 0.75f; -const int kFrequentInvalidationDistanceThreshold = 512; - -} // namespace - -namespace cc { - -PicturePileBase::PicturePileBase() - : min_contents_scale_(0), - background_color_(SkColorSetARGBInline(0, 0, 0, 0)), - slow_down_raster_scale_factor_for_debug_(0), - contents_opaque_(false), - contents_fill_bounds_completely_(false), - show_debug_picture_borders_(false), - clear_canvas_with_debug_color_(kDefaultClearCanvasSetting), - has_any_recordings_(false), - is_mask_(false), - is_solid_color_(false), - solid_color_(SK_ColorTRANSPARENT) { - tiling_.SetMaxTextureSize(gfx::Size(kBasePictureSize, kBasePictureSize)); - tile_grid_info_.fTileInterval.setEmpty(); - tile_grid_info_.fMargin.setEmpty(); - tile_grid_info_.fOffset.setZero(); -} - -PicturePileBase::PicturePileBase(const PicturePileBase* other) - : picture_map_(other->picture_map_), - tiling_(other->tiling_), - recorded_viewport_(other->recorded_viewport_), - min_contents_scale_(other->min_contents_scale_), - tile_grid_info_(other->tile_grid_info_), - background_color_(other->background_color_), - slow_down_raster_scale_factor_for_debug_( - other->slow_down_raster_scale_factor_for_debug_), - contents_opaque_(other->contents_opaque_), - contents_fill_bounds_completely_(other->contents_fill_bounds_completely_), - show_debug_picture_borders_(other->show_debug_picture_borders_), - clear_canvas_with_debug_color_(other->clear_canvas_with_debug_color_), - has_any_recordings_(other->has_any_recordings_), - is_mask_(other->is_mask_), - is_solid_color_(other->is_solid_color_), - solid_color_(other->solid_color_) { -} - -PicturePileBase::~PicturePileBase() { -} - -void PicturePileBase::SetMinContentsScale(float min_contents_scale) { - DCHECK(min_contents_scale); - if (min_contents_scale_ == min_contents_scale) - return; - - // Picture contents are played back scaled. When the final contents scale is - // less than 1 (i.e. low res), then multiple recorded pixels will be used - // to raster one final pixel. To avoid splitting a final pixel across - // pictures (which would result in incorrect rasterization due to blending), a - // buffer margin is added so that any picture can be snapped to integral - // final pixels. - // - // For example, if a 1/4 contents scale is used, then that would be 3 buffer - // pixels, since that's the minimum number of pixels to add so that resulting - // content can be snapped to a four pixel aligned grid. - int buffer_pixels = static_cast<int>(ceil(1 / min_contents_scale) - 1); - buffer_pixels = std::max(0, buffer_pixels); - SetBufferPixels(buffer_pixels); - min_contents_scale_ = min_contents_scale; -} - -// static -void PicturePileBase::ComputeTileGridInfo( - const gfx::Size& tile_grid_size, - SkTileGridFactory::TileGridInfo* info) { - DCHECK(info); - info->fTileInterval.set(tile_grid_size.width() - 2 * kTileGridBorderPixels, - tile_grid_size.height() - 2 * kTileGridBorderPixels); - DCHECK_GT(info->fTileInterval.width(), 0); - DCHECK_GT(info->fTileInterval.height(), 0); - info->fMargin.set(kTileGridBorderPixels, kTileGridBorderPixels); - // Offset the tile grid coordinate space to take into account the fact - // that the top-most and left-most tiles do not have top and left borders - // respectively. - info->fOffset.set(-kTileGridBorderPixels, -kTileGridBorderPixels); -} - -void PicturePileBase::SetTileGridSize(const gfx::Size& tile_grid_size) { - ComputeTileGridInfo(tile_grid_size, &tile_grid_info_); -} - -void PicturePileBase::SetBufferPixels(int new_buffer_pixels) { - if (new_buffer_pixels == buffer_pixels()) - return; - - Clear(); - tiling_.SetBorderTexels(new_buffer_pixels); -} - -void PicturePileBase::Clear() { - picture_map_.clear(); - recorded_viewport_ = gfx::Rect(); - has_any_recordings_ = false; - is_solid_color_ = false; -} - -bool PicturePileBase::HasRecordingAt(int x, int y) { - PictureMap::const_iterator found = picture_map_.find(PictureMapKey(x, y)); - if (found == picture_map_.end()) - return false; - return !!found->second.GetPicture(); -} - -gfx::Rect PicturePileBase::PaddedRect(const PictureMapKey& key) const { - gfx::Rect tile = tiling_.TileBounds(key.first, key.second); - return PadRect(tile); -} - -gfx::Rect PicturePileBase::PadRect(const gfx::Rect& rect) const { - gfx::Rect padded_rect = rect; - padded_rect.Inset( - -buffer_pixels(), -buffer_pixels(), -buffer_pixels(), -buffer_pixels()); - return padded_rect; -} - -PicturePileBase::PictureInfo::PictureInfo() : last_frame_number_(0) {} - -PicturePileBase::PictureInfo::~PictureInfo() {} - -void PicturePileBase::PictureInfo::AdvanceInvalidationHistory( - int frame_number) { - DCHECK_GE(frame_number, last_frame_number_); - if (frame_number == last_frame_number_) - return; - - invalidation_history_ <<= (frame_number - last_frame_number_); - last_frame_number_ = frame_number; -} - -bool PicturePileBase::PictureInfo::Invalidate(int frame_number) { - AdvanceInvalidationHistory(frame_number); - invalidation_history_.set(0); - - bool did_invalidate = !!picture_.get(); - picture_ = NULL; - return did_invalidate; -} - -bool PicturePileBase::PictureInfo::NeedsRecording(int frame_number, - int distance_to_visible) { - AdvanceInvalidationHistory(frame_number); - - // We only need recording if we don't have a picture. Furthermore, we only - // need a recording if we're within frequent invalidation distance threshold - // or the invalidation is not frequent enough (below invalidation frequency - // threshold). - return !picture_.get() && - ((distance_to_visible <= kFrequentInvalidationDistanceThreshold) || - (GetInvalidationFrequency() < kInvalidationFrequencyThreshold)); -} - -void PicturePileBase::PictureInfo::SetPicture(scoped_refptr<Picture> picture) { - picture_ = picture; -} - -const Picture* PicturePileBase::PictureInfo::GetPicture() const { - return picture_.get(); -} - -float PicturePileBase::PictureInfo::GetInvalidationFrequency() const { - return invalidation_history_.count() / - static_cast<float>(INVALIDATION_FRAMES_TRACKED); -} - -} // namespace cc diff --git a/cc/resources/picture_pile_base.h b/cc/resources/picture_pile_base.h deleted file mode 100644 index 66d37d8..0000000 --- a/cc/resources/picture_pile_base.h +++ /dev/null @@ -1,137 +0,0 @@ -// Copyright 2013 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CC_RESOURCES_PICTURE_PILE_BASE_H_ -#define CC_RESOURCES_PICTURE_PILE_BASE_H_ - -#include <bitset> -#include <list> -#include <utility> - -#include "base/containers/hash_tables.h" -#include "cc/base/cc_export.h" -#include "cc/base/region.h" -#include "cc/base/tiling_data.h" -#include "cc/resources/picture.h" -#include "ui/gfx/geometry/size.h" - -namespace base { -namespace debug { -class TracedValue; -} -class Value; -} - -namespace cc { - -class CC_EXPORT PicturePileBase { - public: - PicturePileBase(); - explicit PicturePileBase(const PicturePileBase* other); - - gfx::Size tiling_size() const { return tiling_.tiling_size(); } - void SetMinContentsScale(float min_contents_scale); - - // If non-empty, all pictures tiles inside this rect are recorded. There may - // be recordings outside this rect, but everything inside the rect is - // recorded. - gfx::Rect recorded_viewport() const { return recorded_viewport_; } - - int num_tiles_x() const { return tiling_.num_tiles_x(); } - int num_tiles_y() const { return tiling_.num_tiles_y(); } - gfx::Rect tile_bounds(int x, int y) const { return tiling_.TileBounds(x, y); } - bool HasRecordingAt(int x, int y); - - bool is_solid_color() const { return is_solid_color_; } - SkColor solid_color() const { return solid_color_; } - - void set_is_mask(bool is_mask) { is_mask_ = is_mask; } - - static void ComputeTileGridInfo(const gfx::Size& tile_grid_size, - SkTileGridFactory::TileGridInfo* info); - - void SetTileGridSize(const gfx::Size& tile_grid_size); - TilingData& tiling() { return tiling_; } - - SkTileGridFactory::TileGridInfo GetTileGridInfoForTesting() const { - return tile_grid_info_; - } - - void SetRecordedViewportForTesting(const gfx::Rect& viewport) { - recorded_viewport_ = viewport; - } - void SetHasAnyRecordingsForTesting(bool has_recordings) { - has_any_recordings_ = has_recordings; - } - - protected: - class CC_EXPORT PictureInfo { - public: - enum { - INVALIDATION_FRAMES_TRACKED = 32 - }; - - PictureInfo(); - ~PictureInfo(); - - bool Invalidate(int frame_number); - bool NeedsRecording(int frame_number, int distance_to_visible); - void SetPicture(scoped_refptr<Picture> picture); - const Picture* GetPicture() const; - - float GetInvalidationFrequencyForTesting() const { - return GetInvalidationFrequency(); - } - - private: - void AdvanceInvalidationHistory(int frame_number); - float GetInvalidationFrequency() const; - - int last_frame_number_; - scoped_refptr<const Picture> picture_; - std::bitset<INVALIDATION_FRAMES_TRACKED> invalidation_history_; - }; - - typedef std::pair<int, int> PictureMapKey; - typedef base::hash_map<PictureMapKey, PictureInfo> PictureMap; - - virtual ~PicturePileBase(); - - int buffer_pixels() const { return tiling_.border_texels(); } - void Clear(); - - gfx::Rect PaddedRect(const PictureMapKey& key) const; - gfx::Rect PadRect(const gfx::Rect& rect) const; - - // A picture pile is a tiled set of pictures. The picture map is a map of tile - // indices to picture infos. - PictureMap picture_map_; - TilingData tiling_; - gfx::Rect recorded_viewport_; - float min_contents_scale_; - SkTileGridFactory::TileGridInfo tile_grid_info_; - SkColor background_color_; - int slow_down_raster_scale_factor_for_debug_; - bool contents_opaque_; - bool contents_fill_bounds_completely_; - bool show_debug_picture_borders_; - bool clear_canvas_with_debug_color_; - // A hint about whether there are any recordings. This may be a false - // positive. - bool has_any_recordings_; - bool is_mask_; - bool is_solid_color_; - SkColor solid_color_; - - private: - friend class PicturePileImpl; - - void SetBufferPixels(int buffer_pixels); - - DISALLOW_COPY_AND_ASSIGN(PicturePileBase); -}; - -} // namespace cc - -#endif // CC_RESOURCES_PICTURE_PILE_BASE_H_ diff --git a/cc/resources/picture_pile_impl.cc b/cc/resources/picture_pile_impl.cc index 7514e07..7ec9252 100644 --- a/cc/resources/picture_pile_impl.cc +++ b/cc/resources/picture_pile_impl.cc @@ -20,8 +20,8 @@ scoped_refptr<PicturePileImpl> PicturePileImpl::Create() { return make_scoped_refptr(new PicturePileImpl); } -scoped_refptr<PicturePileImpl> PicturePileImpl::CreateFromOther( - const PicturePileBase* other) { +scoped_refptr<PicturePileImpl> PicturePileImpl::CreateFromPicturePile( + const PicturePile* other) { return make_scoped_refptr(new PicturePileImpl(other)); } @@ -39,7 +39,7 @@ PicturePileImpl::PicturePileImpl() should_attempt_to_use_distance_field_text_(false) { } -PicturePileImpl::PicturePileImpl(const PicturePileBase* other) +PicturePileImpl::PicturePileImpl(const PicturePile* other) : picture_map_(other->picture_map_), tiling_(other->tiling_), background_color_(other->background_color_), diff --git a/cc/resources/picture_pile_impl.h b/cc/resources/picture_pile_impl.h index 787903d..6986db4 100644 --- a/cc/resources/picture_pile_impl.h +++ b/cc/resources/picture_pile_impl.h @@ -13,7 +13,7 @@ #include "base/time/time.h" #include "cc/base/cc_export.h" #include "cc/debug/rendering_stats_instrumentation.h" -#include "cc/resources/picture_pile_base.h" +#include "cc/resources/picture_pile.h" #include "cc/resources/raster_source.h" #include "skia/ext/analysis_canvas.h" #include "skia/ext/refptr.h" @@ -21,12 +21,11 @@ namespace cc { -// TODO(vmpstr): Clean up PicturePileBase and make it a member. class CC_EXPORT PicturePileImpl : public RasterSource { public: static scoped_refptr<PicturePileImpl> Create(); - static scoped_refptr<PicturePileImpl> CreateFromOther( - const PicturePileBase* other); + static scoped_refptr<PicturePileImpl> CreateFromPicturePile( + const PicturePile* other); // RasterSource overrides. See RasterSource header for full description. // When slow-down-raster-scale-factor is set to a value greater than 1, the @@ -88,14 +87,13 @@ class CC_EXPORT PicturePileImpl : public RasterSource { friend class PicturePile; friend class PixelRefIterator; - // TODO(vmpstr): Change this when pictures are split from invalidation info, - // and when PicturePileBase goes away. - using PictureMapKey = PicturePileBase::PictureMapKey; - using PictureMap = PicturePileBase::PictureMap; - using PictureInfo = PicturePileBase::PictureInfo; + // TODO(vmpstr): Change this when pictures are split from invalidation info. + using PictureMapKey = PicturePile::PictureMapKey; + using PictureMap = PicturePile::PictureMap; + using PictureInfo = PicturePile::PictureInfo; PicturePileImpl(); - explicit PicturePileImpl(const PicturePileBase* other); + explicit PicturePileImpl(const PicturePile* other); ~PicturePileImpl() override; int buffer_pixels() const { return tiling_.border_texels(); } diff --git a/cc/resources/picture_pile_unittest.cc b/cc/resources/picture_pile_unittest.cc index 8ca060b..25e0d12 100644 --- a/cc/resources/picture_pile_unittest.cc +++ b/cc/resources/picture_pile_unittest.cc @@ -7,6 +7,7 @@ #include "cc/resources/picture_pile.h" #include "cc/test/fake_content_layer_client.h" +#include "cc/test/fake_picture_pile.h" #include "testing/gtest/include/gtest/gtest.h" #include "ui/gfx/geometry/rect_conversions.h" #include "ui/gfx/geometry/size_conversions.h" @@ -14,31 +15,6 @@ namespace cc { namespace { -class TestPicturePile : public PicturePile { - public: - ~TestPicturePile() override {} - - using PicturePile::buffer_pixels; - using PicturePile::CanRasterSlowTileCheck; - using PicturePile::Clear; - - PictureMap& picture_map() { return picture_map_; } - const gfx::Rect& recorded_viewport() const { return recorded_viewport_; } - - bool CanRasterLayerRect(gfx::Rect layer_rect) { - layer_rect.Intersect(gfx::Rect(tiling_.tiling_size())); - if (recorded_viewport_.Contains(layer_rect)) - return true; - return CanRasterSlowTileCheck(layer_rect); - } - - bool HasRecordings() const { return has_any_recordings_; } - - typedef PicturePile::PictureInfo PictureInfo; - typedef PicturePile::PictureMapKey PictureMapKey; - typedef PicturePile::PictureMap PictureMap; -}; - class PicturePileTestBase { public: PicturePileTestBase() @@ -82,7 +58,7 @@ class PicturePileTestBase { } FakeContentLayerClient client_; - TestPicturePile pile_; + FakePicturePile pile_; SkColor background_color_; float min_scale_; int frame_number_; @@ -96,7 +72,7 @@ class PicturePileTest : public PicturePileTestBase, public testing::Test { TEST_F(PicturePileTest, InvalidationOnTileBorderOutsideInterestRect) { // Don't expand the interest rect past what we invalidate. - pile_.SetPixelRecordDistanceForTesting(0); + pile_.SetPixelRecordDistance(0); gfx::Size tile_size(100, 100); pile_.tiling().SetMaxTextureSize(tile_size); @@ -179,8 +155,8 @@ TEST_F(PicturePileTest, SmallInvalidateInflated) { EXPECT_EQ(1, pile_.tiling().num_tiles_x()); EXPECT_EQ(1, pile_.tiling().num_tiles_y()); - TestPicturePile::PictureInfo& picture_info = - pile_.picture_map().find(TestPicturePile::PictureMapKey(0, 0))->second; + FakePicturePile::PictureInfo& picture_info = + pile_.picture_map().find(FakePicturePile::PictureMapKey(0, 0))->second; // We should have a picture. EXPECT_TRUE(!!picture_info.GetPicture()); gfx::Rect picture_rect = gfx::ScaleToEnclosedRect( @@ -201,8 +177,8 @@ TEST_F(PicturePileTest, LargeInvalidateInflated) { EXPECT_EQ(1, pile_.tiling().num_tiles_x()); EXPECT_EQ(1, pile_.tiling().num_tiles_y()); - TestPicturePile::PictureInfo& picture_info = - pile_.picture_map().find(TestPicturePile::PictureMapKey(0, 0))->second; + FakePicturePile::PictureInfo& picture_info = + pile_.picture_map().find(FakePicturePile::PictureMapKey(0, 0))->second; EXPECT_TRUE(!!picture_info.GetPicture()); int expected_inflation = pile_.buffer_pixels(); @@ -244,20 +220,20 @@ TEST_F(PicturePileTest, InvalidateOnTileBoundaryInflated) { for (int i = 0; i < pile_.tiling().num_tiles_x(); ++i) { for (int j = 0; j < pile_.tiling().num_tiles_y(); ++j) { - TestPicturePile::PictureInfo& picture_info = + FakePicturePile::PictureInfo& picture_info = pile_.picture_map() - .find(TestPicturePile::PictureMapKey(i, j)) + .find(FakePicturePile::PictureMapKey(i, j)) ->second; // Expect (1, 1) and (1, 0) to be invalidated once more // than the rest of the tiles. if (i == 1 && (j == 0 || j == 1)) { EXPECT_FLOAT_EQ( - 2.0f / TestPicturePile::PictureInfo::INVALIDATION_FRAMES_TRACKED, + 2.0f / FakePicturePile::PictureInfo::INVALIDATION_FRAMES_TRACKED, picture_info.GetInvalidationFrequencyForTesting()); } else { EXPECT_FLOAT_EQ( - 1.0f / TestPicturePile::PictureInfo::INVALIDATION_FRAMES_TRACKED, + 1.0f / FakePicturePile::PictureInfo::INVALIDATION_FRAMES_TRACKED, picture_info.GetInvalidationFrequencyForTesting()); } } @@ -270,7 +246,7 @@ TEST_F(PicturePileTest, InvalidateOnFullLayer) { // Everything was invalidated once so far. for (auto& it : pile_.picture_map()) { EXPECT_FLOAT_EQ( - 1.0f / TestPicturePile::PictureInfo::INVALIDATION_FRAMES_TRACKED, + 1.0f / FakePicturePile::PictureInfo::INVALIDATION_FRAMES_TRACKED, it.second.GetInvalidationFrequencyForTesting()); } @@ -281,7 +257,7 @@ TEST_F(PicturePileTest, InvalidateOnFullLayer) { // Everything was invalidated again. for (auto& it : pile_.picture_map()) { EXPECT_FLOAT_EQ( - 2.0f / TestPicturePile::PictureInfo::INVALIDATION_FRAMES_TRACKED, + 2.0f / FakePicturePile::PictureInfo::INVALIDATION_FRAMES_TRACKED, it.second.GetInvalidationFrequencyForTesting()); } } @@ -301,9 +277,9 @@ TEST_F(PicturePileTest, StopRecordingOffscreenInvalidations) { // Make sure we have a high invalidation frequency. for (int i = 0; i < pile_.tiling().num_tiles_x(); ++i) { for (int j = 0; j < pile_.tiling().num_tiles_y(); ++j) { - TestPicturePile::PictureInfo& picture_info = + FakePicturePile::PictureInfo& picture_info = pile_.picture_map() - .find(TestPicturePile::PictureMapKey(i, j)) + .find(FakePicturePile::PictureMapKey(i, j)) ->second; EXPECT_FLOAT_EQ(1.0f, picture_info.GetInvalidationFrequencyForTesting()) << "i " << i << " j " << j; @@ -317,9 +293,9 @@ TEST_F(PicturePileTest, StopRecordingOffscreenInvalidations) { for (int i = 0; i < pile_.tiling().num_tiles_x(); ++i) { for (int j = 0; j < pile_.tiling().num_tiles_y(); ++j) { - TestPicturePile::PictureInfo& picture_info = + FakePicturePile::PictureInfo& picture_info = pile_.picture_map() - .find(TestPicturePile::PictureMapKey(i, j)) + .find(FakePicturePile::PictureMapKey(i, j)) ->second; EXPECT_FLOAT_EQ(1.0f, picture_info.GetInvalidationFrequencyForTesting()); @@ -352,9 +328,9 @@ TEST_F(PicturePileTest, StopRecordingOffscreenInvalidations) { for (int i = 0; i < pile_.tiling().num_tiles_x(); ++i) { for (int j = 0; j < pile_.tiling().num_tiles_y(); ++j) { - TestPicturePile::PictureInfo& picture_info = + FakePicturePile::PictureInfo& picture_info = pile_.picture_map() - .find(TestPicturePile::PictureMapKey(i, j)) + .find(FakePicturePile::PictureMapKey(i, j)) ->second; // Expect the invalidation frequency to be less than 1, since we just // updated with no invalidations. @@ -419,10 +395,10 @@ TEST_F(PicturePileTest, FrequentInvalidationCanRaster) { // Sanity check some pictures exist and others don't. EXPECT_TRUE(pile_.picture_map() - .find(TestPicturePile::PictureMapKey(0, 1)) + .find(FakePicturePile::PictureMapKey(0, 1)) ->second.GetPicture()); EXPECT_FALSE(pile_.picture_map() - .find(TestPicturePile::PictureMapKey(0, 2)) + .find(FakePicturePile::PictureMapKey(0, 2)) ->second.GetPicture()); EXPECT_TRUE(pile_.CanRasterLayerRect(tile01_noborders)); @@ -601,9 +577,9 @@ TEST_P(PicturePileResizeCornerTest, ResizePileOutsideInterestRect) { EXPECT_EQ(6, pile_.tiling().num_tiles_y()); for (int i = 0; i < pile_.tiling().num_tiles_x(); ++i) { for (int j = 0; j < pile_.tiling().num_tiles_y(); ++j) { - TestPicturePile::PictureMapKey key(i, j); - TestPicturePile::PictureMap& map = pile_.picture_map(); - TestPicturePile::PictureMap::iterator it = map.find(key); + FakePicturePile::PictureMapKey key(i, j); + FakePicturePile::PictureMap& map = pile_.picture_map(); + FakePicturePile::PictureMap::iterator it = map.find(key); EXPECT_TRUE(it != map.end() && it->second.GetPicture()); } } @@ -619,9 +595,9 @@ TEST_P(PicturePileResizeCornerTest, ResizePileOutsideInterestRect) { EXPECT_EQ(8, pile_.tiling().num_tiles_y()); for (int i = 0; i < 6; ++i) { for (int j = 0; j < 6; ++j) { - TestPicturePile::PictureMapKey key(i, j); - TestPicturePile::PictureMap& map = pile_.picture_map(); - TestPicturePile::PictureMap::iterator it = map.find(key); + FakePicturePile::PictureMapKey key(i, j); + FakePicturePile::PictureMap& map = pile_.picture_map(); + FakePicturePile::PictureMap::iterator it = map.find(key); EXPECT_EQ(j < 5, it != map.end() && it->second.GetPicture()); } } @@ -649,9 +625,9 @@ TEST_P(PicturePileResizeCornerTest, ResizePileOutsideInterestRect) { EXPECT_EQ(6, pile_.tiling().num_tiles_y()); for (int i = 0; i < pile_.tiling().num_tiles_x(); ++i) { for (int j = 0; j < pile_.tiling().num_tiles_y(); ++j) { - TestPicturePile::PictureMapKey key(i, j); - TestPicturePile::PictureMap& map = pile_.picture_map(); - TestPicturePile::PictureMap::iterator it = map.find(key); + FakePicturePile::PictureMapKey key(i, j); + FakePicturePile::PictureMap& map = pile_.picture_map(); + FakePicturePile::PictureMap::iterator it = map.find(key); bool expect_tile; switch (corner) { case TOP_LEFT: @@ -711,9 +687,9 @@ TEST_P(PicturePileResizeCornerTest, ResizePileOutsideInterestRect) { EXPECT_EQ(6, pile_.tiling().num_tiles_y()); for (int i = 0; i < 6; ++i) { for (int j = 0; j < 6; ++j) { - TestPicturePile::PictureMapKey key(i, j); - TestPicturePile::PictureMap& map = pile_.picture_map(); - TestPicturePile::PictureMap::iterator it = map.find(key); + FakePicturePile::PictureMapKey key(i, j); + FakePicturePile::PictureMap& map = pile_.picture_map(); + FakePicturePile::PictureMap::iterator it = map.find(key); EXPECT_EQ(i < 5, it != map.end() && it->second.GetPicture()); } } @@ -741,9 +717,9 @@ TEST_P(PicturePileResizeCornerTest, ResizePileOutsideInterestRect) { EXPECT_EQ(6, pile_.tiling().num_tiles_y()); for (int i = 0; i < pile_.tiling().num_tiles_x(); ++i) { for (int j = 0; j < pile_.tiling().num_tiles_y(); ++j) { - TestPicturePile::PictureMapKey key(i, j); - TestPicturePile::PictureMap& map = pile_.picture_map(); - TestPicturePile::PictureMap::iterator it = map.find(key); + FakePicturePile::PictureMapKey key(i, j); + FakePicturePile::PictureMap& map = pile_.picture_map(); + FakePicturePile::PictureMap::iterator it = map.find(key); bool expect_tile; switch (corner) { case TOP_LEFT: @@ -800,9 +776,9 @@ TEST_P(PicturePileResizeCornerTest, ResizePileOutsideInterestRect) { EXPECT_EQ(8, pile_.tiling().num_tiles_y()); for (int i = 0; i < 6; ++i) { for (int j = 0; j < 6; ++j) { - TestPicturePile::PictureMapKey key(i, j); - TestPicturePile::PictureMap& map = pile_.picture_map(); - TestPicturePile::PictureMap::iterator it = map.find(key); + FakePicturePile::PictureMapKey key(i, j); + FakePicturePile::PictureMap& map = pile_.picture_map(); + FakePicturePile::PictureMap::iterator it = map.find(key); EXPECT_EQ(i < 5 && j < 5, it != map.end() && it->second.GetPicture()); } } @@ -832,9 +808,9 @@ TEST_P(PicturePileResizeCornerTest, ResizePileOutsideInterestRect) { EXPECT_EQ(6, pile_.tiling().num_tiles_y()); for (int i = 0; i < pile_.tiling().num_tiles_x(); ++i) { for (int j = 0; j < pile_.tiling().num_tiles_y(); ++j) { - TestPicturePile::PictureMapKey key(i, j); - TestPicturePile::PictureMap& map = pile_.picture_map(); - TestPicturePile::PictureMap::iterator it = map.find(key); + FakePicturePile::PictureMapKey key(i, j); + FakePicturePile::PictureMap& map = pile_.picture_map(); + FakePicturePile::PictureMap::iterator it = map.find(key); bool expect_tile; switch (corner) { case TOP_LEFT: @@ -915,9 +891,9 @@ TEST_P(PicturePileResizeCornerTest, SmallResizePileOutsideInterestRect) { EXPECT_EQ(6, pile_.tiling().num_tiles_y()); for (int i = 0; i < pile_.tiling().num_tiles_x(); ++i) { for (int j = 0; j < pile_.tiling().num_tiles_y(); ++j) { - TestPicturePile::PictureMapKey key(i, j); - TestPicturePile::PictureMap& map = pile_.picture_map(); - TestPicturePile::PictureMap::iterator it = map.find(key); + FakePicturePile::PictureMapKey key(i, j); + FakePicturePile::PictureMap& map = pile_.picture_map(); + FakePicturePile::PictureMap::iterator it = map.find(key); EXPECT_TRUE(it != map.end() && it->second.GetPicture()); } } @@ -941,9 +917,9 @@ TEST_P(PicturePileResizeCornerTest, SmallResizePileOutsideInterestRect) { EXPECT_EQ(6, pile_.tiling().num_tiles_y()); for (int i = 0; i < pile_.tiling().num_tiles_x(); ++i) { for (int j = 0; j < pile_.tiling().num_tiles_y(); ++j) { - TestPicturePile::PictureMapKey key(i, j); - TestPicturePile::PictureMap& map = pile_.picture_map(); - TestPicturePile::PictureMap::iterator it = map.find(key); + FakePicturePile::PictureMapKey key(i, j); + FakePicturePile::PictureMap& map = pile_.picture_map(); + FakePicturePile::PictureMap::iterator it = map.find(key); bool expect_tile; switch (corner) { case TOP_LEFT: @@ -1007,9 +983,9 @@ TEST_P(PicturePileResizeCornerTest, SmallResizePileOutsideInterestRect) { EXPECT_EQ(6, pile_.tiling().num_tiles_y()); for (int i = 0; i < pile_.tiling().num_tiles_x(); ++i) { for (int j = 0; j < pile_.tiling().num_tiles_y(); ++j) { - TestPicturePile::PictureMapKey key(i, j); - TestPicturePile::PictureMap& map = pile_.picture_map(); - TestPicturePile::PictureMap::iterator it = map.find(key); + FakePicturePile::PictureMapKey key(i, j); + FakePicturePile::PictureMap& map = pile_.picture_map(); + FakePicturePile::PictureMap::iterator it = map.find(key); bool expect_tile; switch (corner) { case TOP_LEFT: @@ -1073,9 +1049,9 @@ TEST_P(PicturePileResizeCornerTest, SmallResizePileOutsideInterestRect) { EXPECT_EQ(6, pile_.tiling().num_tiles_y()); for (int i = 0; i < pile_.tiling().num_tiles_x(); ++i) { for (int j = 0; j < pile_.tiling().num_tiles_y(); ++j) { - TestPicturePile::PictureMapKey key(i, j); - TestPicturePile::PictureMap& map = pile_.picture_map(); - TestPicturePile::PictureMap::iterator it = map.find(key); + FakePicturePile::PictureMapKey key(i, j); + FakePicturePile::PictureMap& map = pile_.picture_map(); + FakePicturePile::PictureMap::iterator it = map.find(key); bool expect_tile; switch (corner) { case TOP_LEFT: @@ -1172,9 +1148,9 @@ TEST_F(PicturePileTest, ResizePileInsideInterestRect) { EXPECT_EQ(6, pile_.tiling().num_tiles_y()); for (int i = 0; i < pile_.tiling().num_tiles_x(); ++i) { for (int j = 0; j < pile_.tiling().num_tiles_y(); ++j) { - TestPicturePile::PictureMapKey key(i, j); - TestPicturePile::PictureMap& map = pile_.picture_map(); - TestPicturePile::PictureMap::iterator it = map.find(key); + FakePicturePile::PictureMapKey key(i, j); + FakePicturePile::PictureMap& map = pile_.picture_map(); + FakePicturePile::PictureMap::iterator it = map.find(key); EXPECT_TRUE(it != map.end() && it->second.GetPicture()); } } @@ -1187,9 +1163,9 @@ TEST_F(PicturePileTest, ResizePileInsideInterestRect) { EXPECT_EQ(8, pile_.tiling().num_tiles_y()); for (int i = 0; i < pile_.tiling().num_tiles_x(); ++i) { for (int j = 0; j < pile_.tiling().num_tiles_y(); ++j) { - TestPicturePile::PictureMapKey key(i, j); - TestPicturePile::PictureMap& map = pile_.picture_map(); - TestPicturePile::PictureMap::iterator it = map.find(key); + FakePicturePile::PictureMapKey key(i, j); + FakePicturePile::PictureMap& map = pile_.picture_map(); + FakePicturePile::PictureMap::iterator it = map.find(key); EXPECT_TRUE(it != map.end() && it->second.GetPicture()); } } @@ -1213,9 +1189,9 @@ TEST_F(PicturePileTest, ResizePileInsideInterestRect) { EXPECT_EQ(6, pile_.tiling().num_tiles_y()); for (int i = 0; i < pile_.tiling().num_tiles_x(); ++i) { for (int j = 0; j < pile_.tiling().num_tiles_y(); ++j) { - TestPicturePile::PictureMapKey key(i, j); - TestPicturePile::PictureMap& map = pile_.picture_map(); - TestPicturePile::PictureMap::iterator it = map.find(key); + FakePicturePile::PictureMapKey key(i, j); + FakePicturePile::PictureMap& map = pile_.picture_map(); + FakePicturePile::PictureMap::iterator it = map.find(key); EXPECT_TRUE(it != map.end() && it->second.GetPicture()); } } @@ -1236,9 +1212,9 @@ TEST_F(PicturePileTest, ResizePileInsideInterestRect) { EXPECT_EQ(6, pile_.tiling().num_tiles_y()); for (int i = 0; i < pile_.tiling().num_tiles_x(); ++i) { for (int j = 0; j < pile_.tiling().num_tiles_y(); ++j) { - TestPicturePile::PictureMapKey key(i, j); - TestPicturePile::PictureMap& map = pile_.picture_map(); - TestPicturePile::PictureMap::iterator it = map.find(key); + FakePicturePile::PictureMapKey key(i, j); + FakePicturePile::PictureMap& map = pile_.picture_map(); + FakePicturePile::PictureMap::iterator it = map.find(key); EXPECT_TRUE(it != map.end() && it->second.GetPicture()); } } @@ -1262,9 +1238,9 @@ TEST_F(PicturePileTest, ResizePileInsideInterestRect) { EXPECT_EQ(6, pile_.tiling().num_tiles_y()); for (int i = 0; i < pile_.tiling().num_tiles_x(); ++i) { for (int j = 0; j < pile_.tiling().num_tiles_y(); ++j) { - TestPicturePile::PictureMapKey key(i, j); - TestPicturePile::PictureMap& map = pile_.picture_map(); - TestPicturePile::PictureMap::iterator it = map.find(key); + FakePicturePile::PictureMapKey key(i, j); + FakePicturePile::PictureMap& map = pile_.picture_map(); + FakePicturePile::PictureMap::iterator it = map.find(key); EXPECT_TRUE(it != map.end() && it->second.GetPicture()); } } @@ -1285,9 +1261,9 @@ TEST_F(PicturePileTest, ResizePileInsideInterestRect) { EXPECT_EQ(8, pile_.tiling().num_tiles_y()); for (int i = 0; i < pile_.tiling().num_tiles_x(); ++i) { for (int j = 0; j < pile_.tiling().num_tiles_y(); ++j) { - TestPicturePile::PictureMapKey key(i, j); - TestPicturePile::PictureMap& map = pile_.picture_map(); - TestPicturePile::PictureMap::iterator it = map.find(key); + FakePicturePile::PictureMapKey key(i, j); + FakePicturePile::PictureMap& map = pile_.picture_map(); + FakePicturePile::PictureMap::iterator it = map.find(key); EXPECT_TRUE(it != map.end() && it->second.GetPicture()); } } @@ -1315,9 +1291,9 @@ TEST_F(PicturePileTest, ResizePileInsideInterestRect) { EXPECT_EQ(6, pile_.tiling().num_tiles_y()); for (int i = 0; i < pile_.tiling().num_tiles_x(); ++i) { for (int j = 0; j < pile_.tiling().num_tiles_y(); ++j) { - TestPicturePile::PictureMapKey key(i, j); - TestPicturePile::PictureMap& map = pile_.picture_map(); - TestPicturePile::PictureMap::iterator it = map.find(key); + FakePicturePile::PictureMapKey key(i, j); + FakePicturePile::PictureMap& map = pile_.picture_map(); + FakePicturePile::PictureMap::iterator it = map.find(key); EXPECT_TRUE(it != map.end() && it->second.GetPicture()); } } @@ -1353,9 +1329,9 @@ TEST_F(PicturePileTest, SmallResizePileInsideInterestRect) { EXPECT_EQ(6, pile_.tiling().num_tiles_y()); for (int i = 0; i < pile_.tiling().num_tiles_x(); ++i) { for (int j = 0; j < pile_.tiling().num_tiles_y(); ++j) { - TestPicturePile::PictureMapKey key(i, j); - TestPicturePile::PictureMap& map = pile_.picture_map(); - TestPicturePile::PictureMap::iterator it = map.find(key); + FakePicturePile::PictureMapKey key(i, j); + FakePicturePile::PictureMap& map = pile_.picture_map(); + FakePicturePile::PictureMap::iterator it = map.find(key); EXPECT_TRUE(it != map.end() && it->second.GetPicture()); } } @@ -1368,9 +1344,9 @@ TEST_F(PicturePileTest, SmallResizePileInsideInterestRect) { EXPECT_EQ(6, pile_.tiling().num_tiles_y()); for (int i = 0; i < pile_.tiling().num_tiles_x(); ++i) { for (int j = 0; j < pile_.tiling().num_tiles_y(); ++j) { - TestPicturePile::PictureMapKey key(i, j); - TestPicturePile::PictureMap& map = pile_.picture_map(); - TestPicturePile::PictureMap::iterator it = map.find(key); + FakePicturePile::PictureMapKey key(i, j); + FakePicturePile::PictureMap& map = pile_.picture_map(); + FakePicturePile::PictureMap::iterator it = map.find(key); EXPECT_TRUE(it != map.end() && it->second.GetPicture()); } } @@ -1389,9 +1365,9 @@ TEST_F(PicturePileTest, SmallResizePileInsideInterestRect) { EXPECT_EQ(6, pile_.tiling().num_tiles_y()); for (int i = 0; i < pile_.tiling().num_tiles_x(); ++i) { for (int j = 0; j < pile_.tiling().num_tiles_y(); ++j) { - TestPicturePile::PictureMapKey key(i, j); - TestPicturePile::PictureMap& map = pile_.picture_map(); - TestPicturePile::PictureMap::iterator it = map.find(key); + FakePicturePile::PictureMapKey key(i, j); + FakePicturePile::PictureMap& map = pile_.picture_map(); + FakePicturePile::PictureMap::iterator it = map.find(key); EXPECT_TRUE(it != map.end() && it->second.GetPicture()); } } @@ -1411,9 +1387,9 @@ TEST_F(PicturePileTest, SmallResizePileInsideInterestRect) { EXPECT_EQ(6, pile_.tiling().num_tiles_y()); for (int i = 0; i < pile_.tiling().num_tiles_x(); ++i) { for (int j = 0; j < pile_.tiling().num_tiles_y(); ++j) { - TestPicturePile::PictureMapKey key(i, j); - TestPicturePile::PictureMap& map = pile_.picture_map(); - TestPicturePile::PictureMap::iterator it = map.find(key); + FakePicturePile::PictureMapKey key(i, j); + FakePicturePile::PictureMap& map = pile_.picture_map(); + FakePicturePile::PictureMap::iterator it = map.find(key); EXPECT_TRUE(it != map.end() && it->second.GetPicture()); } } @@ -1432,9 +1408,9 @@ TEST_F(PicturePileTest, SmallResizePileInsideInterestRect) { EXPECT_EQ(6, pile_.tiling().num_tiles_y()); for (int i = 0; i < pile_.tiling().num_tiles_x(); ++i) { for (int j = 0; j < pile_.tiling().num_tiles_y(); ++j) { - TestPicturePile::PictureMapKey key(i, j); - TestPicturePile::PictureMap& map = pile_.picture_map(); - TestPicturePile::PictureMap::iterator it = map.find(key); + FakePicturePile::PictureMapKey key(i, j); + FakePicturePile::PictureMap& map = pile_.picture_map(); + FakePicturePile::PictureMap::iterator it = map.find(key); EXPECT_TRUE(it != map.end() && it->second.GetPicture()); } } @@ -1454,9 +1430,9 @@ TEST_F(PicturePileTest, SmallResizePileInsideInterestRect) { EXPECT_EQ(6, pile_.tiling().num_tiles_y()); for (int i = 0; i < pile_.tiling().num_tiles_x(); ++i) { for (int j = 0; j < pile_.tiling().num_tiles_y(); ++j) { - TestPicturePile::PictureMapKey key(i, j); - TestPicturePile::PictureMap& map = pile_.picture_map(); - TestPicturePile::PictureMap::iterator it = map.find(key); + FakePicturePile::PictureMapKey key(i, j); + FakePicturePile::PictureMap& map = pile_.picture_map(); + FakePicturePile::PictureMap::iterator it = map.find(key); EXPECT_TRUE(it != map.end() && it->second.GetPicture()); } } @@ -1475,9 +1451,9 @@ TEST_F(PicturePileTest, SmallResizePileInsideInterestRect) { EXPECT_EQ(6, pile_.tiling().num_tiles_y()); for (int i = 0; i < pile_.tiling().num_tiles_x(); ++i) { for (int j = 0; j < pile_.tiling().num_tiles_y(); ++j) { - TestPicturePile::PictureMapKey key(i, j); - TestPicturePile::PictureMap& map = pile_.picture_map(); - TestPicturePile::PictureMap::iterator it = map.find(key); + FakePicturePile::PictureMapKey key(i, j); + FakePicturePile::PictureMap& map = pile_.picture_map(); + FakePicturePile::PictureMap::iterator it = map.find(key); EXPECT_TRUE(it != map.end() && it->second.GetPicture()); } } diff --git a/cc/resources/recording_source.h b/cc/resources/recording_source.h index 3b3f2de..cbbeb70 100644 --- a/cc/resources/recording_source.h +++ b/cc/resources/recording_source.h @@ -14,9 +14,7 @@ namespace cc { class ContentLayerClient; -class PicturePileImpl; class Region; -class RenderingStatsInstrumentation; class RasterSource; class CC_EXPORT RecordingSource { @@ -43,7 +41,6 @@ class CC_EXPORT RecordingSource { virtual void SetMinContentsScale(float min_contents_scale) = 0; virtual void SetTileGridSize(const gfx::Size& tile_grid_size) = 0; virtual void SetSlowdownRasterScaleFactor(int factor) = 0; - virtual void SetShowDebugPictureBorders(bool show) = 0; virtual void SetIsMask(bool is_mask) = 0; virtual bool IsSuitableForGpuRasterization() const = 0; diff --git a/cc/test/fake_picture_pile.h b/cc/test/fake_picture_pile.h new file mode 100644 index 0000000..e486e3b --- /dev/null +++ b/cc/test/fake_picture_pile.h @@ -0,0 +1,53 @@ +// Copyright 2014 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CC_TEST_FAKE_PICTURE_PILE_H_ +#define CC_TEST_FAKE_PICTURE_PILE_H_ + +#include "cc/resources/picture_pile.h" + +namespace cc { + +class FakePicturePile : public PicturePile { + public: + ~FakePicturePile() override {} + + using PicturePile::buffer_pixels; + using PicturePile::CanRasterSlowTileCheck; + using PicturePile::Clear; + + PictureMap& picture_map() { return picture_map_; } + const gfx::Rect& recorded_viewport() const { return recorded_viewport_; } + + bool CanRasterLayerRect(gfx::Rect layer_rect) { + layer_rect.Intersect(gfx::Rect(tiling_.tiling_size())); + if (recorded_viewport_.Contains(layer_rect)) + return true; + return CanRasterSlowTileCheck(layer_rect); + } + + bool HasRecordings() const { return has_any_recordings_; } + + void SetRecordedViewport(const gfx::Rect& viewport) { + recorded_viewport_ = viewport; + } + + void SetHasAnyRecordings(bool has_recordings) { + has_any_recordings_ = has_recordings; + } + + TilingData& tiling() { return tiling_; } + + bool is_solid_color() const { return is_solid_color_; } + SkColor solid_color() const { return solid_color_; } + + void SetPixelRecordDistance(int d) { pixel_record_distance_ = d; } + + typedef PicturePile::PictureInfo PictureInfo; + typedef PicturePile::PictureMapKey PictureMapKey; + typedef PicturePile::PictureMap PictureMap; +}; +} // namespace cc + +#endif // CC_TEST_FAKE_PICTURE_PILE_H_ diff --git a/cc/test/fake_picture_pile_impl.cc b/cc/test/fake_picture_pile_impl.cc index e688d22..3d31c12 100644 --- a/cc/test/fake_picture_pile_impl.cc +++ b/cc/test/fake_picture_pile_impl.cc @@ -9,6 +9,7 @@ #include <utility> #include "cc/resources/picture_pile.h" +#include "cc/test/fake_picture_pile.h" #include "cc/test/impl_side_painting_settings.h" #include "testing/gtest/include/gtest/gtest.h" @@ -16,7 +17,7 @@ namespace cc { FakePicturePileImpl::FakePicturePileImpl() {} -FakePicturePileImpl::FakePicturePileImpl(const PicturePileBase* other) +FakePicturePileImpl::FakePicturePileImpl(const PicturePile* other) : PicturePileImpl(other), tile_grid_info_(other->GetTileGridInfoForTesting()) { } @@ -26,12 +27,12 @@ FakePicturePileImpl::~FakePicturePileImpl() {} scoped_refptr<FakePicturePileImpl> FakePicturePileImpl::CreateFilledPile( const gfx::Size& tile_size, const gfx::Size& layer_bounds) { - PicturePile pile; + FakePicturePile pile; pile.tiling().SetTilingSize(layer_bounds); pile.tiling().SetMaxTextureSize(tile_size); pile.SetTileGridSize(ImplSidePaintingSettings().default_tile_grid_size); - pile.SetRecordedViewportForTesting(gfx::Rect(layer_bounds)); - pile.SetHasAnyRecordingsForTesting(true); + pile.SetRecordedViewport(gfx::Rect(layer_bounds)); + pile.SetHasAnyRecordings(true); auto pile_impl = make_scoped_refptr(new FakePicturePileImpl(&pile)); for (int x = 0; x < pile_impl->tiling().num_tiles_x(); ++x) { @@ -44,12 +45,12 @@ scoped_refptr<FakePicturePileImpl> FakePicturePileImpl::CreateFilledPile( scoped_refptr<FakePicturePileImpl> FakePicturePileImpl::CreateEmptyPile( const gfx::Size& tile_size, const gfx::Size& layer_bounds) { - PicturePile pile; + FakePicturePile pile; pile.tiling().SetTilingSize(layer_bounds); pile.tiling().SetMaxTextureSize(tile_size); pile.SetTileGridSize(ImplSidePaintingSettings().default_tile_grid_size); - pile.SetRecordedViewportForTesting(gfx::Rect()); - pile.SetHasAnyRecordingsForTesting(false); + pile.SetRecordedViewport(gfx::Rect()); + pile.SetHasAnyRecordings(false); return make_scoped_refptr(new FakePicturePileImpl(&pile)); } @@ -57,26 +58,26 @@ scoped_refptr<FakePicturePileImpl> FakePicturePileImpl::CreateEmptyPileThatThinksItHasRecordings( const gfx::Size& tile_size, const gfx::Size& layer_bounds) { - PicturePile pile; + FakePicturePile pile; pile.tiling().SetTilingSize(layer_bounds); pile.tiling().SetMaxTextureSize(tile_size); pile.SetTileGridSize(ImplSidePaintingSettings().default_tile_grid_size); // This simulates a false positive for this flag. - pile.SetRecordedViewportForTesting(gfx::Rect()); - pile.SetHasAnyRecordingsForTesting(true); + pile.SetRecordedViewport(gfx::Rect()); + pile.SetHasAnyRecordings(true); return make_scoped_refptr(new FakePicturePileImpl(&pile)); } scoped_refptr<FakePicturePileImpl> FakePicturePileImpl::CreateInfiniteFilledPile() { - PicturePile pile; + FakePicturePile pile; gfx::Size size(std::numeric_limits<int>::max(), std::numeric_limits<int>::max()); pile.tiling().SetTilingSize(size); pile.tiling().SetMaxTextureSize(size); pile.SetTileGridSize(size); - pile.SetRecordedViewportForTesting(gfx::Rect(size)); - pile.SetHasAnyRecordingsForTesting(true); + pile.SetRecordedViewport(gfx::Rect(size)); + pile.SetHasAnyRecordings(true); auto pile_impl = make_scoped_refptr(new FakePicturePileImpl(&pile)); pile_impl->AddRecordingAt(0, 0); diff --git a/cc/test/fake_picture_pile_impl.h b/cc/test/fake_picture_pile_impl.h index ab27238..f1a9d31 100644 --- a/cc/test/fake_picture_pile_impl.h +++ b/cc/test/fake_picture_pile_impl.h @@ -84,7 +84,7 @@ class FakePicturePileImpl : public PicturePileImpl { protected: FakePicturePileImpl(); - explicit FakePicturePileImpl(const PicturePileBase* other); + explicit FakePicturePileImpl(const PicturePile* other); ~FakePicturePileImpl() override; FakeContentLayerClient client_; diff --git a/ui/compositor/layer.cc b/ui/compositor/layer.cc index 5f8800d..e95e32d 100644 --- a/ui/compositor/layer.cc +++ b/ui/compositor/layer.cc @@ -9,6 +9,7 @@ #include "base/command_line.h" #include "base/debug/trace_event.h" #include "base/json/json_writer.h" +#include "base/lazy_instance.h" #include "base/logging.h" #include "base/memory/scoped_ptr.h" #include "cc/base/scoped_ptr_algorithm.h" |