diff options
author | 2016-10-04 12:33:44 -0700 | |
---|---|---|
committer | 2016-10-04 12:33:44 -0700 | |
commit | c06720d06faab3b01eba1b8693e0ac791f06dc96 (patch) | |
tree | 65e68119ef1d128aeb4bff876c8ae814306c3a81 /tools/gpu/GpuTimer.h | |
parent | b3f543d955637c6e10d7109554b5a46c6e25291a (diff) |
skpbench: add option for gpu timing
Adds a gpu timing option with a GL implementation.
BUG=skia:
GOLD_TRYBOT_URL= https://gold.skia.org/search?issue=2388433003
Review-Url: https://codereview.chromium.org/2388433003
Diffstat (limited to 'tools/gpu/GpuTimer.h')
-rw-r--r-- | tools/gpu/GpuTimer.h | 77 |
1 files changed, 77 insertions, 0 deletions
diff --git a/tools/gpu/GpuTimer.h b/tools/gpu/GpuTimer.h new file mode 100644 index 0000000000..d9e320e0a0 --- /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 = intptr_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 |