1// Copyright 2014 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "cc/resources/picture_pile_impl.h"
6
7#include "cc/debug/lap_timer.h"
8#include "cc/test/fake_picture_pile_impl.h"
9#include "cc/test/fake_rendering_stats_instrumentation.h"
10#include "testing/gtest/include/gtest/gtest.h"
11#include "testing/perf/perf_test.h"
12
13namespace cc {
14namespace {
15
16const int kTimeLimitMillis = 2000;
17const int kWarmupRuns = 5;
18const int kTimeCheckInterval = 10;
19
20const int kTileSize = 100;
21const int kLayerSize = 1000;
22
23class PicturePileImplPerfTest : public testing::Test {
24 public:
25  PicturePileImplPerfTest()
26      : timer_(kWarmupRuns,
27               base::TimeDelta::FromMilliseconds(kTimeLimitMillis),
28               kTimeCheckInterval) {}
29
30  void RunAnalyzeTest(const std::string& test_name, float contents_scale) {
31    scoped_refptr<PicturePileImpl> pile = FakePicturePileImpl::CreateFilledPile(
32        gfx::Size(kTileSize, kTileSize), gfx::Size(kLayerSize, kLayerSize));
33    // Content rect that will align with top-left tile at scale 1.0.
34    gfx::Rect content_rect(0, 0, kTileSize, kTileSize);
35
36    PicturePileImpl::Analysis analysis;
37    timer_.Reset();
38    do {
39      pile->AnalyzeInRect(content_rect, contents_scale, &analysis);
40      timer_.NextLap();
41    } while (!timer_.HasTimeLimitExpired());
42
43    perf_test::PrintResult(
44        "analyze", "", test_name, timer_.LapsPerSecond(), "runs/s", true);
45  }
46
47  void RunRasterTest(const std::string& test_name, float contents_scale) {
48    scoped_refptr<PicturePileImpl> pile = FakePicturePileImpl::CreateFilledPile(
49        gfx::Size(kTileSize, kTileSize), gfx::Size(kLayerSize, kLayerSize));
50    // Content rect that will align with top-left tile at scale 1.0.
51    gfx::Rect content_rect(0, 0, kTileSize, kTileSize);
52
53    SkBitmap bitmap;
54    bitmap.allocN32Pixels(1, 1);
55    SkCanvas canvas(bitmap);
56
57    FakeRenderingStatsInstrumentation rendering_stats_instrumentation;
58    timer_.Reset();
59    do {
60      pile->RasterToBitmap(&canvas,
61                           content_rect,
62                           contents_scale,
63                           &rendering_stats_instrumentation);
64      timer_.NextLap();
65    } while (!timer_.HasTimeLimitExpired());
66
67    perf_test::PrintResult(
68        "raster", "", test_name, timer_.LapsPerSecond(), "runs/s", true);
69  }
70
71 private:
72  LapTimer timer_;
73};
74
75TEST_F(PicturePileImplPerfTest, Analyze) {
76  RunAnalyzeTest("1", 1.0f);
77  RunAnalyzeTest("4", 0.5f);
78  RunAnalyzeTest("100", 0.1f);
79}
80
81TEST_F(PicturePileImplPerfTest, Raster) {
82  RunRasterTest("1", 1.0f);
83  RunRasterTest("4", 0.5f);
84  RunRasterTest("100", 0.1f);
85}
86
87}  // namespace
88}  // namespace cc
89