| Index: include/gpu/GrGpuResource.h
|
| diff --git a/include/gpu/GrGpuResource.h b/include/gpu/GrGpuResource.h
|
| index 8103959984b14ccf5a7fde91783b5a8120eda178..8539ba37bdd920dd5f25f85d56121cc16a2f82e2 100644
|
| --- a/include/gpu/GrGpuResource.h
|
| +++ b/include/gpu/GrGpuResource.h
|
| @@ -12,10 +12,22 @@
|
| #include "GrTypesPriv.h"
|
| #include "SkData.h"
|
|
|
| +#include "GrDrawContext.h"
|
| +
|
| class GrContext;
|
| +class GrDrawContext;
|
| class GrGpu;
|
| class GrResourceCache;
|
| class SkTraceMemoryDump;
|
| +class GrRenderTarget;
|
| +class GrSurface;
|
| +class GrDrawTarget;
|
| +class GrGpuResource;
|
| +
|
| +extern GrDrawTarget* getLastDT6(GrGpuResource* rt);
|
| +
|
| +// Due to header woes
|
| +extern void addRequiredDep(GrDrawTarget* dst, GrDrawTarget* src);
|
|
|
| /**
|
| * Base class for GrGpuResource. Handles the various types of refs we need. Separated out as a base
|
| @@ -94,7 +106,34 @@ protected:
|
| bool internalHasRef() const { return SkToBool(fRefCnt); }
|
|
|
| private:
|
| - void addPendingRead() const {
|
| + void addPendingRead(const DERIVED* dst) const {
|
| + const DERIVED* src = static_cast<const DERIVED*>(this);
|
| + if ((const_cast<DERIVED*>(src))->arrgh()) {
|
| + SkASSERT(dst);
|
| + SkASSERT((const_cast<DERIVED*>(dst))->arrgh());
|
| +
|
| + GrDrawTarget* dstDT = getLastDT6(const_cast<DERIVED*>(dst));
|
| + GrDrawTarget* srcDT = getLastDT6(const_cast<DERIVED*>(src));
|
| +
|
| + SkASSERT(dstDT || !srcDT);
|
| +
|
| + if (src->fromRawPixels2()) {
|
| + // adding a read on uploaded content
|
| + SkASSERT(!srcDT);
|
| + } else {
|
| + // adding a read on rendered content
|
| + if (srcDT) {
|
| + SkASSERT(dstDT);
|
| +
|
| + if (dstDT == srcDT) {
|
| + // self-read - presumably for dst reads
|
| + } else {
|
| + addRequiredDep(dstDT, srcDT);
|
| + }
|
| + }
|
| + }
|
| + }
|
| +
|
| this->validate();
|
| ++fPendingReads;
|
| }
|
| @@ -123,6 +162,7 @@ private:
|
| }
|
| }
|
|
|
| +public:
|
| mutable int32_t fRefCnt;
|
| mutable int32_t fPendingReads;
|
| mutable int32_t fPendingWrites;
|
| @@ -134,12 +174,59 @@ private:
|
| template <typename, GrIOType> friend class GrPendingIOResource;
|
| };
|
|
|
| +
|
| /**
|
| * Base class for objects that can be kept in the GrResourceCache.
|
| */
|
| class SK_API GrGpuResource : public GrIORef<GrGpuResource> {
|
| public:
|
| + enum Type2 {
|
| + kSurface,
|
| + kOther
|
| + };
|
|
|
| +public:
|
| +
|
| + Type2 type1() const { return fType1; }
|
| + virtual GrRenderTarget* arrgh() = 0;
|
| +
|
| +private:
|
| + // fFromRawPixels2, fException & fException2 are just for the alternate testing system
|
| + mutable bool fFromRawPixels2;
|
| + mutable bool fException; // there are often textures from raw data which do not have a key
|
| +public:
|
| + mutable bool fException2; // yuv textures have a key but have been rendered to
|
| + // as have CMM alpha masks
|
| +
|
| + void validate() const {
|
| + if (fException) {
|
| + SkASSERT(fFromRawPixels2);
|
| + }
|
| + if (!fFromRawPixels2) {
|
| + SkASSERT(!fException); // can't be an exception w/o being from raw pixels
|
| + }
|
| + }
|
| +
|
| + bool fromRawPixels2() const {
|
| + this->validate();
|
| + return fFromRawPixels2;
|
| + }
|
| +
|
| + void setFromRawPixels(bool fromRawPixels) const {
|
| + this->validate();
|
| +
|
| + fFromRawPixels2 = fromRawPixels;
|
| +
|
| + this->validate();
|
| + }
|
| +
|
| + bool exception() const { return fException; }
|
| +
|
| + void setException(bool exception) {
|
| + this->validate();
|
| + fException = exception;
|
| + this->validate();
|
| + }
|
|
|
| enum LifeCycle {
|
| /**
|
| @@ -265,7 +352,7 @@ protected:
|
| // initialized (i.e. not in a base class constructor).
|
| void registerWithCache();
|
|
|
| - GrGpuResource(GrGpu*, LifeCycle);
|
| + GrGpuResource(GrGpu*, LifeCycle, Type2);
|
| virtual ~GrGpuResource();
|
|
|
| GrGpu* getGpu() const { return fGpu; }
|
| @@ -346,6 +433,8 @@ private:
|
|
|
| SkAutoTUnref<const SkData> fData;
|
|
|
| + Type2 fType1;
|
| +
|
| typedef GrIORef<GrGpuResource> INHERITED;
|
| friend class GrIORef<GrGpuResource>; // to access notifyAllCntsAreZero and notifyRefCntIsZero.
|
| };
|
|
|