Index: cc/debug/rasterize_and_record_benchmark_impl.cc |
diff --git a/cc/debug/rasterize_and_record_benchmark_impl.cc b/cc/debug/rasterize_and_record_benchmark_impl.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..ecf268856d8b222072a89c4277051a505a17c22f |
--- /dev/null |
+++ b/cc/debug/rasterize_and_record_benchmark_impl.cc |
@@ -0,0 +1,117 @@ |
+// 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/debug/rasterize_and_record_benchmark_impl.h" |
+ |
+#include <algorithm> |
+#include <limits> |
+ |
+#include "base/basictypes.h" |
+#include "base/values.h" |
+#include "cc/layers/layer_impl.h" |
+#include "cc/layers/picture_layer_impl.h" |
+#include "cc/trees/layer_tree_host_common.h" |
+#include "cc/trees/layer_tree_host_impl.h" |
+#include "ui/gfx/rect.h" |
+ |
+namespace cc { |
+ |
+namespace { |
+ |
+const int kDefaultRasterizeRepeatCount = 100; |
+ |
+base::TimeTicks Now() { |
+ return base::TimeTicks::IsThreadNowSupported() |
+ ? base::TimeTicks::ThreadNow() |
+ : base::TimeTicks::HighResNow(); |
+} |
+ |
+} // namespace |
+ |
+RasterizeAndRecordBenchmarkImpl::RasterizeAndRecordBenchmarkImpl( |
+ scoped_refptr<base::MessageLoopProxy> origin_loop, |
+ base::Value* value, |
+ const MicroBenchmarkImpl::DoneCallback& callback) |
+ : MicroBenchmarkImpl(callback, origin_loop), |
+ rasterize_repeat_count_(kDefaultRasterizeRepeatCount) { |
+ base::DictionaryValue* settings = NULL; |
+ value->GetAsDictionary(&settings); |
+ if (!settings) |
+ return; |
+ |
+ if (settings->HasKey("rasterize_repeat_count")) |
+ settings->GetInteger("rasterize_repeat_count", &rasterize_repeat_count_); |
+} |
+ |
+RasterizeAndRecordBenchmarkImpl::~RasterizeAndRecordBenchmarkImpl() {} |
+ |
+void RasterizeAndRecordBenchmarkImpl::DidCompleteCommit( |
+ LayerTreeHostImpl* host) { |
+ LayerTreeHostCommon::CallFunctionForSubtree( |
+ host->RootLayer(), |
+ base::Bind(&RasterizeAndRecordBenchmarkImpl::Run, |
+ base::Unretained(this))); |
+ |
+ scoped_ptr<base::DictionaryValue> result(new base::DictionaryValue()); |
+ result->SetInteger("pixels_rasterized", rasterize_results_.pixels_rasterized); |
+ result->SetDouble("rasterize_time_ms", |
+ rasterize_results_.total_best_time.InMillisecondsF()); |
+ |
+ NotifyDone(result.PassAs<base::Value>()); |
+} |
+ |
+void RasterizeAndRecordBenchmarkImpl::Run(LayerImpl* layer) { |
+ layer->RunMicroBenchmark(this); |
+} |
+ |
+void RasterizeAndRecordBenchmarkImpl::RunOnLayer(PictureLayerImpl* layer) { |
enne (OOO)
2013/11/11 19:47:14
I don't understand why this has to run on the comp
vmpstr
2013/11/11 22:38:38
So I tried putting this on the main thread (which
|
+ if (layer->visible_content_rect().IsEmpty()) |
+ return; |
+ |
+ PictureLayerTilingSet tiling_set(layer, layer->content_bounds()); |
+ |
+ PictureLayerTiling* tiling = tiling_set.AddTiling(layer->contents_scale_x()); |
+ tiling->CreateAllTilesForTesting(); |
vmpstr
2013/11/09 01:05:52
This was the only way I could figure out how to cr
enne (OOO)
2013/11/11 19:47:14
I'm not sure why you need tiles here at all. The
vmpstr
2013/11/11 22:38:38
Geometry rect (from the coverage iterator) returns
|
+ for (PictureLayerTiling::CoverageIterator it( |
+ tiling, layer->contents_scale_x(), layer->visible_content_rect()); |
+ it; |
+ ++it) { |
+ DCHECK(*it); |
+ |
+ PicturePileImpl* picture_pile = (*it)->picture_pile(); |
+ gfx::Rect content_rect = (*it)->content_rect(); |
+ float contents_scale = (*it)->contents_scale(); |
+ |
+ base::TimeDelta min_time = |
+ base::TimeDelta::FromInternalValue(std::numeric_limits<int64>::max()); |
+ for (int i = 0; i < rasterize_repeat_count_; ++i) { |
+ SkBitmap bitmap; |
+ bitmap.setConfig(SkBitmap::kARGB_8888_Config, |
+ content_rect.width(), |
+ content_rect.height()); |
+ bitmap.allocPixels(); |
+ |
+ SkBitmapDevice device(bitmap); |
+ SkCanvas canvas(&device); |
+ |
+ base::TimeTicks start = Now(); |
+ picture_pile->RasterToBitmap(&canvas, content_rect, contents_scale, NULL); |
+ base::TimeTicks end = Now(); |
+ base::TimeDelta duration = end - start; |
+ if (duration < min_time) |
+ min_time = duration; |
+ } |
+ |
+ rasterize_results_.pixels_rasterized += |
+ content_rect.width() * content_rect.height(); |
+ rasterize_results_.total_best_time += min_time; |
+ } |
+} |
+ |
+RasterizeAndRecordBenchmarkImpl::RasterizeResults::RasterizeResults() |
+ : pixels_rasterized(0) {} |
+ |
+RasterizeAndRecordBenchmarkImpl::RasterizeResults::~RasterizeResults() {} |
+ |
+} // namespace cc |