class GrEffectStage {
public:
- explicit GrEffectStage(const GrEffectRef* effectRef, int attrIndex0 = -1, int attrIndex1 = -1)
- : fEffectRef(SkRef(effectRef)) {
+ explicit GrEffectStage(const GrEffect* effect, int attrIndex0 = -1, int attrIndex1 = -1)
+ : fEffect(SkRef(effect)) {
fCoordChangeMatrixSet = false;
fVertexAttribIndices[0] = attrIndex0;
fVertexAttribIndices[1] = attrIndex1;
*this = other;
}
- class DeferredStage;
- // This constructor balances DeferredStage::saveFrom().
- explicit GrEffectStage(const DeferredStage& deferredStage) {
- deferredStage.restoreTo(this);
- }
-
GrEffectStage& operator= (const GrEffectStage& other) {
fCoordChangeMatrixSet = other.fCoordChangeMatrixSet;
if (other.fCoordChangeMatrixSet) {
fCoordChangeMatrix = other.fCoordChangeMatrix;
}
- fEffectRef.reset(SkRef(other.fEffectRef.get()));
+ fEffect.reset(SkRef(other.fEffect.get()));
memcpy(fVertexAttribIndices, other.fVertexAttribIndices, sizeof(fVertexAttribIndices));
return *this;
}
+
+ static bool AreCompatible(const GrEffectStage& a, const GrEffectStage& b,
+ bool usingExplicitLocalCoords) {
+ SkASSERT(NULL != a.fEffect.get());
+ SkASSERT(NULL != b.fEffect.get());
- bool operator== (const GrEffectStage& other) const {
- SkASSERT(NULL != fEffectRef.get());
- SkASSERT(NULL != other.fEffectRef.get());
-
- if (!(*this->getEffect())->isEqual(*other.getEffect())) {
+ if (!a.getEffect()->isEqual(*b.getEffect())) {
return false;
}
- if (fCoordChangeMatrixSet != other.fCoordChangeMatrixSet) {
+ // We always track the coord change matrix, but it has no effect when explicit local coords
+ // are used.
+ if (usingExplicitLocalCoords) {
+ return true;
+ }
+
+ if (a.fCoordChangeMatrixSet != b.fCoordChangeMatrixSet) {
return false;
}
- if (!fCoordChangeMatrixSet) {
+ if (!a.fCoordChangeMatrixSet) {
return true;
}
- return fCoordChangeMatrix == other.fCoordChangeMatrix;
+ return a.fCoordChangeMatrix == b.fCoordChangeMatrix;
}
- bool operator!= (const GrEffectStage& s) const { return !(*this == s); }
-
/**
* This is called when the coordinate system in which the geometry is specified will change.
*
private:
bool fCoordChangeMatrixSet;
SkMatrix fCoordChangeMatrix;
- SkDEBUGCODE(mutable SkAutoTUnref<const GrEffectRef> fEffectRef;)
+ SkDEBUGCODE(mutable SkAutoTUnref<const GrEffect> fEffect;)
friend class GrEffectStage;
};
if (fCoordChangeMatrixSet) {
savedCoordChange->fCoordChangeMatrix = fCoordChangeMatrix;
}
- SkASSERT(NULL == savedCoordChange->fEffectRef.get());
- SkDEBUGCODE(SkRef(fEffectRef.get());)
- SkDEBUGCODE(savedCoordChange->fEffectRef.reset(fEffectRef.get());)
+ SkASSERT(NULL == savedCoordChange->fEffect.get());
+ SkDEBUGCODE(SkRef(fEffect.get());)
+ SkDEBUGCODE(savedCoordChange->fEffect.reset(fEffect.get());)
}
/**
if (fCoordChangeMatrixSet) {
fCoordChangeMatrix = savedCoordChange.fCoordChangeMatrix;
}
- SkASSERT(savedCoordChange.fEffectRef.get() == fEffectRef);
- SkDEBUGCODE(savedCoordChange.fEffectRef.reset(NULL);)
+ SkASSERT(savedCoordChange.fEffect.get() == fEffect);
+ SkDEBUGCODE(savedCoordChange.fEffect.reset(NULL);)
}
/**
- * Used when storing a deferred GrDrawState. The DeferredStage allows resources owned by its
- * GrEffect to be recycled through the cache.
- */
- class DeferredStage {
- public:
- DeferredStage() : fEffect(NULL) {
- SkDEBUGCODE(fInitialized = false;)
- }
-
- ~DeferredStage() {
- if (NULL != fEffect) {
- fEffect->decDeferredRefCounts();
- }
- }
-
- void saveFrom(const GrEffectStage& stage) {
- SkASSERT(!fInitialized);
- SkASSERT(NULL != stage.fEffectRef.get());
- stage.fEffectRef->get()->incDeferredRefCounts();
- fEffect = stage.fEffectRef->get();
- fCoordChangeMatrixSet = stage.fCoordChangeMatrixSet;
- if (fCoordChangeMatrixSet) {
- fCoordChangeMatrix = stage.fCoordChangeMatrix;
- }
- fVertexAttribIndices[0] = stage.fVertexAttribIndices[0];
- fVertexAttribIndices[1] = stage.fVertexAttribIndices[1];
- SkDEBUGCODE(fInitialized = true;)
- }
-
- void restoreTo(GrEffectStage* stage) const {
- SkASSERT(fInitialized);
- stage->fEffectRef.reset(GrEffect::CreateEffectRef(fEffect));
- stage->fCoordChangeMatrixSet = fCoordChangeMatrixSet;
- if (fCoordChangeMatrixSet) {
- stage->fCoordChangeMatrix = fCoordChangeMatrix;
- }
- stage->fVertexAttribIndices[0] = fVertexAttribIndices[0];
- stage->fVertexAttribIndices[1] = fVertexAttribIndices[1];
- }
-
- bool isEqual(const GrEffectStage& stage, bool ignoreCoordChange) const {
- if (fVertexAttribIndices[0] != stage.fVertexAttribIndices[0] ||
- fVertexAttribIndices[1] != stage.fVertexAttribIndices[1]) {
- return false;
- }
-
- if (!(*stage.getEffect())->isEqual(*fEffect)) {
- return false;
- }
-
- if (ignoreCoordChange) {
- // ignore the coordinate change matrix since there are
- // explicit uv coordinates
- return true;
- }
-
- if (fCoordChangeMatrixSet != stage.fCoordChangeMatrixSet) {
- return false;
- }
-
- if (!fCoordChangeMatrixSet) {
- return true;
- }
-
- return fCoordChangeMatrix == stage.fCoordChangeMatrix;
- }
-
- private:
- const GrEffect* fEffect;
- bool fCoordChangeMatrixSet;
- SkMatrix fCoordChangeMatrix;
- int fVertexAttribIndices[2];
- SkDEBUGCODE(bool fInitialized;)
- };
-
- /**
* Gets the matrix representing all changes of coordinate system since the GrEffect was
* installed in the stage.
*/
}
}
- const GrEffectRef* getEffect() const { return fEffectRef.get(); }
+ const GrEffect* getEffect() const { return fEffect.get(); }
const int* getVertexAttribIndices() const { return fVertexAttribIndices; }
- int getVertexAttribIndexCount() const { return fEffectRef->get()->numVertexAttribs(); }
+ int getVertexAttribIndexCount() const { return fEffect->numVertexAttribs(); }
private:
bool fCoordChangeMatrixSet;
SkMatrix fCoordChangeMatrix;
- SkAutoTUnref<const GrEffectRef> fEffectRef;
+ SkAutoTUnref<const GrEffect> fEffect;
int fVertexAttribIndices[2];
};