| Index: include/gpu/GrGpuResourceRef.h
|
| diff --git a/include/gpu/GrGpuResourceRef.h b/include/gpu/GrGpuResourceRef.h
|
| index 28299f2b111f9c022b35da1c1b3a391ead7c8fcf..d178908f93b2250291352f1654220aa2c2a4293c 100644
|
| --- a/include/gpu/GrGpuResourceRef.h
|
| +++ b/include/gpu/GrGpuResourceRef.h
|
| @@ -13,9 +13,25 @@
|
| class GrGpuResource;
|
|
|
| /**
|
| + * This class is intended only for internal use in core Gr code.
|
| + *
|
| * Class that wraps a resource referenced by a GrProgramElement or GrDrawState. It manages
|
| - * converting refs to pending io operations. Like SkAutoTUnref, its constructor and setter adopt
|
| - * a ref from their caller. This class is intended only for internal use in core Gr code.
|
| + * converting refs to pending IO operations. It allows a resource ownership to be in three
|
| + * states:
|
| + * 1. Owns a single ref
|
| + * 2. Owns a single ref and a pending IO operation (read, write, or read-write)
|
| + * 3. Owns a single pending IO operation.
|
| + *
|
| + * It is legal to destroy the GrGpuResourceRef in any of these states. It starts in state
|
| + * 1. Calling markPendingIO() converts it from state 1 to state 2. Calling removeRef() goes from
|
| + * state 2 to state 3. Calling pendingIOComplete() moves from state 2 to state 1. There is no
|
| + * valid way of going from state 3 back to 2 or 1.
|
| + *
|
| + * Like SkAutoTUnref, its constructor and setter adopt a ref from their caller.
|
| + *
|
| + * TODO: Once GrDODrawState no longer exists and therefore GrDrawState and GrOptDrawState no
|
| + * longer share an instance of this class, attempt to make the resource owned by GrGpuResourceRef
|
| + * only settable via the constructor.
|
| */
|
| class GrGpuResourceRef : SkNoncopyable {
|
| public:
|
| @@ -53,18 +69,19 @@ protected:
|
|
|
| private:
|
| /** Called by owning GrProgramElement when the program element is first scheduled for
|
| - execution. */
|
| + execution. It can only be called once. */
|
| void markPendingIO() const;
|
|
|
| /** Called when the program element/draw state is no longer owned by GrDrawTarget-client code.
|
| This lets the cache know that the drawing code will no longer schedule additional reads or
|
| - writes to the resource using the program element or draw state. */
|
| + writes to the resource using the program element or draw state. It can only be called once.
|
| + */
|
| void removeRef() const;
|
|
|
| /** Called to indicate that the previous pending IO is complete. Useful when the owning object
|
| still has refs, so it is not about to destroy this GrGpuResourceRef, but its previously
|
| - pending executions have been complete.
|
| - */
|
| + pending executions have been complete. Can only be called if removeRef() was not previously
|
| + called. */
|
| void pendingIOComplete() const;
|
|
|
| friend class GrRODrawState;
|
| @@ -78,6 +95,9 @@ private:
|
| typedef SkNoncopyable INHERITED;
|
| };
|
|
|
| +/**
|
| + * Templated version of GrGpuResourceRef to enforce type safety.
|
| + */
|
| template <typename T> class GrTGpuResourceRef : public GrGpuResourceRef {
|
| public:
|
| GrTGpuResourceRef() {}
|
| @@ -96,5 +116,57 @@ private:
|
| typedef GrGpuResourceRef INHERITED;
|
| };
|
|
|
| +/**
|
| + * This is similar to GrTGpuResourceRef but can only be in the pending IO state. It never owns a
|
| + * ref.
|
| + */
|
| +template <typename T> class GrPendingIOResource : SkNoncopyable {
|
| +public:
|
| + typedef GrGpuResourceRef::IOType IOType;
|
| + GrPendingIOResource(T* resource, IOType ioType) : fResource(resource), fIOType(ioType) {
|
| + if (NULL != fResource) {
|
| + switch (fIOType) {
|
| + case GrGpuResourceRef::kNone_IOType:
|
| + SkFAIL("GrPendingIOResource with neither reads nor writes?");
|
| + break;
|
| + case GrGpuResourceRef::kRead_IOType:
|
| + fResource->addPendingRead();
|
| + break;
|
| + case GrGpuResourceRef::kWrite_IOType:
|
| + fResource->addPendingWrite();
|
| + break;
|
| + case GrGpuResourceRef::kRW_IOType:
|
| + fResource->addPendingRead();
|
| + fResource->addPendingWrite();
|
| + break;
|
| + }
|
| + }
|
| + }
|
| +
|
| + ~GrPendingIOResource() {
|
| + if (NULL != fResource) {
|
| + switch (fIOType) {
|
| + case GrGpuResourceRef::kNone_IOType:
|
| + SkFAIL("GrPendingIOResource with neither reads nor writes?");
|
| + break;
|
| + case GrGpuResourceRef::kRead_IOType:
|
| + fResource->completedRead();
|
| + break;
|
| + case GrGpuResourceRef::kWrite_IOType:
|
| + fResource->completedWrite();
|
| + break;
|
| + case GrGpuResourceRef::kRW_IOType:
|
| + fResource->completedRead();
|
| + fResource->completedWrite();
|
| + break;
|
| + }
|
| + }
|
| + }
|
| +
|
| + T* get() const { return fResource; }
|
|
|
| +private:
|
| + T* fResource;
|
| + IOType fIOType;
|
| +};
|
| #endif
|
|
|