1ae59b77612c42ff6b793dc33e3d115e6a5db34ccbsalomon/*
2ae59b77612c42ff6b793dc33e3d115e6a5db34ccbsalomon * Copyright 2014 Google Inc.
3ae59b77612c42ff6b793dc33e3d115e6a5db34ccbsalomon *
4ae59b77612c42ff6b793dc33e3d115e6a5db34ccbsalomon * Use of this source code is governed by a BSD-style license that can be
5ae59b77612c42ff6b793dc33e3d115e6a5db34ccbsalomon * found in the LICENSE file.
6ae59b77612c42ff6b793dc33e3d115e6a5db34ccbsalomon */
7ae59b77612c42ff6b793dc33e3d115e6a5db34ccbsalomon
8ae59b77612c42ff6b793dc33e3d115e6a5db34ccbsalomon#ifndef GrPendingProgramElement_DEFINED
9ae59b77612c42ff6b793dc33e3d115e6a5db34ccbsalomon#define GrPendingProgramElement_DEFINED
10ae59b77612c42ff6b793dc33e3d115e6a5db34ccbsalomon
11ae59b77612c42ff6b793dc33e3d115e6a5db34ccbsalomon#include "SkRefCnt.h"
12ae59b77612c42ff6b793dc33e3d115e6a5db34ccbsalomon#include "GrTypes.h"
13ae59b77612c42ff6b793dc33e3d115e6a5db34ccbsalomon
14ae59b77612c42ff6b793dc33e3d115e6a5db34ccbsalomon/**
15ae59b77612c42ff6b793dc33e3d115e6a5db34ccbsalomon * Helper for owning a pending execution on a GrProgramElement. Using this rather than ref allows
16ae59b77612c42ff6b793dc33e3d115e6a5db34ccbsalomon * resources that are owned by the program element to be correctly tracked as having pending reads
17ae59b77612c42ff6b793dc33e3d115e6a5db34ccbsalomon * and writes rather than refs.
18ae59b77612c42ff6b793dc33e3d115e6a5db34ccbsalomon */
19ae59b77612c42ff6b793dc33e3d115e6a5db34ccbsalomontemplate <typename T> class GrPendingProgramElement : SkNoncopyable {
20ae59b77612c42ff6b793dc33e3d115e6a5db34ccbsalomonpublic:
21fc6c37b981daeece7474ce61070c707c37eefa62Mike Klein    GrPendingProgramElement() : fObj(nullptr) { }
22ae59b77612c42ff6b793dc33e3d115e6a5db34ccbsalomon
23ae59b77612c42ff6b793dc33e3d115e6a5db34ccbsalomon    // Adds a pending execution on obj.
24ae59b77612c42ff6b793dc33e3d115e6a5db34ccbsalomon    explicit GrPendingProgramElement(T* obj) : fObj(obj)  {
25ae59b77612c42ff6b793dc33e3d115e6a5db34ccbsalomon        if (obj) {
26ae59b77612c42ff6b793dc33e3d115e6a5db34ccbsalomon            obj->addPendingExecution();
27ae59b77612c42ff6b793dc33e3d115e6a5db34ccbsalomon        }
28ae59b77612c42ff6b793dc33e3d115e6a5db34ccbsalomon    }
29ae59b77612c42ff6b793dc33e3d115e6a5db34ccbsalomon
30ae59b77612c42ff6b793dc33e3d115e6a5db34ccbsalomon    void reset(T* obj) {
31ae59b77612c42ff6b793dc33e3d115e6a5db34ccbsalomon        if (obj) {
32ae59b77612c42ff6b793dc33e3d115e6a5db34ccbsalomon            obj->addPendingExecution();
33ae59b77612c42ff6b793dc33e3d115e6a5db34ccbsalomon        }
34ae59b77612c42ff6b793dc33e3d115e6a5db34ccbsalomon        if (fObj) {
35ae59b77612c42ff6b793dc33e3d115e6a5db34ccbsalomon            fObj->completedExecution();
36ae59b77612c42ff6b793dc33e3d115e6a5db34ccbsalomon        }
37ae59b77612c42ff6b793dc33e3d115e6a5db34ccbsalomon        fObj = obj;
38ae59b77612c42ff6b793dc33e3d115e6a5db34ccbsalomon    }
39ae59b77612c42ff6b793dc33e3d115e6a5db34ccbsalomon
40ae59b77612c42ff6b793dc33e3d115e6a5db34ccbsalomon    T* get() const { return fObj; }
41ae59b77612c42ff6b793dc33e3d115e6a5db34ccbsalomon    operator T*() { return fObj; }
42ae59b77612c42ff6b793dc33e3d115e6a5db34ccbsalomon
43ae59b77612c42ff6b793dc33e3d115e6a5db34ccbsalomon    T *operator->() const { return fObj; }
44ae59b77612c42ff6b793dc33e3d115e6a5db34ccbsalomon
45ae59b77612c42ff6b793dc33e3d115e6a5db34ccbsalomon    ~GrPendingProgramElement() {
46ae59b77612c42ff6b793dc33e3d115e6a5db34ccbsalomon        if (fObj) {
47ae59b77612c42ff6b793dc33e3d115e6a5db34ccbsalomon            fObj->completedExecution();
48ae59b77612c42ff6b793dc33e3d115e6a5db34ccbsalomon        }
49ae59b77612c42ff6b793dc33e3d115e6a5db34ccbsalomon    }
50ae59b77612c42ff6b793dc33e3d115e6a5db34ccbsalomon
51ae59b77612c42ff6b793dc33e3d115e6a5db34ccbsalomonprivate:
52ae59b77612c42ff6b793dc33e3d115e6a5db34ccbsalomon    T*   fObj;
53ae59b77612c42ff6b793dc33e3d115e6a5db34ccbsalomon
54ae59b77612c42ff6b793dc33e3d115e6a5db34ccbsalomon    typedef SkNoncopyable INHERITED;
55ae59b77612c42ff6b793dc33e3d115e6a5db34ccbsalomon};
56ae59b77612c42ff6b793dc33e3d115e6a5db34ccbsalomon#endif
57