Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(15)

Unified Diff: src/gpu/GrDrawState.h

Issue 404473007: Cache the return values of getBlendOpts in GrDrawState (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Use one if in ARE Created 6 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | src/gpu/GrDrawState.cpp » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/gpu/GrDrawState.h
diff --git a/src/gpu/GrDrawState.h b/src/gpu/GrDrawState.h
index de14763a0508fd71ca17c8587aca41b7b0618549..cef21af880ba6fceda12f7ff81cac6dbfcc7b624 100644
--- a/src/gpu/GrDrawState.h
+++ b/src/gpu/GrDrawState.h
@@ -59,6 +59,7 @@ public:
for (int i = 0; i < fCoverageStages.count(); ++i) {
fCoverageStages[i].localCoordChange(preConcatMatrix);
}
+ this->invalidateBlendOptFlags();
}
}
@@ -249,7 +250,10 @@ public:
*
* @param color the color to set.
*/
- void setColor(GrColor color) { fColor = color; }
+ void setColor(GrColor color) {
+ fColor = color;
+ this->invalidateBlendOptFlags();
+ }
GrColor getColor() const { return fColor; }
@@ -308,6 +312,7 @@ public:
*/
void setCoverage(uint8_t coverage) {
fCoverage = GrColorPackRGBA(coverage, coverage, coverage, coverage);
+ this->invalidateBlendOptFlags();
}
uint8_t getCoverage() const {
@@ -343,12 +348,14 @@ public:
const GrEffect* addColorEffect(const GrEffect* effect, int attr0 = -1, int attr1 = -1) {
SkASSERT(NULL != effect);
SkNEW_APPEND_TO_TARRAY(&fColorStages, GrEffectStage, (effect, attr0, attr1));
+ this->invalidateBlendOptFlags();
return effect;
}
const GrEffect* addCoverageEffect(const GrEffect* effect, int attr0 = -1, int attr1 = -1) {
SkASSERT(NULL != effect);
SkNEW_APPEND_TO_TARRAY(&fCoverageStages, GrEffectStage, (effect, attr0, attr1));
+ this->invalidateBlendOptFlags();
return effect;
}
@@ -391,12 +398,16 @@ public:
void set(GrDrawState* ds) {
if (NULL != fDrawState) {
- int n = fDrawState->fColorStages.count() - fColorEffectCnt;
- SkASSERT(n >= 0);
- fDrawState->fColorStages.pop_back_n(n);
- n = fDrawState->fCoverageStages.count() - fCoverageEffectCnt;
+ int m = fDrawState->fColorStages.count() - fColorEffectCnt;
+ SkASSERT(m >= 0);
+ fDrawState->fColorStages.pop_back_n(m);
+
+ int n = fDrawState->fCoverageStages.count() - fCoverageEffectCnt;
SkASSERT(n >= 0);
fDrawState->fCoverageStages.pop_back_n(n);
+ if (m + n > 0) {
+ fDrawState->invalidateBlendOptFlags();
+ }
SkDEBUGCODE(--fDrawState->fBlockEffectRemovalCnt;)
}
fDrawState = ds;
@@ -449,6 +460,7 @@ public:
void setBlendFunc(GrBlendCoeff srcCoeff, GrBlendCoeff dstCoeff) {
fSrcBlend = srcCoeff;
fDstBlend = dstCoeff;
+ this->invalidateBlendOptFlags();
#ifdef SK_DEBUG
if (GrBlendCoeffRefsDst(dstCoeff)) {
GrPrintf("Unexpected dst blend coeff. Won't work correctly with coverage stages.\n");
@@ -478,7 +490,10 @@ public:
*
* @param constant the constant to set
*/
- void setBlendConstant(GrColor constant) { fBlendConstant = constant; }
+ void setBlendConstant(GrColor constant) {
+ fBlendConstant = constant;
+ this->invalidateBlendOptFlags();
+ }
/**
* Retrieves the last value set by setBlendConstant()
@@ -523,9 +538,18 @@ public:
* Emit transparent black instead of the src color, no need to compute coverage.
*/
kEmitTransBlack_BlendOptFlag = 0x10,
+ /**
+ * Flag used to invalidate the cached BlendOptFlags, OptSrcCoeff, and OptDstCoeff cached by
+ * the get BlendOpts function.
+ */
+ kInvalid_BlendOptFlag = 0x20,
};
GR_DECL_BITFIELD_OPS_FRIENDS(BlendOptFlags);
+ void invalidateBlendOptFlags() {
+ fBlendOptFlags = kInvalid_BlendOptFlag;
+ }
+
/**
* Determines what optimizations can be applied based on the blend. The coefficients may have
* to be tweaked in order for the optimization to work. srcCoeff and dstCoeff are optional
@@ -535,6 +559,9 @@ public:
*
* Subclasses of GrDrawTarget that actually draw (as opposed to those that just buffer for
* playback) must call this function and respect the flags that replace the output color.
+ *
+ * If the cached BlendOptFlags does not have the invalidate bit set, then getBlendOpts will
+ * simply returned the cached flags and coefficients. Otherwise it will calculate the values.
*/
BlendOptFlags getBlendOpts(bool forceCoverage = false,
GrBlendCoeff* srcCoeff = NULL,
@@ -689,6 +716,7 @@ public:
*/
void setStencil(const GrStencilSettings& settings) {
fStencilSettings = settings;
+ this->invalidateBlendOptFlags();
}
/**
@@ -696,6 +724,7 @@ public:
*/
void disableStencil() {
fStencilSettings.setDisabled();
+ this->invalidateBlendOptFlags();
}
const GrStencilSettings& getStencil() const { return fStencilSettings; }
@@ -750,6 +779,7 @@ public:
void resetStateFlags() {
fFlagBits = 0;
+ this->invalidateBlendOptFlags();
}
/**
@@ -759,6 +789,7 @@ public:
*/
void enableState(uint32_t stateBits) {
fFlagBits |= stateBits;
+ this->invalidateBlendOptFlags();
}
/**
@@ -768,6 +799,7 @@ public:
*/
void disableState(uint32_t stateBits) {
fFlagBits &= ~(stateBits);
+ this->invalidateBlendOptFlags();
}
/**
@@ -892,6 +924,9 @@ public:
fDrawFace = that.fDrawFace;
fColorStages = that.fColorStages;
fCoverageStages = that.fCoverageStages;
+ fOptSrcBlend = that.fOptSrcBlend;
+ fOptDstBlend = that.fOptDstBlend;
+ fBlendOptFlags = that.fBlendOptFlags;
memcpy(fFixedFunctionVertexAttribIndices,
that.fFixedFunctionVertexAttribIndices,
@@ -923,8 +958,13 @@ private:
fStencilSettings.setDisabled();
fCoverage = 0xffffffff;
fDrawFace = kBoth_DrawFace;
+
+ this->invalidateBlendOptFlags();
}
+ BlendOptFlags calcBlendOpts(bool forceCoverage = false,
+ GrBlendCoeff* srcCoeff = NULL,
+ GrBlendCoeff* dstCoeff = NULL) const;
// These fields are roughly sorted by decreasing likelihood of being different in op==
SkAutoTUnref<GrRenderTarget> fRenderTarget;
@@ -943,6 +983,10 @@ private:
typedef SkSTArray<4, GrEffectStage> EffectStageArray;
EffectStageArray fColorStages;
EffectStageArray fCoverageStages;
+
+ mutable GrBlendCoeff fOptSrcBlend;
+ mutable GrBlendCoeff fOptDstBlend;
+ mutable BlendOptFlags fBlendOptFlags;
// This is simply a different representation of info in fVertexAttribs and thus does
// not need to be compared in op==.
« no previous file with comments | « no previous file | src/gpu/GrDrawState.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698