1cb93a386Sopenharmony_ci/* 2cb93a386Sopenharmony_ci * Copyright 2020 Google LLC 3cb93a386Sopenharmony_ci * 4cb93a386Sopenharmony_ci * Use of this source code is governed by a BSD-style license that can be 5cb93a386Sopenharmony_ci * found in the LICENSE file. 6cb93a386Sopenharmony_ci */ 7cb93a386Sopenharmony_ci 8cb93a386Sopenharmony_ci#include "bench/Benchmark.h" 9cb93a386Sopenharmony_ci#include "include/utils/SkRandom.h" 10cb93a386Sopenharmony_ci#include "src/gpu/geometry/GrQuad.h" 11cb93a386Sopenharmony_ci#include "src/gpu/geometry/GrQuadUtils.h" 12cb93a386Sopenharmony_ci 13cb93a386Sopenharmony_ciclass GrQuadBoundsBench : public Benchmark { 14cb93a386Sopenharmony_cipublic: 15cb93a386Sopenharmony_ci GrQuadBoundsBench(bool perspective) 16cb93a386Sopenharmony_ci : fPerspective(perspective) { 17cb93a386Sopenharmony_ci fName.printf("grquad_bounds_%s", perspective ? "3d" : "2d"); 18cb93a386Sopenharmony_ci } 19cb93a386Sopenharmony_ci 20cb93a386Sopenharmony_ci bool isSuitableFor(Backend backend) override { 21cb93a386Sopenharmony_ci return backend == kNonRendering_Backend; 22cb93a386Sopenharmony_ci } 23cb93a386Sopenharmony_ci 24cb93a386Sopenharmony_ciprotected: 25cb93a386Sopenharmony_ci inline static constexpr int kQuadCount = 1000; 26cb93a386Sopenharmony_ci 27cb93a386Sopenharmony_ci const char* onGetName() override { 28cb93a386Sopenharmony_ci return fName.c_str(); 29cb93a386Sopenharmony_ci } 30cb93a386Sopenharmony_ci 31cb93a386Sopenharmony_ci void onDelayedSetup() override { 32cb93a386Sopenharmony_ci SkRandom r; 33cb93a386Sopenharmony_ci for (int i = 0; i < kQuadCount; ++i) { 34cb93a386Sopenharmony_ci for (int j = 0; j < 4; ++j) { 35cb93a386Sopenharmony_ci fQuads[i].xs()[j] = r.nextRangeF(-100.f, 100.f); 36cb93a386Sopenharmony_ci fQuads[i].ys()[j] = r.nextRangeF(-100.f, 100.f); 37cb93a386Sopenharmony_ci if (fPerspective) { 38cb93a386Sopenharmony_ci // Biased towards in front of the viewpoint, but do include some that require 39cb93a386Sopenharmony_ci // the vertices to be clipped against w = 0. 40cb93a386Sopenharmony_ci fQuads[i].ws()[j] = r.nextRangeF(-1.f, 10.f); 41cb93a386Sopenharmony_ci } else { 42cb93a386Sopenharmony_ci fQuads[i].ws()[j] = 1.f; 43cb93a386Sopenharmony_ci } 44cb93a386Sopenharmony_ci } 45cb93a386Sopenharmony_ci fQuads[i].setQuadType(fPerspective ? GrQuad::Type::kPerspective 46cb93a386Sopenharmony_ci : GrQuad::Type::kGeneral); 47cb93a386Sopenharmony_ci } 48cb93a386Sopenharmony_ci } 49cb93a386Sopenharmony_ci 50cb93a386Sopenharmony_ci void onDraw(int loops, SkCanvas*) override { 51cb93a386Sopenharmony_ci SkScalar area = 0.f; 52cb93a386Sopenharmony_ci for (int i = 0; i < loops; ++i) { 53cb93a386Sopenharmony_ci for (int j = 0; j < kQuadCount; ++j) { 54cb93a386Sopenharmony_ci SkRect qb = fQuads[j].bounds(); 55cb93a386Sopenharmony_ci area += qb.width() + qb.height(); 56cb93a386Sopenharmony_ci } 57cb93a386Sopenharmony_ci } 58cb93a386Sopenharmony_ci // Must persist this calculation in order to prevent the compiler from optimizing the 59cb93a386Sopenharmony_ci // loops away. 60cb93a386Sopenharmony_ci fArea = area; 61cb93a386Sopenharmony_ci } 62cb93a386Sopenharmony_ci 63cb93a386Sopenharmony_ci SkString fName; 64cb93a386Sopenharmony_ci bool fPerspective; 65cb93a386Sopenharmony_ci GrQuad fQuads[kQuadCount]; 66cb93a386Sopenharmony_ci SkScalar fArea; 67cb93a386Sopenharmony_ci 68cb93a386Sopenharmony_ci using INHERITED = Benchmark; 69cb93a386Sopenharmony_ci}; 70cb93a386Sopenharmony_ci 71cb93a386Sopenharmony_ci/////////////////////////////////////////////////////////////////////////////////////////////////// 72cb93a386Sopenharmony_ci 73cb93a386Sopenharmony_ciDEF_BENCH( return new GrQuadBoundsBench(/* persp */ false); ) 74cb93a386Sopenharmony_ciDEF_BENCH( return new GrQuadBoundsBench(/* persp */ true); ) 75