GrPendingProgramElement.h revision fe17456d5e528078ce69b5f15cf7adf1fab963f9
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 */
19template <typename T> class GrPendingProgramElement : SkNoncopyable {
20public:
21    GrPendingProgramElement() : fObj(nullptr) { }
22
23    // Adds a pending execution on obj.
24    explicit GrPendingProgramElement(T* obj) : fObj(obj)  {
25        if (obj) {
26            obj->addPendingExecution();
27        }
28    }
29
30    void reset(T* obj) {
31        if (obj) {
32            obj->addPendingExecution();
33        }
34        if (fObj) {
35            fObj->completedExecution();
36        }
37        fObj = obj;
38    }
39
40    T* get() const { return fObj; }
41    operator T*() { return fObj; }
42
43    T *operator->() const { return fObj; }
44
45    ~GrPendingProgramElement() {
46        if (fObj) {
47            fObj->completedExecution();
48        }
49    }
50
51private:
52    T*   fObj;
53
54    typedef SkNoncopyable INHERITED;
55};
56#endif
57