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