/* * 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 "src/core/SkExchange.h" #include 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, //