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" 2182f5e0c5cd0fcbacd8094b7963a50a2e30e0846fJohn Reck#include "Vector.h" 2282f5e0c5cd0fcbacd8094b7963a50a2e30e0846fJohn Reck#include "VertexBuffer.h" 2382f5e0c5cd0fcbacd8094b7963a50a2e30e0846fJohn Reck#include "TessellationCache.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[] = { 4382f5e0c5cd0fcbacd8094b7963a50a2e30e0846fJohn Reck 1, 0, 0, 0, 4482f5e0c5cd0fcbacd8094b7963a50a2e30e0846fJohn Reck 0, 1, 0, 0, 4582f5e0c5cd0fcbacd8094b7963a50a2e30e0846fJohn Reck 0, 0, 1, 0, 4682f5e0c5cd0fcbacd8094b7963a50a2e30e0846fJohn Reck 0, 0, 0, 1, 4782f5e0c5cd0fcbacd8094b7963a50a2e30e0846fJohn Reck }; 4882f5e0c5cd0fcbacd8094b7963a50a2e30e0846fJohn Reck static float SAMPLE_CASTERXY[] = { 4982f5e0c5cd0fcbacd8094b7963a50a2e30e0846fJohn Reck 1, 0, 0, 0, 5082f5e0c5cd0fcbacd8094b7963a50a2e30e0846fJohn Reck 0, 1, 0, 0, 5182f5e0c5cd0fcbacd8094b7963a50a2e30e0846fJohn Reck 0, 0, 1, 0, 5282f5e0c5cd0fcbacd8094b7963a50a2e30e0846fJohn Reck 32, 32, 0, 1, 5382f5e0c5cd0fcbacd8094b7963a50a2e30e0846fJohn Reck }; 5482f5e0c5cd0fcbacd8094b7963a50a2e30e0846fJohn Reck static float SAMPLE_CASTERZ[] = { 5582f5e0c5cd0fcbacd8094b7963a50a2e30e0846fJohn Reck 1, 0, 0, 0, 5682f5e0c5cd0fcbacd8094b7963a50a2e30e0846fJohn Reck 0, 1, 0, 0, 5782f5e0c5cd0fcbacd8094b7963a50a2e30e0846fJohn Reck 0, 0, 1, 0, 5882f5e0c5cd0fcbacd8094b7963a50a2e30e0846fJohn Reck 32, 32, 32, 1, 5982f5e0c5cd0fcbacd8094b7963a50a2e30e0846fJohn Reck }; 6082f5e0c5cd0fcbacd8094b7963a50a2e30e0846fJohn Reck static Rect SAMPLE_CLIP(0, 0, 1536, 2048); 6182f5e0c5cd0fcbacd8094b7963a50a2e30e0846fJohn Reck static Vector3 SAMPLE_LIGHT_CENTER{768, -400, 1600}; 6282f5e0c5cd0fcbacd8094b7963a50a2e30e0846fJohn Reck static float SAMPLE_LIGHT_RADIUS = 1600; 6382f5e0c5cd0fcbacd8094b7963a50a2e30e0846fJohn Reck 6482f5e0c5cd0fcbacd8094b7963a50a2e30e0846fJohn Reck out->drawTransform.load(SAMPLE_DRAW_TRANSFORM); 6582f5e0c5cd0fcbacd8094b7963a50a2e30e0846fJohn Reck out->localClip = SAMPLE_CLIP; 6682f5e0c5cd0fcbacd8094b7963a50a2e30e0846fJohn Reck out->casterTransformXY.load(SAMPLE_CASTERXY); 6782f5e0c5cd0fcbacd8094b7963a50a2e30e0846fJohn Reck out->casterTransformZ.load(SAMPLE_CASTERZ); 6882f5e0c5cd0fcbacd8094b7963a50a2e30e0846fJohn Reck out->lightCenter = SAMPLE_LIGHT_CENTER; 6982f5e0c5cd0fcbacd8094b7963a50a2e30e0846fJohn Reck out->lightRadius = SAMPLE_LIGHT_RADIUS; 7082f5e0c5cd0fcbacd8094b7963a50a2e30e0846fJohn Reck} 7182f5e0c5cd0fcbacd8094b7963a50a2e30e0846fJohn Reck 7282f5e0c5cd0fcbacd8094b7963a50a2e30e0846fJohn Reckstatic inline void tessellateShadows(ShadowTestData& testData, bool opaque, 7382f5e0c5cd0fcbacd8094b7963a50a2e30e0846fJohn Reck const SkPath& shape, VertexBuffer* ambient, VertexBuffer* spot) { 7482f5e0c5cd0fcbacd8094b7963a50a2e30e0846fJohn Reck tessellateShadows(&testData.drawTransform, &testData.localClip, 7582f5e0c5cd0fcbacd8094b7963a50a2e30e0846fJohn Reck opaque, &shape, &testData.casterTransformXY, 7682f5e0c5cd0fcbacd8094b7963a50a2e30e0846fJohn Reck &testData.casterTransformZ, testData.lightCenter, 7782f5e0c5cd0fcbacd8094b7963a50a2e30e0846fJohn Reck testData.lightRadius, *ambient, *spot); 7882f5e0c5cd0fcbacd8094b7963a50a2e30e0846fJohn Reck} 7982f5e0c5cd0fcbacd8094b7963a50a2e30e0846fJohn Reck 800418afa362630e69bd853121770b115750ee46a4John Reckvoid BM_TessellateShadows_roundrect_opaque(benchmark::State& state) { 8182f5e0c5cd0fcbacd8094b7963a50a2e30e0846fJohn Reck ShadowTestData shadowData; 8282f5e0c5cd0fcbacd8094b7963a50a2e30e0846fJohn Reck createShadowTestData(&shadowData); 8382f5e0c5cd0fcbacd8094b7963a50a2e30e0846fJohn Reck SkPath path; 849564ff0baf1b4f178794977a02e54fca38df8772John Reck path.addRoundRect(SkRect::MakeWH(100, 100), 5, 5); 8582f5e0c5cd0fcbacd8094b7963a50a2e30e0846fJohn Reck 860418afa362630e69bd853121770b115750ee46a4John Reck while (state.KeepRunning()) { 879564ff0baf1b4f178794977a02e54fca38df8772John Reck VertexBuffer ambient; 889564ff0baf1b4f178794977a02e54fca38df8772John Reck VertexBuffer spot; 899564ff0baf1b4f178794977a02e54fca38df8772John Reck tessellateShadows(shadowData, true, path, &ambient, &spot); 900418afa362630e69bd853121770b115750ee46a4John Reck benchmark::DoNotOptimize(&ambient); 910418afa362630e69bd853121770b115750ee46a4John Reck benchmark::DoNotOptimize(&spot); 9282f5e0c5cd0fcbacd8094b7963a50a2e30e0846fJohn Reck } 9382f5e0c5cd0fcbacd8094b7963a50a2e30e0846fJohn Reck} 940418afa362630e69bd853121770b115750ee46a4John ReckBENCHMARK(BM_TessellateShadows_roundrect_opaque); 9582f5e0c5cd0fcbacd8094b7963a50a2e30e0846fJohn Reck 960418afa362630e69bd853121770b115750ee46a4John Reckvoid BM_TessellateShadows_roundrect_translucent(benchmark::State& state) { 9782f5e0c5cd0fcbacd8094b7963a50a2e30e0846fJohn Reck ShadowTestData shadowData; 9882f5e0c5cd0fcbacd8094b7963a50a2e30e0846fJohn Reck createShadowTestData(&shadowData); 9982f5e0c5cd0fcbacd8094b7963a50a2e30e0846fJohn Reck SkPath path; 10082f5e0c5cd0fcbacd8094b7963a50a2e30e0846fJohn Reck path.reset(); 10182f5e0c5cd0fcbacd8094b7963a50a2e30e0846fJohn Reck path.addRoundRect(SkRect::MakeLTRB(0, 0, 100, 100), 5, 5); 10282f5e0c5cd0fcbacd8094b7963a50a2e30e0846fJohn Reck 1030418afa362630e69bd853121770b115750ee46a4John Reck while (state.KeepRunning()) { 10482f5e0c5cd0fcbacd8094b7963a50a2e30e0846fJohn Reck std::unique_ptr<VertexBuffer> ambient(new VertexBuffer); 10582f5e0c5cd0fcbacd8094b7963a50a2e30e0846fJohn Reck std::unique_ptr<VertexBuffer> spot(new VertexBuffer); 10682f5e0c5cd0fcbacd8094b7963a50a2e30e0846fJohn Reck tessellateShadows(shadowData, false, path, ambient.get(), spot.get()); 1070418afa362630e69bd853121770b115750ee46a4John Reck benchmark::DoNotOptimize(ambient.get()); 1080418afa362630e69bd853121770b115750ee46a4John Reck benchmark::DoNotOptimize(spot.get()); 10982f5e0c5cd0fcbacd8094b7963a50a2e30e0846fJohn Reck } 11082f5e0c5cd0fcbacd8094b7963a50a2e30e0846fJohn Reck} 1110418afa362630e69bd853121770b115750ee46a4John ReckBENCHMARK(BM_TessellateShadows_roundrect_translucent); 112