/* * Copyright 2014 Google Inc. * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #ifndef GrPendingIOResource_DEFINED #define GrPendingIOResource_DEFINED #include "GrGpuResource.h" #include "SkNoncopyable.h" #include "SkRefCnt.h" /** * Helper for owning a pending read, write, read-write on a GrGpuResource. It never owns a regular * ref. */ template class GrPendingIOResource : SkNoncopyable { public: GrPendingIOResource(T* resource = nullptr) : fResource(nullptr) { this->reset(resource); } GrPendingIOResource(const GrPendingIOResource& that) : GrPendingIOResource(that.get()) {} void reset(T* resource = nullptr) { if (resource) { switch (IO_TYPE) { case kRead_GrIOType: resource->addPendingRead(); break; case kWrite_GrIOType: resource->addPendingWrite(); break; case kRW_GrIOType: resource->addPendingRead(); resource->addPendingWrite(); break; } } this->release(); fResource = resource; } ~GrPendingIOResource() { this->release(); } explicit operator bool() const { return SkToBool(fResource); } bool operator==(const GrPendingIOResource& other) const { return fResource == other.fResource; } T* get() const { return fResource; } private: void release() { if (fResource) { switch (IO_TYPE) { case kRead_GrIOType: fResource->completedRead(); break; case kWrite_GrIOType: fResource->completedWrite(); break; case kRW_GrIOType: fResource->completedRead(); fResource->completedWrite(); break; } } } T* fResource; }; #endif