1 /* 2 * Copyright 2014 Google Inc. 3 * 4 * Use of this source code is governed by a BSD-style license that can be 5 * found in the LICENSE file. 6 */ 7 8 #ifndef GrPendingIOResource_DEFINED 9 #define GrPendingIOResource_DEFINED 10 11 #include "GrGpuResource.h" 12 #include "SkNoncopyable.h" 13 #include "SkRefCnt.h" 14 15 /** 16 * Helper for owning a pending read, write, read-write on a GrGpuResource. It never owns a regular 17 * ref. 18 */ 19 template <typename T, GrIOType IO_TYPE> 20 class GrPendingIOResource : SkNoncopyable { 21 public: 22 GrPendingIOResource() = default; 23 explicit GrPendingIOResource(T* resource) { this->reset(resource); } 24 GrPendingIOResource(sk_sp<T> resource) { *this = std::move(resource); } 25 GrPendingIOResource(const GrPendingIOResource& that) : GrPendingIOResource(that.get()) {} 26 ~GrPendingIOResource() { this->release(); } 27 28 GrPendingIOResource& operator=(sk_sp<T> resource) { 29 this->reset(resource.get()); 30 return *this; 31 } 32 33 void reset(T* resource = nullptr) { 34 if (resource) { 35 switch (IO_TYPE) { 36 case kRead_GrIOType: 37 resource->addPendingRead(); 38 break; 39 case kWrite_GrIOType: 40 resource->addPendingWrite(); 41 break; 42 case kRW_GrIOType: 43 resource->addPendingRead(); 44 resource->addPendingWrite(); 45 break; 46 } 47 } 48 this->release(); 49 fResource = resource; 50 } 51 52 explicit operator bool() const { return SkToBool(fResource); } 53 54 bool operator==(const GrPendingIOResource& other) const { return fResource == other.fResource; } 55 56 T* get() const { return fResource; } 57 58 private: 59 void release() { 60 if (fResource) { 61 switch (IO_TYPE) { 62 case kRead_GrIOType: 63 fResource->completedRead(); 64 break; 65 case kWrite_GrIOType: 66 fResource->completedWrite(); 67 break; 68 case kRW_GrIOType: 69 fResource->completedRead(); 70 fResource->completedWrite(); 71 break; 72 } 73 } 74 } 75 76 T* fResource = nullptr; 77 }; 78 79 #endif 80