| /* | |
| * 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 GrPendingProgramElement_DEFINED | |
| #define GrPendingProgramElement_DEFINED | |
| #include "SkRefCnt.h" | |
| #include "GrTypes.h" | |
| /** | |
| * Helper for owning a pending execution on a GrProgramElement. Using this rather than ref allows | |
| * resources that are owned by the program element to be correctly tracked as having pending reads | |
| * and writes rather than refs. | |
| */ | |
| template <typename T> class GrPendingProgramElement : SkNoncopyable { | |
| public: | |
| GrPendingProgramElement() : fObj(nullptr) { }; | |
| // Adds a pending execution on obj. | |
| explicit GrPendingProgramElement(T* obj) : fObj(obj) { | |
| if (obj) { | |
| obj->addPendingExecution(); | |
| } | |
| } | |
| void reset(T* obj) { | |
| if (obj) { | |
| obj->addPendingExecution(); | |
| } | |
| if (fObj) { | |
| fObj->completedExecution(); | |
| } | |
| fObj = obj; | |
| } | |
| T* get() const { return fObj; } | |
| operator T*() { return fObj; } | |
| T *operator->() const { return fObj; } | |
| ~GrPendingProgramElement() { | |
| if (fObj) { | |
| fObj->completedExecution(); | |
| } | |
| } | |
| private: | |
| T* fObj; | |
| typedef SkNoncopyable INHERITED; | |
| }; | |
| #endif |