summaryrefslogtreecommitdiffstats
path: root/cc/resources
diff options
context:
space:
mode:
authorenne@chromium.org <enne@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-11-13 23:59:14 +0000
committerenne@chromium.org <enne@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-11-13 23:59:14 +0000
commit046a230ecb3236086aba08f2d558ea87c28c0ac3 (patch)
tree7b2ae562c20726ea0fd96405e3c9b3d19c12bcd8 /cc/resources
parentf7394b04b54261f8a53e652f6f89f7a9c79e782f (diff)
downloadchromium_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.cc3
-rw-r--r--cc/resources/picture.h1
-rw-r--r--cc/resources/picture_pile_impl.cc49
-rw-r--r--cc/resources/picture_pile_impl.h16
-rw-r--r--cc/resources/raster_worker_pool.cc79
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());
}