/*
 * 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 "include/utils/SkRandom.h"
#include "src/gpu/geometry/GrQuad.h"
#include "src/gpu/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 == kNonRendering_Backend;
    }

protected:
    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); )
