blob: ab1f4378930ed7fe4304f7c890a745779505af84 [file] [log] [blame]
bsalomonae59b772014-11-19 08:23:49 -08001/*
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:
Mike Kleinfc6c37b2016-09-27 09:34:10 -040021 GrPendingProgramElement() : fObj(nullptr) { }
bsalomonae59b772014-11-19 08:23:49 -080022
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