182f5e0c5cd0fcbacd8094b7963a50a2e30e0846fJohn Reck/*
282f5e0c5cd0fcbacd8094b7963a50a2e30e0846fJohn Reck * Copyright (C) 2015 The Android Open Source Project
382f5e0c5cd0fcbacd8094b7963a50a2e30e0846fJohn Reck *
482f5e0c5cd0fcbacd8094b7963a50a2e30e0846fJohn Reck * Licensed under the Apache License, Version 2.0 (the "License");
582f5e0c5cd0fcbacd8094b7963a50a2e30e0846fJohn Reck * you may not use this file except in compliance with the License.
682f5e0c5cd0fcbacd8094b7963a50a2e30e0846fJohn Reck * You may obtain a copy of the License at
782f5e0c5cd0fcbacd8094b7963a50a2e30e0846fJohn Reck *
882f5e0c5cd0fcbacd8094b7963a50a2e30e0846fJohn Reck *      http://www.apache.org/licenses/LICENSE-2.0
982f5e0c5cd0fcbacd8094b7963a50a2e30e0846fJohn Reck *
1082f5e0c5cd0fcbacd8094b7963a50a2e30e0846fJohn Reck * Unless required by applicable law or agreed to in writing, software
1182f5e0c5cd0fcbacd8094b7963a50a2e30e0846fJohn Reck * distributed under the License is distributed on an "AS IS" BASIS,
1282f5e0c5cd0fcbacd8094b7963a50a2e30e0846fJohn Reck * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1382f5e0c5cd0fcbacd8094b7963a50a2e30e0846fJohn Reck * See the License for the specific language governing permissions and
1482f5e0c5cd0fcbacd8094b7963a50a2e30e0846fJohn Reck * limitations under the License.
1582f5e0c5cd0fcbacd8094b7963a50a2e30e0846fJohn Reck */
1682f5e0c5cd0fcbacd8094b7963a50a2e30e0846fJohn Reck
170418afa362630e69bd853121770b115750ee46a4John Reck#include <benchmark/benchmark.h>
1882f5e0c5cd0fcbacd8094b7963a50a2e30e0846fJohn Reck
1982f5e0c5cd0fcbacd8094b7963a50a2e30e0846fJohn Reck#include "Matrix.h"
2082f5e0c5cd0fcbacd8094b7963a50a2e30e0846fJohn Reck#include "Rect.h"
211bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck#include "TessellationCache.h"
2282f5e0c5cd0fcbacd8094b7963a50a2e30e0846fJohn Reck#include "Vector.h"
2382f5e0c5cd0fcbacd8094b7963a50a2e30e0846fJohn Reck#include "VertexBuffer.h"
2482f5e0c5cd0fcbacd8094b7963a50a2e30e0846fJohn Reck
2582f5e0c5cd0fcbacd8094b7963a50a2e30e0846fJohn Reck#include <SkPath.h>
2682f5e0c5cd0fcbacd8094b7963a50a2e30e0846fJohn Reck
2782f5e0c5cd0fcbacd8094b7963a50a2e30e0846fJohn Reck#include <memory>
2882f5e0c5cd0fcbacd8094b7963a50a2e30e0846fJohn Reck
2982f5e0c5cd0fcbacd8094b7963a50a2e30e0846fJohn Reckusing namespace android;
3082f5e0c5cd0fcbacd8094b7963a50a2e30e0846fJohn Reckusing namespace android::uirenderer;
3182f5e0c5cd0fcbacd8094b7963a50a2e30e0846fJohn Reck
3282f5e0c5cd0fcbacd8094b7963a50a2e30e0846fJohn Reckstruct ShadowTestData {
3382f5e0c5cd0fcbacd8094b7963a50a2e30e0846fJohn Reck    Matrix4 drawTransform;
3482f5e0c5cd0fcbacd8094b7963a50a2e30e0846fJohn Reck    Rect localClip;
3582f5e0c5cd0fcbacd8094b7963a50a2e30e0846fJohn Reck    Matrix4 casterTransformXY;
3682f5e0c5cd0fcbacd8094b7963a50a2e30e0846fJohn Reck    Matrix4 casterTransformZ;
3782f5e0c5cd0fcbacd8094b7963a50a2e30e0846fJohn Reck    Vector3 lightCenter;
3882f5e0c5cd0fcbacd8094b7963a50a2e30e0846fJohn Reck    float lightRadius;
3982f5e0c5cd0fcbacd8094b7963a50a2e30e0846fJohn Reck};
4082f5e0c5cd0fcbacd8094b7963a50a2e30e0846fJohn Reck
4182f5e0c5cd0fcbacd8094b7963a50a2e30e0846fJohn Reckvoid createShadowTestData(ShadowTestData* out) {
4282f5e0c5cd0fcbacd8094b7963a50a2e30e0846fJohn Reck    static float SAMPLE_DRAW_TRANSFORM[] = {
431bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck            1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1,
4482f5e0c5cd0fcbacd8094b7963a50a2e30e0846fJohn Reck    };
4582f5e0c5cd0fcbacd8094b7963a50a2e30e0846fJohn Reck    static float SAMPLE_CASTERXY[] = {
461bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck            1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 32, 32, 0, 1,
4782f5e0c5cd0fcbacd8094b7963a50a2e30e0846fJohn Reck    };
4882f5e0c5cd0fcbacd8094b7963a50a2e30e0846fJohn Reck    static float SAMPLE_CASTERZ[] = {
491bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck            1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 32, 32, 32, 1,
5082f5e0c5cd0fcbacd8094b7963a50a2e30e0846fJohn Reck    };
5182f5e0c5cd0fcbacd8094b7963a50a2e30e0846fJohn Reck    static Rect SAMPLE_CLIP(0, 0, 1536, 2048);
5282f5e0c5cd0fcbacd8094b7963a50a2e30e0846fJohn Reck    static Vector3 SAMPLE_LIGHT_CENTER{768, -400, 1600};
5382f5e0c5cd0fcbacd8094b7963a50a2e30e0846fJohn Reck    static float SAMPLE_LIGHT_RADIUS = 1600;
5482f5e0c5cd0fcbacd8094b7963a50a2e30e0846fJohn Reck
5582f5e0c5cd0fcbacd8094b7963a50a2e30e0846fJohn Reck    out->drawTransform.load(SAMPLE_DRAW_TRANSFORM);
5682f5e0c5cd0fcbacd8094b7963a50a2e30e0846fJohn Reck    out->localClip = SAMPLE_CLIP;
5782f5e0c5cd0fcbacd8094b7963a50a2e30e0846fJohn Reck    out->casterTransformXY.load(SAMPLE_CASTERXY);
5882f5e0c5cd0fcbacd8094b7963a50a2e30e0846fJohn Reck    out->casterTransformZ.load(SAMPLE_CASTERZ);
5982f5e0c5cd0fcbacd8094b7963a50a2e30e0846fJohn Reck    out->lightCenter = SAMPLE_LIGHT_CENTER;
6082f5e0c5cd0fcbacd8094b7963a50a2e30e0846fJohn Reck    out->lightRadius = SAMPLE_LIGHT_RADIUS;
6182f5e0c5cd0fcbacd8094b7963a50a2e30e0846fJohn Reck}
6282f5e0c5cd0fcbacd8094b7963a50a2e30e0846fJohn Reck
631bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reckstatic inline void tessellateShadows(ShadowTestData& testData, bool opaque, const SkPath& shape,
641bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck                                     VertexBuffer* ambient, VertexBuffer* spot) {
651bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck    tessellateShadows(&testData.drawTransform, &testData.localClip, opaque, &shape,
661bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck                      &testData.casterTransformXY, &testData.casterTransformZ, testData.lightCenter,
671bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck                      testData.lightRadius, *ambient, *spot);
6882f5e0c5cd0fcbacd8094b7963a50a2e30e0846fJohn Reck}
6982f5e0c5cd0fcbacd8094b7963a50a2e30e0846fJohn Reck
700418afa362630e69bd853121770b115750ee46a4John Reckvoid BM_TessellateShadows_roundrect_opaque(benchmark::State& state) {
7182f5e0c5cd0fcbacd8094b7963a50a2e30e0846fJohn Reck    ShadowTestData shadowData;
7282f5e0c5cd0fcbacd8094b7963a50a2e30e0846fJohn Reck    createShadowTestData(&shadowData);
7382f5e0c5cd0fcbacd8094b7963a50a2e30e0846fJohn Reck    SkPath path;
749564ff0baf1b4f178794977a02e54fca38df8772John Reck    path.addRoundRect(SkRect::MakeWH(100, 100), 5, 5);
7582f5e0c5cd0fcbacd8094b7963a50a2e30e0846fJohn Reck
760418afa362630e69bd853121770b115750ee46a4John Reck    while (state.KeepRunning()) {
779564ff0baf1b4f178794977a02e54fca38df8772John Reck        VertexBuffer ambient;
789564ff0baf1b4f178794977a02e54fca38df8772John Reck        VertexBuffer spot;
799564ff0baf1b4f178794977a02e54fca38df8772John Reck        tessellateShadows(shadowData, true, path, &ambient, &spot);
800418afa362630e69bd853121770b115750ee46a4John Reck        benchmark::DoNotOptimize(&ambient);
810418afa362630e69bd853121770b115750ee46a4John Reck        benchmark::DoNotOptimize(&spot);
8282f5e0c5cd0fcbacd8094b7963a50a2e30e0846fJohn Reck    }
8382f5e0c5cd0fcbacd8094b7963a50a2e30e0846fJohn Reck}
840418afa362630e69bd853121770b115750ee46a4John ReckBENCHMARK(BM_TessellateShadows_roundrect_opaque);
8582f5e0c5cd0fcbacd8094b7963a50a2e30e0846fJohn Reck
860418afa362630e69bd853121770b115750ee46a4John Reckvoid BM_TessellateShadows_roundrect_translucent(benchmark::State& state) {
8782f5e0c5cd0fcbacd8094b7963a50a2e30e0846fJohn Reck    ShadowTestData shadowData;
8882f5e0c5cd0fcbacd8094b7963a50a2e30e0846fJohn Reck    createShadowTestData(&shadowData);
8982f5e0c5cd0fcbacd8094b7963a50a2e30e0846fJohn Reck    SkPath path;
9082f5e0c5cd0fcbacd8094b7963a50a2e30e0846fJohn Reck    path.reset();
9182f5e0c5cd0fcbacd8094b7963a50a2e30e0846fJohn Reck    path.addRoundRect(SkRect::MakeLTRB(0, 0, 100, 100), 5, 5);
9282f5e0c5cd0fcbacd8094b7963a50a2e30e0846fJohn Reck
930418afa362630e69bd853121770b115750ee46a4John Reck    while (state.KeepRunning()) {
9482f5e0c5cd0fcbacd8094b7963a50a2e30e0846fJohn Reck        std::unique_ptr<VertexBuffer> ambient(new VertexBuffer);
9582f5e0c5cd0fcbacd8094b7963a50a2e30e0846fJohn Reck        std::unique_ptr<VertexBuffer> spot(new VertexBuffer);
9682f5e0c5cd0fcbacd8094b7963a50a2e30e0846fJohn Reck        tessellateShadows(shadowData, false, path, ambient.get(), spot.get());
970418afa362630e69bd853121770b115750ee46a4John Reck        benchmark::DoNotOptimize(ambient.get());
980418afa362630e69bd853121770b115750ee46a4John Reck        benchmark::DoNotOptimize(spot.get());
9982f5e0c5cd0fcbacd8094b7963a50a2e30e0846fJohn Reck    }
10082f5e0c5cd0fcbacd8094b7963a50a2e30e0846fJohn Reck}
1010418afa362630e69bd853121770b115750ee46a4John ReckBENCHMARK(BM_TessellateShadows_roundrect_translucent);
102