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