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