Home | History | Annotate | Download | only in gpu
      1 /*
      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  */
     19 template <typename T> class GrPendingProgramElement : SkNoncopyable {
     20 public:
     21     GrPendingProgramElement() : fObj(nullptr) { }
     22 
     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 
     51 private:
     52     T*   fObj;
     53 
     54     typedef SkNoncopyable INHERITED;
     55 };
     56 #endif
     57