*
* The latter two ref types are private and intended only for Gr core code.
*/
-class GrGpuRef : public SkNoncopyable {
+class GrIORef : public SkNoncopyable {
public:
- SK_DECLARE_INST_COUNT_ROOT(GrGpuRef)
+ SK_DECLARE_INST_COUNT_ROOT(GrIORef)
- virtual ~GrGpuRef();
+ enum IOType {
+ kRead_IOType,
+ kWrite_IOType,
+ kRW_IOType
+ };
+
+ virtual ~GrIORef();
// Some of the signatures are written to mirror SkRefCnt so that GrGpuResource can work with
// templated helper classes (e.g. SkAutoTUnref). However, we have different categories of
}
protected:
- GrGpuRef() : fRefCnt(1), fPendingReads(0), fPendingWrites(0) {}
+ GrIORef() : fRefCnt(1), fPendingReads(0), fPendingWrites(0) {}
private:
void addPendingRead() const {
// This class is used to manage conversion of refs to pending reads/writes.
friend class GrGpuResourceRef;
- template <typename T> friend class GrPendingIOResource;
+ template <typename, IOType> friend class GrPendingIOResource;
};
/**
* Base class for objects that can be kept in the GrResourceCache.
*/
-class GrGpuResource : public GrGpuRef {
+class GrGpuResource : public GrIORef {
public:
SK_DECLARE_INST_COUNT(GrGpuResource)
GrResourceKey fScratchKey;
- typedef GrGpuRef INHERITED;
+ typedef GrIORef INHERITED;
};
#endif
#ifndef GrGpuResourceRef_DEFINED
#define GrGpuResourceRef_DEFINED
+#include "GrGpuResource.h"
#include "SkRefCnt.h"
-class GrGpuResource;
-
/**
* This class is intended only for internal use in core Gr code.
*
public:
SK_DECLARE_INST_COUNT_ROOT(GrGpuResourceRef);
- enum IOType {
- kRead_IOType,
- kWrite_IOType,
- kRW_IOType,
-
- kNone_IOType, // For internal use only, don't specify to constructor or setResource().
- };
-
~GrGpuResourceRef();
GrGpuResource* getResource() const { return fResource; }
/** Adopts a ref from the caller. ioType expresses what type of IO operations will be marked as
pending on the resource when markPendingIO is called. */
- GrGpuResourceRef(GrGpuResource*, IOType);
+ GrGpuResourceRef(GrGpuResource*, GrIORef::IOType);
/** Adopts a ref from the caller. ioType expresses what type of IO operations will be marked as
pending on the resource when markPendingIO is called. */
- void setResource(GrGpuResource*, IOType);
+ void setResource(GrGpuResource*, GrIORef::IOType);
private:
/** Called by owning GrProgramElement when the program element is first scheduled for
GrGpuResource* fResource;
mutable bool fOwnRef;
mutable bool fPendingIO;
- IOType fIOType;
+ GrIORef::IOType fIOType;
typedef SkNoncopyable INHERITED;
};
/** Adopts a ref from the caller. ioType expresses what type of IO operations will be marked as
pending on the resource when markPendingIO is called. */
- GrTGpuResourceRef(T* resource, IOType ioType) : INHERITED(resource, ioType) {}
+ GrTGpuResourceRef(T* resource, GrIORef::IOType ioType) : INHERITED(resource, ioType) {}
T* get() const { return static_cast<T*>(this->getResource()); }
/** Adopts a ref from the caller. ioType expresses what type of IO operations will be marked as
pending on the resource when markPendingIO is called. */
- void set(T* resource, IOType ioType) { this->setResource(resource, ioType); }
+ void set(T* resource, GrIORef::IOType ioType) { this->setResource(resource, ioType); }
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 {
+template <typename T, GrIORef::IOType IO_TYPE> class GrPendingIOResource : SkNoncopyable {
public:
- typedef GrGpuResourceRef::IOType IOType;
- GrPendingIOResource(T* resource, IOType ioType) : fResource(resource), fIOType(ioType) {
+ GrPendingIOResource(T* resource) : fResource(resource) {
if (NULL != fResource) {
- switch (fIOType) {
- case GrGpuResourceRef::kNone_IOType:
- SkFAIL("GrPendingIOResource with neither reads nor writes?");
- break;
- case GrGpuResourceRef::kRead_IOType:
+ switch (IO_TYPE) {
+ case GrIORef::kRead_IOType:
fResource->addPendingRead();
break;
- case GrGpuResourceRef::kWrite_IOType:
+ case GrIORef::kWrite_IOType:
fResource->addPendingWrite();
break;
- case GrGpuResourceRef::kRW_IOType:
+ case GrIORef::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:
+ switch (IO_TYPE) {
+ case GrIORef::kRead_IOType:
fResource->completedRead();
break;
- case GrGpuResourceRef::kWrite_IOType:
+ case GrIORef::kWrite_IOType:
fResource->completedWrite();
break;
- case GrGpuResourceRef::kRW_IOType:
+ case GrIORef::kRW_IOType:
fResource->completedRead();
fResource->completedWrite();
break;
private:
T* fResource;
- IOType fIOType;
};
#endif
* @param target The render target to set.
*/
void setRenderTarget(GrRenderTarget* target) {
- fRenderTarget.set(SkSafeRef(target), GrGpuResourceRef::kWrite_IOType);
+ fRenderTarget.set(SkSafeRef(target), GrIORef::kWrite_IOType);
this->invalidateOptState();
}
#include "GrResourceCache2.h"
#include "GrGpu.h"
-GrGpuRef::~GrGpuRef() {
+GrIORef::~GrIORef() {
SkASSERT(0 == fRefCnt);
SkASSERT(0 == fPendingReads);
SkASSERT(0 == fPendingWrites);
*/
#include "GrGpuResourceRef.h"
-#include "GrGpuResource.h"
GrGpuResourceRef::GrGpuResourceRef() {
fResource = NULL;
fOwnRef = false;
fPendingIO = false;
- fIOType = kNone_IOType;
}
-GrGpuResourceRef::GrGpuResourceRef(GrGpuResource* resource, IOType ioType) {
+GrGpuResourceRef::GrGpuResourceRef(GrGpuResource* resource, GrIORef::IOType ioType) {
fResource = NULL;
fOwnRef = false;
fPendingIO = false;
}
if (fPendingIO) {
switch (fIOType) {
- case kNone_IOType:
- SkFAIL("Shouldn't get here if fIOType is kNone.");
- break;
- case kRead_IOType:
+ case GrIORef::kRead_IOType:
fResource->completedRead();
break;
- case kWrite_IOType:
+ case GrIORef::kWrite_IOType:
fResource->completedWrite();
break;
- case kRW_IOType:
+ case GrIORef::kRW_IOType:
fResource->completedRead();
fResource->completedWrite();
break;
fResource->unref();
fOwnRef = false;
fResource = NULL;
- fIOType = kNone_IOType;
}
}
-void GrGpuResourceRef::setResource(GrGpuResource* resource, IOType ioType) {
+void GrGpuResourceRef::setResource(GrGpuResource* resource, GrIORef::IOType ioType) {
SkASSERT(!fPendingIO);
SkASSERT(SkToBool(fResource) == fOwnRef);
SkSafeUnref(fResource);
if (NULL == resource) {
fResource = NULL;
fOwnRef = false;
- fIOType = kNone_IOType;
} else {
- SkASSERT(kNone_IOType != ioType);
fResource = resource;
fOwnRef = true;
fIOType = ioType;
SkASSERT(fResource);
fPendingIO = true;
switch (fIOType) {
- case kNone_IOType:
- SkFAIL("GrGpuResourceRef with neither reads nor writes?");
- break;
- case kRead_IOType:
+ case GrIORef::kRead_IOType:
fResource->addPendingRead();
break;
- case kWrite_IOType:
+ case GrIORef::kWrite_IOType:
fResource->addPendingWrite();
break;
- case kRW_IOType:
+ case GrIORef::kRW_IOType:
fResource->addPendingRead();
fResource->addPendingWrite();
break;
SkASSERT(fOwnRef);
SkASSERT(fPendingIO);
switch (fIOType) {
- case kNone_IOType:
- SkFAIL("GrGpuResourceRef with neither reads nor writes?");
- break;
- case kRead_IOType:
+ case GrIORef::kRead_IOType:
fResource->completedRead();
break;
- case kWrite_IOType:
+ case GrIORef::kWrite_IOType:
fResource->completedWrite();
break;
- case kRW_IOType:
+ case GrIORef::kRW_IOType:
fResource->completedRead();
fResource->completedWrite();
break;
// there is a pending execution.
SkASSERT(fOwnRef);
SkASSERT(fPendingIO);
- SkASSERT(kNone_IOType != fIOType);
SkASSERT(fResource);
fResource->unref();
fOwnRef = false;
public:
Draw(const DrawInfo& info, const GrVertexBuffer* vb, const GrIndexBuffer* ib)
: DrawInfo(info)
- , fVertexBuffer(vb, GrGpuResourceRef::kRead_IOType)
- , fIndexBuffer(ib, GrGpuResourceRef::kRead_IOType) {}
+ , fVertexBuffer(vb)
+ , fIndexBuffer(ib) {}
const GrVertexBuffer* vertexBuffer() const { return fVertexBuffer.get(); }
const GrIndexBuffer* indexBuffer() const { return fIndexBuffer.get(); }
private:
- GrPendingIOResource<const GrVertexBuffer> fVertexBuffer;
- GrPendingIOResource<const GrIndexBuffer> fIndexBuffer;
+ GrPendingIOResource<const GrVertexBuffer, GrIORef::kRead_IOType> fVertexBuffer;
+ GrPendingIOResource<const GrIndexBuffer, GrIORef::kRead_IOType> fIndexBuffer;
};
struct StencilPath : public ::SkNoncopyable {
- StencilPath(const GrPath* path) : fPath(path, GrGpuResourceRef::kRead_IOType) {}
+ StencilPath(const GrPath* path) : fPath(path) {}
const GrPath* path() const { return fPath.get(); }
SkPath::FillType fFill;
private:
- GrPendingIOResource<const GrPath> fPath;
+ GrPendingIOResource<const GrPath, GrIORef::kRead_IOType> fPath;
};
struct DrawPath : public ::SkNoncopyable {
- DrawPath(const GrPath* path) : fPath(path, GrGpuResourceRef::kRead_IOType) {}
+ DrawPath(const GrPath* path) : fPath(path) {}
const GrPath* path() const { return fPath.get(); }
GrDeviceCoordTexture fDstCopy;
private:
- GrPendingIOResource<const GrPath> fPath;
+ GrPendingIOResource<const GrPath, GrIORef::kRead_IOType> fPath;
};
struct DrawPaths : public ::SkNoncopyable {
DrawPaths(const GrPathRange* pathRange)
- : fPathRange(pathRange, GrGpuResourceRef::kRead_IOType) {}
+ : fPathRange(pathRange) {}
~DrawPaths() {
if (fTransforms) {
GrDeviceCoordTexture fDstCopy;
private:
- GrPendingIOResource<const GrPathRange> fPathRange;
+ GrPendingIOResource<const GrPathRange, GrIORef::kRead_IOType> fPathRange;
};
// This is also used to record a discard by setting the color to GrColor_ILLEGAL
struct Clear : public ::SkNoncopyable {
- Clear(GrRenderTarget* rt) : fRenderTarget(rt, GrGpuResourceRef::kWrite_IOType) {}
+ Clear(GrRenderTarget* rt) : fRenderTarget(rt) {}
~Clear() { }
GrRenderTarget* renderTarget() const { return fRenderTarget.get(); }
bool fCanIgnoreRect;
private:
- GrPendingIOResource<GrRenderTarget> fRenderTarget;
+ GrPendingIOResource<GrRenderTarget, GrIORef::kWrite_IOType> fRenderTarget;
};
struct CopySurface : public ::SkNoncopyable {
- CopySurface(GrSurface* dst, GrSurface* src)
- : fDst(dst, GrGpuResourceRef::kWrite_IOType)
- , fSrc(src, GrGpuResourceRef::kRead_IOType) {}
+ CopySurface(GrSurface* dst, GrSurface* src) : fDst(dst), fSrc(src) {}
GrSurface* dst() const { return fDst.get(); }
GrSurface* src() const { return fSrc.get(); }
SkIRect fSrcRect;
private:
- GrPendingIOResource<GrSurface> fDst;
- GrPendingIOResource<GrSurface> fSrc;
+ GrPendingIOResource<GrSurface, GrIORef::kWrite_IOType> fDst;
+ GrPendingIOResource<GrSurface, GrIORef::kRead_IOType> fSrc;
};
struct Clip : public ::SkNoncopyable {
GrRODrawState::GrRODrawState(const GrRODrawState& drawState) : INHERITED() {
fRenderTarget.setResource(SkSafeRef(drawState.fRenderTarget.getResource()),
- GrGpuResourceRef::kWrite_IOType);
+ GrIORef::kWrite_IOType);
}
bool GrRODrawState::isEqual(const GrRODrawState& that) const {
SkASSERT(strlen(swizzle) >= 1 && strlen(swizzle) <= 4);
fParams = params;
- fTexture.set(SkRef(texture), GrGpuResourceRef::kRead_IOType);
+ fTexture.set(SkRef(texture), GrIORef::kRead_IOType);
this->setSwizzle(swizzle);
}
SkASSERT(strlen(swizzle) >= 1 && strlen(swizzle) <= 4);
fParams.reset(tileXAndY, filterMode);
- fTexture.set(SkRef(texture), GrGpuResourceRef::kRead_IOType);
+ fTexture.set(SkRef(texture), GrIORef::kRead_IOType);
this->setSwizzle(swizzle);
}
void GrTextureAccess::reset(GrTexture* texture,
const GrTextureParams& params) {
SkASSERT(texture);
- fTexture.set(SkRef(texture), GrGpuResourceRef::kRead_IOType);
+ fTexture.set(SkRef(texture), GrIORef::kRead_IOType);
fParams = params;
memcpy(fSwizzle, "rgba", 5);
fSwizzleMask = kRGBA_GrColorComponentFlags;
GrTextureParams::FilterMode filterMode,
SkShader::TileMode tileXAndY) {
SkASSERT(texture);
- fTexture.set(SkRef(texture), GrGpuResourceRef::kRead_IOType);
+ fTexture.set(SkRef(texture), GrIORef::kRead_IOType);
fParams.reset(tileXAndY, filterMode);
memcpy(fSwizzle, "rgba", 5);
fSwizzleMask = kRGBA_GrColorComponentFlags;