diff options
author | enne@chromium.org <enne@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-11-13 23:59:14 +0000 |
---|---|---|
committer | enne@chromium.org <enne@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-11-13 23:59:14 +0000 |
commit | 046a230ecb3236086aba08f2d558ea87c28c0ac3 (patch) | |
tree | 7b2ae562c20726ea0fd96405e3c9b3d19c12bcd8 /cc/resources | |
parent | f7394b04b54261f8a53e652f6f89f7a9c79e782f (diff) | |
download | chromium_src-046a230ecb3236086aba08f2d558ea87c28c0ac3.zip chromium_src-046a230ecb3236086aba08f2d558ea87c28c0ac3.tar.gz chromium_src-046a230ecb3236086aba08f2d558ea87c28c0ac3.tar.bz2 |
Revert 234641 "cc: Combine analysis and raster"
This breaks rasterization. Reverting to investigate.
> cc: Combine analysis and raster
>
> This changes the analysis of PicturePiles from optimistic (hoping to
> save raster work by checking if a rastered bitmap would be a solid
> color) to pessimistic (assuming most bitmaps are not solid colors and
> just checking afterwards). It does this by rastering to both an
> AnalysisCanvas and a normal SkCanvas via SkNWayCanvas and then
> checking the results afterwards.
>
> R=reveman@chromium.org, senorblanco@chromium.org
> BUG=310796
>
> Review URL: https://codereview.chromium.org/63443003
TBR=enne@chromium.org, senorblanco@chromium.org
BUG=318782
Review URL: https://codereview.chromium.org/62103012
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@234962 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'cc/resources')
-rw-r--r-- | cc/resources/picture.cc | 3 | ||||
-rw-r--r-- | cc/resources/picture.h | 1 | ||||
-rw-r--r-- | cc/resources/picture_pile_impl.cc | 49 | ||||
-rw-r--r-- | cc/resources/picture_pile_impl.h | 16 | ||||
-rw-r--r-- | cc/resources/raster_worker_pool.cc | 79 |
5 files changed, 98 insertions, 50 deletions
diff --git a/cc/resources/picture.cc b/cc/resources/picture.cc index 1b4c43c..7e278f8 100644 --- a/cc/resources/picture.cc +++ b/cc/resources/picture.cc @@ -296,6 +296,7 @@ void Picture::GatherPixelRefs( int Picture::Raster( SkCanvas* canvas, + SkDrawPictureCallback* callback, const Region& negated_content_region, float contents_scale) { TRACE_EVENT_BEGIN1( @@ -313,7 +314,7 @@ int Picture::Raster( canvas->scale(contents_scale, contents_scale); canvas->translate(layer_rect_.x(), layer_rect_.y()); - picture_->draw(canvas); + picture_->draw(canvas, callback); SkIRect bounds; canvas->getClipDeviceBounds(&bounds); canvas->restore(); diff --git a/cc/resources/picture.h b/cc/resources/picture.h index b2e5b29..4eb238a 100644 --- a/cc/resources/picture.h +++ b/cc/resources/picture.h @@ -71,6 +71,7 @@ class CC_EXPORT Picture // Apply this scale and raster the negated region into the canvas. See comment // in PicturePileImpl::RasterCommon for explanation on negated content region. int Raster(SkCanvas* canvas, + SkDrawPictureCallback* callback, const Region& negated_content_region, float contents_scale); diff --git a/cc/resources/picture_pile_impl.cc b/cc/resources/picture_pile_impl.cc index c540f6c..44a52b8 100644 --- a/cc/resources/picture_pile_impl.cc +++ b/cc/resources/picture_pile_impl.cc @@ -74,11 +74,19 @@ void PicturePileImpl::RasterDirect( float contents_scale, RenderingStatsInstrumentation* rendering_stats_instrumentation) { RasterCommon(canvas, + NULL, canvas_rect, contents_scale, rendering_stats_instrumentation); } +void PicturePileImpl::RasterForAnalysis( + skia::AnalysisCanvas* canvas, + gfx::Rect canvas_rect, + float contents_scale) { + RasterCommon(canvas, canvas, canvas_rect, contents_scale, NULL); +} + void PicturePileImpl::RasterToBitmap( SkCanvas* canvas, gfx::Rect canvas_rect, @@ -127,6 +135,7 @@ void PicturePileImpl::RasterToBitmap( } RasterCommon(canvas, + NULL, canvas_rect, contents_scale, rendering_stats_instrumentation); @@ -192,6 +201,7 @@ void PicturePileImpl::CoalesceRasters(gfx::Rect canvas_rect, void PicturePileImpl::RasterCommon( SkCanvas* canvas, + SkDrawPictureCallback* callback, gfx::Rect canvas_rect, float contents_scale, RenderingStatsInstrumentation* rendering_stats_instrumentation) { @@ -240,7 +250,7 @@ void PicturePileImpl::RasterCommon( start_time = rendering_stats_instrumentation->StartRecording(); rasterized_pixel_count = picture->Raster( - canvas, negated_clip_region, contents_scale); + canvas, callback, negated_clip_region, contents_scale); if (rendering_stats_instrumentation) { base::TimeDelta duration = @@ -287,6 +297,30 @@ skia::RefPtr<SkPicture> PicturePileImpl::GetFlattenedPicture() { return picture; } +void PicturePileImpl::AnalyzeInRect(gfx::Rect content_rect, + float contents_scale, + PicturePileImpl::Analysis* analysis) { + DCHECK(analysis); + TRACE_EVENT0("cc", "PicturePileImpl::AnalyzeInRect"); + + gfx::Rect layer_rect = gfx::ScaleToEnclosingRect( + content_rect, 1.0f / contents_scale); + + layer_rect.Intersect(gfx::Rect(tiling_.total_size())); + + SkBitmap empty_bitmap; + empty_bitmap.setConfig(SkBitmap::kNo_Config, + layer_rect.width(), + layer_rect.height()); + skia::AnalysisDevice device(empty_bitmap); + skia::AnalysisCanvas canvas(&device); + + RasterForAnalysis(&canvas, layer_rect, 1.0f); + + analysis->is_solid_color = canvas.GetColorIfSolid(&analysis->solid_color); + analysis->has_text = canvas.HasText(); +} + PicturePileImpl::Analysis::Analysis() : is_solid_color(false), has_text(false) { @@ -342,19 +376,6 @@ void PicturePileImpl::PixelRefIterator::AdvanceToTilePictureWithPixelRefs() { } } -gfx::Rect PicturePileImpl::AnalysisRectForRaster(gfx::Rect content_rect, - float contents_scale) const { - // Bound the analysis rect to just the pile content. - gfx::Rect content_bounds( - gfx::ScaleToEnclosingRect(gfx::Rect(size()), contents_scale)); - gfx::Rect analysis_rect(content_rect); - analysis_rect.Intersect(content_bounds); - // Move to canvas space. - analysis_rect.set_origin(gfx::Point()); - - return analysis_rect; -} - void PicturePileImpl::DidBeginTracing() { gfx::Rect layer_rect(tiling_.total_size()); std::set<void*> processed_pictures; diff --git a/cc/resources/picture_pile_impl.h b/cc/resources/picture_pile_impl.h index b99e996..66b5f72 100644 --- a/cc/resources/picture_pile_impl.h +++ b/cc/resources/picture_pile_impl.h @@ -52,6 +52,14 @@ class CC_EXPORT PicturePileImpl : public PicturePileBase { float contents_scale, RenderingStatsInstrumentation* stats_instrumentation); + // Called when analyzing a tile. We can use AnalysisCanvas as + // SkDrawPictureCallback, which allows us to early out from analysis. + void RasterForAnalysis( + skia::AnalysisCanvas* canvas, + gfx::Rect canvas_rect, + float contents_scale); + + skia::RefPtr<SkPicture> GetFlattenedPicture(); struct CC_EXPORT Analysis { @@ -63,6 +71,10 @@ class CC_EXPORT PicturePileImpl : public PicturePileBase { SkColor solid_color; }; + void AnalyzeInRect(gfx::Rect content_rect, + float contents_scale, + Analysis* analysis); + class CC_EXPORT PixelRefIterator { public: PixelRefIterator(gfx::Rect content_rect, @@ -85,9 +97,6 @@ class CC_EXPORT PicturePileImpl : public PicturePileBase { std::set<const void*> processed_pictures_; }; - gfx::Rect AnalysisRectForRaster(gfx::Rect content_rect, - float contents_scale) const; - void DidBeginTracing(); protected: @@ -122,6 +131,7 @@ class CC_EXPORT PicturePileImpl : public PicturePileBase { void RasterCommon( SkCanvas* canvas, + SkDrawPictureCallback* callback, gfx::Rect canvas_rect, float contents_scale, RenderingStatsInstrumentation* rendering_stats_instrumentation); diff --git a/cc/resources/raster_worker_pool.cc b/cc/resources/raster_worker_pool.cc index 671271c..67c548f 100644 --- a/cc/resources/raster_worker_pool.cc +++ b/cc/resources/raster_worker_pool.cc @@ -13,8 +13,6 @@ #include "skia/ext/lazy_pixel_ref.h" #include "skia/ext/paint_simplifier.h" #include "third_party/skia/include/core/SkBitmap.h" -#include "third_party/skia/include/utils/SkNWayCanvas.h" -#include "ui/gfx/skia_util.h" namespace cc { @@ -33,6 +31,10 @@ class IdentityAllocator : public SkBitmap::Allocator { void* buffer_; }; +// Flag to indicate whether we should try and detect that +// a tile is of solid color. +const bool kUseColorEstimator = true; + class DisableLCDTextFilter : public SkDrawFilter { public: // SkDrawFilter interface. @@ -71,11 +73,34 @@ class RasterWorkerPoolTaskImpl : public internal::RasterWorkerPoolTask { rendering_stats_(rendering_stats), reply_(reply) {} - // Overridden from internal::RasterWorkerPoolTask: - virtual bool RunOnWorkerThread(unsigned thread_index, - void* buffer, - gfx::Size size, - int stride) OVERRIDE { + void RunAnalysisOnThread(unsigned thread_index) { + TRACE_EVENT1("cc", + "RasterWorkerPoolTaskImpl::RunAnalysisOnThread", + "data", + TracedValue::FromValue(DataAsValue().release())); + + DCHECK(picture_pile_.get()); + DCHECK(rendering_stats_); + + PicturePileImpl* picture_clone = + picture_pile_->GetCloneForDrawingOnThread(thread_index); + + DCHECK(picture_clone); + + picture_clone->AnalyzeInRect(content_rect_, contents_scale_, &analysis_); + + // Record the solid color prediction. + UMA_HISTOGRAM_BOOLEAN("Renderer4.SolidColorTilesAnalyzed", + analysis_.is_solid_color); + + // Clear the flag if we're not using the estimator. + analysis_.is_solid_color &= kUseColorEstimator; + } + + bool RunRasterOnThread(unsigned thread_index, + void* buffer, + gfx::Size size, + int stride) { TRACE_EVENT2( "cc", "RasterWorkerPoolTaskImpl::RunRasterOnThread", "data", @@ -89,6 +114,9 @@ class RasterWorkerPoolTaskImpl : public internal::RasterWorkerPoolTask { DCHECK(picture_pile_.get()); DCHECK(buffer); + if (analysis_.is_solid_color) + return false; + PicturePileImpl* picture_clone = picture_pile_->GetCloneForDrawingOnThread(thread_index); @@ -117,22 +145,8 @@ class RasterWorkerPoolTaskImpl : public internal::RasterWorkerPoolTask { break; } - SkBitmap empty_bitmap; - empty_bitmap.setConfig( - SkBitmap::kNo_Config, content_rect_.width(), content_rect_.height()); - gfx::Rect analysis_rect( - picture_clone->AnalysisRectForRaster(content_rect_, contents_scale_)); - skia::AnalysisDevice analysis_device(empty_bitmap, - gfx::RectToSkRect(analysis_rect)); - skia::AnalysisCanvas analysis_canvas(&analysis_device); - - SkBitmapDevice raster_device(bitmap); - SkCanvas raster_canvas(&raster_device); - - SkNWayCanvas canvas(content_rect_.width(), content_rect_.height()); - canvas.addCanvas(&analysis_canvas); - canvas.addCanvas(&raster_canvas); - + SkBitmapDevice device(bitmap); + SkCanvas canvas(&device); skia::RefPtr<SkDrawFilter> draw_filter; switch (raster_mode_) { case LOW_QUALITY_RASTER_MODE: @@ -178,17 +192,18 @@ class RasterWorkerPoolTaskImpl : public internal::RasterWorkerPoolTask { ChangeBitmapConfigIfNeeded(bitmap, buffer); - analysis_.is_solid_color = - analysis_canvas.GetColorIfSolid(&analysis_.solid_color); - analysis_.has_text = analysis_canvas.HasText(); - - // Record the solid color prediction. - UMA_HISTOGRAM_BOOLEAN("Renderer4.SolidColorTilesAnalyzed", - analysis_.is_solid_color); - - return !analysis_.is_solid_color; + return true; } + // Overridden from internal::RasterWorkerPoolTask: + virtual bool RunOnWorkerThread(unsigned thread_index, + void* buffer, + gfx::Size size, + int stride) + OVERRIDE { + RunAnalysisOnThread(thread_index); + return RunRasterOnThread(thread_index, buffer, size, stride); + } virtual void CompleteOnOriginThread() OVERRIDE { reply_.Run(analysis_, !HasFinishedRunning() || WasCanceled()); } |