| Index: include/gpu/GrProgramElementRef.h
|
| diff --git a/include/gpu/GrProgramElementRef.h b/include/gpu/GrProgramElementRef.h
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..ea11f4446cd727b3c0b5e31a0712813869bb87fd
|
| --- /dev/null
|
| +++ b/include/gpu/GrProgramElementRef.h
|
| @@ -0,0 +1,73 @@
|
| +/*
|
| + * Copyright 2014 Google Inc.
|
| + *
|
| + * Use of this source code is governed by a BSD-style license that can be
|
| + * found in the LICENSE file.
|
| + */
|
| +
|
| +#ifndef GrProgramElementRef_DEFINED
|
| +#define GrProgramElementRef_DEFINED
|
| +
|
| +#include "SkRefCnt.h"
|
| +#include "GrTypes.h"
|
| +
|
| +/**
|
| + * Helper for owning a GrProgramElement subclass and being able to convert a ref to pending
|
| + * execution. It is like an SkAutoTUnref for program elements whose execution can be deferred. Once
|
| + * in the pending execution state it is illegal to change the object that is owned by the
|
| + * GrProgramElementRef. Its destructor will either unref the GrProgramElement or signal that
|
| + * the pending execution has completed, depending on whether convertToPendingExec() was called.
|
| + */
|
| +template <typename T> class GrProgramElementRef : SkNoncopyable {
|
| +public:
|
| + GrProgramElementRef() : fOwnPendingExec(false), fObj(NULL) {};
|
| +
|
| + // Adopts a ref from the caller.
|
| + explicit GrProgramElementRef(T* obj) : fOwnPendingExec(false), fObj(obj) {}
|
| +
|
| + // Adopts a ref from the caller. Do not call after convertToPendingExec.
|
| + void reset(T* obj) {
|
| + SkASSERT(!fOwnPendingExec);
|
| + SkSafeUnref(fObj);
|
| + fObj = obj;
|
| + }
|
| +
|
| + void convertToPendingExec() {
|
| + SkASSERT(!fOwnPendingExec);
|
| + fObj->convertRefToPendingExecution();
|
| + fOwnPendingExec = true;
|
| + }
|
| +
|
| + T* get() const { return fObj; }
|
| + operator T*() { return fObj; }
|
| +
|
| + /** If T is const, the type returned from operator-> will also be const. */
|
| + typedef typename SkTConstType<typename SkAutoTUnref<T>::BlockRef<T>,
|
| + SkTIsConst<T>::value>::type BlockRefType;
|
| +
|
| + /**
|
| + * GrProgramElementRef assumes ownership of the ref and manages converting the ref to a
|
| + * pending execution. As a result, it is an error for the user to ref or unref through
|
| + * GrProgramElementRef. Therefore operator-> returns BlockRef<T>*.
|
| + */
|
| + BlockRefType *operator->() const {
|
| + return static_cast<BlockRefType*>(fObj);
|
| + }
|
| +
|
| + ~GrProgramElementRef() {
|
| + if (NULL != fObj) {
|
| + if (fOwnPendingExec) {
|
| + fObj->completedExecution();
|
| + } else {
|
| + fObj->unref();
|
| + }
|
| + }
|
| + }
|
| +
|
| +private:
|
| + bool fOwnPendingExec;
|
| + T* fObj;
|
| +
|
| + typedef SkNoncopyable INHERITED;
|
| +};
|
| +#endif
|
|
|