/* * Copyright 2020 Google LLC * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #ifndef FlushFinishTracker_DEFINED #define FlushFinishTracker_DEFINED #include "include/core/SkRefCnt.h" #include "include/gpu/GpuTypes.h" #include class GrDirectContext; #if defined(SK_GRAPHITE) namespace skgpu::graphite { class Context; } #endif namespace sk_gpu_test { class FlushFinishTracker : public SkRefCnt { public: static void FlushFinished(void* finishedContext) { auto tracker = static_cast(finishedContext); tracker->setFinished(); tracker->unref(); } static void FlushFinishedResult(void* finishedContext, skgpu::CallbackResult) { FlushFinished(finishedContext); } FlushFinishTracker(GrDirectContext* context) : fContext(context) {} #if defined(SK_GRAPHITE) FlushFinishTracker(skgpu::graphite::Context* context) : fGraphiteContext(context) {} #endif void setFinished() { fIsFinished = true; } void waitTillFinished(std::function tick = {}); private: GrDirectContext* fContext = nullptr; #if defined(SK_GRAPHITE) skgpu::graphite::Context* fGraphiteContext = nullptr; #endif // Currently we don't have the this bool be atomic cause all current uses of this class happen // on a single thread. In other words we call flush, checkAsyncWorkCompletion, and // waitTillFinished all on the same thread. If we ever want to support the flushing and waiting // to happen on different threads then we should make this atomic. bool fIsFinished = false; }; } //namespace sk_gpu_test #endif