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