| Index: tools/gpu/GpuTimer.h
|
| diff --git a/tools/gpu/GpuTimer.h b/tools/gpu/GpuTimer.h
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..7678421ca6f5db2e246eb4c23b4e0ec2f67a3848
|
| --- /dev/null
|
| +++ b/tools/gpu/GpuTimer.h
|
| @@ -0,0 +1,77 @@
|
| +/*
|
| + * 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 "SkTypes.h"
|
| +#include "SkExchange.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.
|
| + */
|
| + PlatformTimerQuery SK_WARN_UNUSED_RESULT queueStop() {
|
| + SkASSERT(fActiveTimer);
|
| + this->onQueueTimerStop(fActiveTimer);
|
| + return skstd::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
|
|
|