Merge "Add RoundRectClipping benchmarks"
diff --git a/libs/hwui/tests/common/scenes/RoundRectClippingAnimation.cpp b/libs/hwui/tests/common/scenes/RoundRectClippingAnimation.cpp
new file mode 100644
index 0000000..0f8906e
--- /dev/null
+++ b/libs/hwui/tests/common/scenes/RoundRectClippingAnimation.cpp
@@ -0,0 +1,77 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+#include "TestSceneBase.h"
+
+#include <vector>
+
+class RoundRectClippingAnimation : public TestScene {
+public:
+    int mSpacing, mSize;
+
+    RoundRectClippingAnimation(int spacing, int size)
+            : mSpacing(spacing), mSize(size) {}
+
+    std::vector< sp<RenderNode> > cards;
+    void createContent(int width, int height, Canvas& canvas) override {
+        canvas.drawColor(0xFFFFFFFF, SkXfermode::kSrcOver_Mode);
+        canvas.insertReorderBarrier(true);
+        int ci = 0;
+
+        for (int x = 0; x < width; x += mSpacing) {
+            for (int y = 0; y < height; y += mSpacing) {
+                auto color = BrightColors[ci++ % BrightColorsCount];
+                auto card = TestUtils::createNode(x, y, x + mSize, y + mSize,
+                        [&](RenderProperties& props, Canvas& canvas) {
+                    canvas.drawColor(color, SkXfermode::kSrcOver_Mode);
+                    props.mutableOutline().setRoundRect(0, 0,
+                            props.getWidth(), props.getHeight(), mSize * .25, 1);
+                    props.mutableOutline().setShouldClip(true);
+                });
+                canvas.drawRenderNode(card.get());
+                cards.push_back(card);
+            }
+        }
+
+        canvas.insertReorderBarrier(false);
+    }
+    void doFrame(int frameNr) override {
+        int curFrame = frameNr % 50;
+        if (curFrame > 25) curFrame = 50 - curFrame;
+        for (auto& card : cards) {
+            card->mutateStagingProperties().setTranslationX(curFrame);
+            card->mutateStagingProperties().setTranslationY(curFrame);
+            card->setPropertyFieldsDirty(RenderNode::X | RenderNode::Y);
+        }
+    }
+};
+
+static TestScene::Registrar _RoundRectClippingGpu(TestScene::Info{
+    "roundRectClipping-gpu",
+    "A bunch of RenderNodes with round rect clipping outlines that's GPU limited.",
+    [](const TestScene::Options&) -> test::TestScene* {
+        return new RoundRectClippingAnimation(dp(40), dp(200));
+    }
+});
+
+static TestScene::Registrar _RoundRectClippingCpu(TestScene::Info{
+    "roundRectClipping-cpu",
+    "A bunch of RenderNodes with round rect clipping outlines that's CPU limited.",
+    [](const TestScene::Options&) -> test::TestScene* {
+        return new RoundRectClippingAnimation(dp(20), dp(20));
+    }
+});