|  | /* | 
|  | * Copyright 2020 Google LLC | 
|  | * | 
|  | * Use of this source code is governed by a BSD-style license that can be | 
|  | * found in the LICENSE file. | 
|  | */ | 
|  |  | 
|  | #include "bench/Benchmark.h" | 
|  | #include "src/base/SkRandom.h" | 
|  | #include "src/gpu/ganesh/geometry/GrQuad.h" | 
|  | #include "src/gpu/ganesh/geometry/GrQuadUtils.h" | 
|  |  | 
|  | class GrQuadBoundsBench : public Benchmark { | 
|  | public: | 
|  | GrQuadBoundsBench(bool perspective) | 
|  | : fPerspective(perspective) { | 
|  | fName.printf("grquad_bounds_%s", perspective ? "3d" : "2d"); | 
|  | } | 
|  |  | 
|  | bool isSuitableFor(Backend backend) override { | 
|  | return backend == Backend::kNonRendering; | 
|  | } | 
|  |  | 
|  | protected: | 
|  | inline static constexpr int kQuadCount = 1000; | 
|  |  | 
|  | const char* onGetName() override { | 
|  | return fName.c_str(); | 
|  | } | 
|  |  | 
|  | void onDelayedSetup() override { | 
|  | SkRandom r; | 
|  | for (int i = 0; i < kQuadCount; ++i) { | 
|  | for (int j = 0; j < 4; ++j) { | 
|  | fQuads[i].xs()[j] = r.nextRangeF(-100.f, 100.f); | 
|  | fQuads[i].ys()[j] = r.nextRangeF(-100.f, 100.f); | 
|  | if (fPerspective) { | 
|  | // Biased towards in front of the viewpoint, but do include some that require | 
|  | // the vertices to be clipped against w = 0. | 
|  | fQuads[i].ws()[j] = r.nextRangeF(-1.f, 10.f); | 
|  | } else { | 
|  | fQuads[i].ws()[j] = 1.f; | 
|  | } | 
|  | } | 
|  | fQuads[i].setQuadType(fPerspective ? GrQuad::Type::kPerspective | 
|  | : GrQuad::Type::kGeneral); | 
|  | } | 
|  | } | 
|  |  | 
|  | void onDraw(int loops, SkCanvas*) override { | 
|  | SkScalar area = 0.f; | 
|  | for (int i = 0; i < loops; ++i) { | 
|  | for (int j = 0; j < kQuadCount; ++j) { | 
|  | SkRect qb = fQuads[j].bounds(); | 
|  | area += qb.width() + qb.height(); | 
|  | } | 
|  | } | 
|  | // Must persist this calculation in order to prevent the compiler from optimizing the | 
|  | // loops away. | 
|  | fArea = area; | 
|  | } | 
|  |  | 
|  | SkString     fName; | 
|  | bool         fPerspective; | 
|  | GrQuad       fQuads[kQuadCount]; | 
|  | SkScalar     fArea; | 
|  |  | 
|  | using INHERITED = Benchmark; | 
|  | }; | 
|  |  | 
|  | /////////////////////////////////////////////////////////////////////////////////////////////////// | 
|  |  | 
|  | DEF_BENCH( return new GrQuadBoundsBench(/* persp */ false); ) | 
|  | DEF_BENCH( return new GrQuadBoundsBench(/* persp */ true); ) |