diff options
author | 2016-10-05 08:42:03 -0700 | |
---|---|---|
committer | 2016-10-05 08:42:03 -0700 | |
commit | c6618dd1dadeac8b47b81fbee108c42cca8ab166 (patch) | |
tree | 749fdc785cffc5639d0b6d1ba375d6b9904aae83 /tools/gpu/GpuTimer.h | |
parent | a86952a5ef9e757832a016506709ce4827b059ec (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
Committed: https://skia.googlesource.com/skia/+/c06720d06faab3b01eba1b8693e0ac791f06dc96
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..7678421ca6 --- /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 |