| /* |
| * 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 |