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 GrPendingProgramElement_DEFINED 9 #define GrPendingProgramElement_DEFINED 10 11 #include "SkRefCnt.h" 12 #include "GrTypes.h" 13 14 /** 15 * Helper for owning a pending execution on a GrProgramElement. Using this rather than ref allows 16 * resources that are owned by the program element to be correctly tracked as having pending reads 17 * and writes rather than refs. 18 */ 19 template <typename T> class GrPendingProgramElement : SkNoncopyable { 20 public: GrPendingProgramElement()21 GrPendingProgramElement() : fObj(nullptr) { }; 22 23 // Adds a pending execution on obj. GrPendingProgramElement(T * obj)24 explicit GrPendingProgramElement(T* obj) : fObj(obj) { 25 if (obj) { 26 obj->addPendingExecution(); 27 } 28 } 29 reset(T * obj)30 void reset(T* obj) { 31 if (obj) { 32 obj->addPendingExecution(); 33 } 34 if (fObj) { 35 fObj->completedExecution(); 36 } 37 fObj = obj; 38 } 39 get()40 T* get() const { return fObj; } 41 operator T*() { return fObj; } 42 43 T *operator->() const { return fObj; } 44 ~GrPendingProgramElement()45 ~GrPendingProgramElement() { 46 if (fObj) { 47 fObj->completedExecution(); 48 } 49 } 50 51 private: 52 T* fObj; 53 54 typedef SkNoncopyable INHERITED; 55 }; 56 #endif 57