summaryrefslogtreecommitdiffstats
path: root/chromium/cc/debug/rasterize_and_record_benchmark.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/cc/debug/rasterize_and_record_benchmark.cc')
-rw-r--r--chromium/cc/debug/rasterize_and_record_benchmark.cc79
1 files changed, 46 insertions, 33 deletions
diff --git a/chromium/cc/debug/rasterize_and_record_benchmark.cc b/chromium/cc/debug/rasterize_and_record_benchmark.cc
index 4646afd6bce..197fb291a05 100644
--- a/chromium/cc/debug/rasterize_and_record_benchmark.cc
+++ b/chromium/cc/debug/rasterize_and_record_benchmark.cc
@@ -6,9 +6,12 @@
#include <algorithm>
#include <limits>
+#include <string>
#include "base/basictypes.h"
+#include "base/strings/stringprintf.h"
#include "base/values.h"
+#include "cc/debug/lap_timer.h"
#include "cc/debug/rasterize_and_record_benchmark_impl.h"
#include "cc/layers/layer.h"
#include "cc/layers/picture_layer.h"
@@ -22,11 +25,8 @@ namespace {
const int kDefaultRecordRepeatCount = 100;
-base::TimeTicks Now() {
- return base::TimeTicks::IsThreadNowSupported()
- ? base::TimeTicks::ThreadNow()
- : base::TimeTicks::HighResNow();
-}
+const char* kModeSuffixes[Picture::RECORDING_MODE_COUNT] = {
+ "", "_sk_null_canvas", "_painting_disabled", "_skrecord"};
} // namespace
@@ -61,8 +61,12 @@ void RasterizeAndRecordBenchmark::DidUpdateLayers(LayerTreeHost* host) {
DCHECK(!results_.get());
results_ = make_scoped_ptr(new base::DictionaryValue);
results_->SetInteger("pixels_recorded", record_results_.pixels_recorded);
- results_->SetDouble("record_time_ms",
- record_results_.total_best_time.InMillisecondsF());
+
+ for (int i = 0; i < Picture::RECORDING_MODE_COUNT; i++) {
+ std::string name = base::StringPrintf("record_time%s_ms", kModeSuffixes[i]);
+ results_->SetDouble(name,
+ record_results_.total_best_time[i].InMillisecondsF());
+ }
main_thread_benchmark_done_ = true;
}
@@ -72,18 +76,9 @@ void RasterizeAndRecordBenchmark::RecordRasterResults(
base::DictionaryValue* results = NULL;
results_value->GetAsDictionary(&results);
-
DCHECK(results);
- DCHECK(results->HasKey("pixels_rasterized"));
- DCHECK(results->HasKey("rasterize_time_ms"));
-
- int pixels_rasterized;
- results->GetInteger("pixels_rasterized", &pixels_rasterized);
- double rasterize_time_ms;
- results->GetDouble("rasterize_time_ms", &rasterize_time_ms);
- results_->SetInteger("pixels_rasterized", pixels_rasterized);
- results_->SetDouble("rasterize_time_ms", rasterize_time_ms);
+ results_->MergeDictionary(results);
NotifyDone(results_.PassAs<base::Value>());
}
@@ -108,7 +103,7 @@ void RasterizeAndRecordBenchmark::RunOnLayer(PictureLayer* layer) {
DCHECK(host_);
gfx::Size tile_grid_size = host_->settings().default_tile_size;
- SkTileGridPicture::TileGridInfo tile_grid_info;
+ SkTileGridFactory::TileGridInfo tile_grid_info;
PicturePileBase::ComputeTileGridInfo(tile_grid_size, &tile_grid_info);
gfx::Rect visible_content_rect = gfx::ScaleToEnclosingRect(
@@ -116,22 +111,40 @@ void RasterizeAndRecordBenchmark::RunOnLayer(PictureLayer* layer) {
if (visible_content_rect.IsEmpty())
return;
- scoped_refptr<Picture> picture = Picture::Create(visible_content_rect);
-
- base::TimeDelta min_time =
- base::TimeDelta::FromInternalValue(std::numeric_limits<int64>::max());
- for (int i = 0; i < record_repeat_count_; ++i) {
- base::TimeTicks start = Now();
- picture->Record(painter, tile_grid_info);
- base::TimeTicks end = Now();
- base::TimeDelta duration = end - start;
- if (duration < min_time)
- min_time = duration;
+ for (int mode_index = 0; mode_index < Picture::RECORDING_MODE_COUNT;
+ mode_index++) {
+ Picture::RecordingMode mode =
+ static_cast<Picture::RecordingMode>(mode_index);
+ base::TimeDelta min_time = base::TimeDelta::Max();
+
+ // Parameters for LapTimer.
+ const int kTimeLimitMillis = 1;
+ const int kWarmupRuns = 0;
+ const int kTimeCheckInterval = 1;
+
+ for (int i = 0; i < record_repeat_count_; ++i) {
+ // Run for a minimum amount of time to avoid problems with timer
+ // quantization when the layer is very small.
+ LapTimer timer(kWarmupRuns,
+ base::TimeDelta::FromMilliseconds(kTimeLimitMillis),
+ kTimeCheckInterval);
+ do {
+ scoped_refptr<Picture> picture = Picture::Create(
+ visible_content_rect, painter, tile_grid_info, false, 0, mode);
+ timer.NextLap();
+ } while (!timer.HasTimeLimitExpired());
+ base::TimeDelta duration =
+ base::TimeDelta::FromMillisecondsD(timer.MsPerLap());
+ if (duration < min_time)
+ min_time = duration;
+ }
+
+ if (mode == Picture::RECORD_NORMALLY) {
+ record_results_.pixels_recorded +=
+ visible_content_rect.width() * visible_content_rect.height();
+ }
+ record_results_.total_best_time[mode_index] += min_time;
}
-
- record_results_.pixels_recorded +=
- visible_content_rect.width() * visible_content_rect.height();
- record_results_.total_best_time += min_time;
}
RasterizeAndRecordBenchmark::RecordResults::RecordResults()