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