/*
 * Copyright 2016 Google Inc.
 *
 * Use of this source code is governed by a BSD-style license that can be
 * found in the LICENSE file.
 */

#ifndef GpuTimer_DEFINED
#define GpuTimer_DEFINED

#include "include/core/SkTypes.h"

#include <chrono>

namespace sk_gpu_test {

using PlatformTimerQuery = uint64_t;
static constexpr PlatformTimerQuery kInvalidTimerQuery = 0;

/**
 * Platform-independent interface for timing operations on the GPU.
 */
class GpuTimer {
public:
    GpuTimer(bool disjointSupport)
        : fDisjointSupport(disjointSupport)
        , fActiveTimer(kInvalidTimerQuery) {
    }
    virtual ~GpuTimer() { SkASSERT(!fActiveTimer); }

    /**
     * Returns whether this timer can detect disjoint GPU operations while timing. If false, a query
     * has less confidence when it completes with QueryStatus::kAccurate.
     */
    bool disjointSupport() const { return fDisjointSupport; }

    /**
     * Inserts a "start timing" command in the GPU command stream.
     */
    void queueStart() {
        SkASSERT(!fActiveTimer);
        fActiveTimer = this->onQueueTimerStart();
    }

    /**
     * Inserts a "stop timing" command in the GPU command stream.
     *
     * @return a query object that can retrieve the time elapsed once the timer has completed.
     */
    [[nodiscard]] PlatformTimerQuery queueStop() {
        SkASSERT(fActiveTimer);
        this->onQueueTimerStop(fActiveTimer);
        return std::exchange(fActiveTimer, kInvalidTimerQuery);
    }

    enum class QueryStatus {
        kInvalid,  //<! the timer query is invalid.
        kPending,  //<! the timer is still running on the GPU.
        kDisjoint, //<! the query is complete, but dubious due to disjoint GPU operations.
        kAccurate  //<! the query is complete and reliable.
    };

    virtual QueryStatus checkQueryStatus(PlatformTimerQuery) = 0;
    virtual std::chrono::nanoseconds getTimeElapsed(PlatformTimerQuery) = 0;
    virtual void deleteQuery(PlatformTimerQuery) = 0;

private:
    virtual PlatformTimerQuery onQueueTimerStart() const = 0;
    virtual void onQueueTimerStop(PlatformTimerQuery) const = 0;

    bool const           fDisjointSupport;
    PlatformTimerQuery   fActiveTimer;
};

}  // namespace sk_gpu_test

#endif
