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