| Index: cc/layer_tree_host_perftest.cc
|
| diff --git a/cc/layer_tree_host_perftest.cc b/cc/layer_tree_host_perftest.cc
|
| index 398de63996acba8507001aef4e1742f280042168..d72c1bd4de9aa8e0de2c8572d541f222c5ae9b8d 100644
|
| --- a/cc/layer_tree_host_perftest.cc
|
| +++ b/cc/layer_tree_host_perftest.cc
|
| @@ -4,6 +4,12 @@
|
|
|
| #include "cc/layer_tree_host.h"
|
|
|
| +#include "base/base_paths.h"
|
| +#include "base/file_path.h"
|
| +#include "base/file_util.h"
|
| +#include "base/json/json_reader.h"
|
| +#include "base/path_service.h"
|
| +#include "base/string_piece.h"
|
| #include "cc/content_layer.h"
|
| #include "cc/nine_patch_layer.h"
|
| #include "cc/solid_color_layer.h"
|
| @@ -13,14 +19,39 @@
|
| namespace cc {
|
| namespace {
|
|
|
| -class LayerTreeHostPerfTest : public WebKitTests::ThreadedTest {};
|
| +static const int kTimeLimitMillis = 2000;
|
|
|
| -class LayerTreeHostPerfTestSevenTabSwitcher : public LayerTreeHostPerfTest {
|
| +class LayerTreeHostPerfTest : public WebKitTests::ThreadedTest {
|
| public:
|
| - LayerTreeHostPerfTestSevenTabSwitcher() : num_draws_(0) {
|
| + LayerTreeHostPerfTest()
|
| + : num_draws_(0) {
|
| fake_delegate_.setPaintAllOpaque(true);
|
| }
|
|
|
| + virtual void beginTest() OVERRIDE {
|
| + buildTree();
|
| + start_time_ = base::TimeTicks::HighResNow();
|
| + postSetNeedsCommitToMainThread();
|
| + }
|
| +
|
| + virtual void drawLayersOnThread(LayerTreeHostImpl* impl) OVERRIDE {
|
| + ++num_draws_;
|
| + if ((base::TimeTicks::HighResNow() - start_time_) >=
|
| + base::TimeDelta::FromMilliseconds(kTimeLimitMillis))
|
| + endTest();
|
| + impl->setNeedsRedraw();
|
| + }
|
| +
|
| + virtual void buildTree() {}
|
| +
|
| + virtual void afterTest() OVERRIDE {
|
| + base::TimeDelta elapsed = base::TimeTicks::HighResNow() - start_time_;
|
| + // Format matches chrome/test/perf/perf_test.h:PrintResult
|
| + printf("*RESULT %s: frames= %.2f runs/s\n",
|
| + test_name_.c_str(),
|
| + num_draws_ / elapsed.InSecondsF());
|
| + }
|
| +
|
| scoped_refptr<Layer> CreateLayer(float x, float y, int width, int height) {
|
| scoped_refptr<Layer> layer = Layer::create();
|
| layer->setAnchorPoint(gfx::Point());
|
| @@ -48,6 +79,10 @@ class LayerTreeHostPerfTestSevenTabSwitcher : public LayerTreeHostPerfTest {
|
| }
|
|
|
| scoped_refptr<NinePatchLayer> CreateDecorationLayer(float x, float y, int width, int height) {
|
| + return CreateDecorationLayer(x, y, width, height, gfx::Rect(0, 0, width, height));
|
| + }
|
| +
|
| + scoped_refptr<NinePatchLayer> CreateDecorationLayer(float x, float y, int width, int height, gfx::Rect aperture) {
|
| scoped_refptr<NinePatchLayer> layer = NinePatchLayer::create();
|
| layer->setAnchorPoint(gfx::Point());
|
| layer->setPosition(gfx::PointF(x, y));
|
| @@ -57,7 +92,7 @@ class LayerTreeHostPerfTestSevenTabSwitcher : public LayerTreeHostPerfTest {
|
| SkBitmap bitmap;
|
| bitmap.setConfig(SkBitmap::kARGB_8888_Config, 1, 1);
|
| bitmap.allocPixels(NULL, NULL);
|
| - layer->setBitmap(bitmap, gfx::Rect(0, 0, width, height));
|
| + layer->setBitmap(bitmap, aperture);
|
|
|
| return layer;
|
| }
|
| @@ -67,7 +102,21 @@ class LayerTreeHostPerfTestSevenTabSwitcher : public LayerTreeHostPerfTest {
|
| return child;
|
| }
|
|
|
| - virtual void beginTest() OVERRIDE {
|
| + protected:
|
| + base::TimeTicks start_time_;
|
| + int num_draws_;
|
| + std::string test_name_;
|
| + WebKitTests::FakeContentLayerClient fake_delegate_;
|
| +};
|
| +
|
| +class LayerTreeHostPerfTestSevenTabSwitcher : public LayerTreeHostPerfTest {
|
| + public:
|
| + LayerTreeHostPerfTestSevenTabSwitcher()
|
| + : LayerTreeHostPerfTest() {
|
| + test_name_ = "SevenTabSwitcher";
|
| + }
|
| +
|
| + virtual void buildTree() OVERRIDE {
|
| scoped_refptr<Layer> root = CreateLayer(0, 0, 720, 1038); // 1
|
| scoped_refptr<Layer> layer;
|
|
|
| @@ -176,24 +225,103 @@ class LayerTreeHostPerfTestSevenTabSwitcher : public LayerTreeHostPerfTest {
|
|
|
| m_layerTreeHost->setViewportSize(gfx::Size(720, 1038), gfx::Size(720, 1038));
|
| m_layerTreeHost->setRootLayer(root);
|
| - postSetNeedsCommitToMainThread();
|
| }
|
| +};
|
|
|
| - virtual void drawLayersOnThread(LayerTreeHostImpl* impl) OVERRIDE {
|
| - impl->setNeedsRedraw();
|
| - ++num_draws_;
|
| - if (num_draws_ > 120)
|
| - endTest();
|
| +TEST_F(LayerTreeHostPerfTestSevenTabSwitcher, runSingleThread) {
|
| + runTest(false);
|
| +}
|
| +
|
| +class LayerTreeHostPerfTestJsonReader : public LayerTreeHostPerfTest {
|
| + public:
|
| + LayerTreeHostPerfTestJsonReader()
|
| + : LayerTreeHostPerfTest() {
|
| + }
|
| +
|
| + void readTestFile(std::string name) {
|
| + test_name_ = name;
|
| + FilePath filepath;
|
| + ASSERT_TRUE(PathService::Get(base::DIR_SOURCE_ROOT, &filepath));
|
| + filepath = filepath.AppendASCII("cc").AppendASCII("test")
|
| + .AppendASCII("data").AppendASCII(name + ".json");
|
| + std::string json;
|
| + ASSERT_TRUE(file_util::ReadFileToString(filepath, &json));
|
| + tree_.reset(base::JSONReader::Read(json));
|
| + ASSERT_TRUE(tree_);
|
| }
|
|
|
| - virtual void afterTest() OVERRIDE {}
|
| + scoped_refptr<Layer> parseLayer(base::Value* val) {
|
| + DictionaryValue* dict;
|
| + bool success = true;
|
| + success &= val->GetAsDictionary(&dict);
|
| + std::string layer_type;
|
| + success &= dict->GetString("LayerType", &layer_type);
|
| + ListValue* list;
|
| + success &= dict->GetList("Bounds", &list);
|
| + int width, height;
|
| + success &= list->GetInteger(0, &width);
|
| + success &= list->GetInteger(1, &height);
|
| + success &= dict->GetList("Position", &list);
|
| + double position_x, position_y;
|
| + success &= list->GetDouble(0, &position_x);
|
| + success &= list->GetDouble(1, &position_y);
|
| +
|
| + scoped_refptr<Layer> new_layer;
|
| + if (layer_type == "SolidColorLayer") {
|
| + new_layer = CreateColorLayer(position_x, position_y, width, height);
|
| + } else if (layer_type == "ContentLayer") {
|
| + new_layer = CreateContentLayer(position_x, position_y, width, height);
|
| + } else if (layer_type == "NinePatchLayer") {
|
| + success &= dict->GetList("ImageAperture", &list);
|
| + int aperture_x, aperture_y, aperture_width, aperture_height;
|
| + success &= list->GetInteger(0, &aperture_x);
|
| + success &= list->GetInteger(1, &aperture_y);
|
| + success &= list->GetInteger(2, &aperture_width);
|
| + success &= list->GetInteger(3, &aperture_height);
|
| +
|
| + new_layer = CreateDecorationLayer(
|
| + position_x, position_y, width, height,
|
| + gfx::Rect(aperture_x, aperture_y, aperture_width, aperture_height));
|
| +
|
| + } else { // Type "Layer" or "unknown"
|
| + new_layer = CreateLayer(position_x, position_y, width, height);
|
| + }
|
| +
|
| + success &= dict->GetList("DrawTransform", &list);
|
| + double transform[16];
|
| + for (int i = 0; i < 16; ++i)
|
| + success &= list->GetDouble(i, &transform[i]);
|
| +
|
| + gfx::Transform gfxTransform;
|
| + gfxTransform.matrix().setColMajord(transform);
|
| + new_layer->setTransform(gfxTransform);
|
| +
|
| + success &= dict->GetList("Children", &list);
|
| + for (ListValue::const_iterator it = list->begin();
|
| + it != list->end(); ++it) {
|
| + new_layer->addChild(parseLayer(*it));
|
| + }
|
| +
|
| + if (!success)
|
| + ADD_FAILURE() << "Could not parse json data";
|
| +
|
| + return new_layer;
|
| + }
|
| +
|
| + virtual void buildTree() OVERRIDE {
|
| + gfx::Size viewport = gfx::Size(720, 1038);
|
| + m_layerTreeHost->setViewportSize(viewport, viewport);
|
| + m_layerTreeHost->setRootLayer(parseLayer(tree_.get()));
|
| + }
|
|
|
| private:
|
| - int num_draws_;
|
| - WebKitTests::FakeContentLayerClient fake_delegate_;
|
| + scoped_ptr<base::Value> tree_;
|
| };
|
|
|
| -SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostPerfTestSevenTabSwitcher);
|
| +TEST_F(LayerTreeHostPerfTestJsonReader, tenTenSingleThread) {
|
| + readTestFile("10_10_layer_tree");
|
| + runTest(false);
|
| +}
|
|
|
| } // namespace
|
| } // namespace cc
|
|
|