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

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: 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') | src/gpu/GrDrawState.cpp » ('J')
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..6af730966a30ac3d7167c12d154dc7a4e75eeefe 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);
}
+ fBlendOptFlags = kInvalid_BlendOptFlag;
}
}
@@ -308,6 +309,7 @@ public:
*/
void setCoverage(uint8_t coverage) {
fCoverage = GrColorPackRGBA(coverage, coverage, coverage, coverage);
+ fBlendOptFlags = kInvalid_BlendOptFlag;
}
uint8_t getCoverage() const {
@@ -343,12 +345,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));
+ fBlendOptFlags = kInvalid_BlendOptFlag;
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));
+ fBlendOptFlags = kInvalid_BlendOptFlag;
return effect;
}
@@ -449,6 +453,7 @@ public:
void setBlendFunc(GrBlendCoeff srcCoeff, GrBlendCoeff dstCoeff) {
fSrcBlend = srcCoeff;
fDstBlend = dstCoeff;
+ fBlendOptFlags = kInvalid_BlendOptFlag;
#ifdef SK_DEBUG
if (GrBlendCoeffRefsDst(dstCoeff)) {
GrPrintf("Unexpected dst blend coeff. Won't work correctly with coverage stages.\n");
@@ -523,6 +528,11 @@ 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);
@@ -535,6 +545,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 +702,7 @@ public:
*/
void setStencil(const GrStencilSettings& settings) {
fStencilSettings = settings;
+ fBlendOptFlags = kInvalid_BlendOptFlag;
}
/**
@@ -696,6 +710,7 @@ public:
*/
void disableStencil() {
fStencilSettings.setDisabled();
+ fBlendOptFlags = kInvalid_BlendOptFlag;
}
const GrStencilSettings& getStencil() const { return fStencilSettings; }
@@ -750,6 +765,7 @@ public:
void resetStateFlags() {
fFlagBits = 0;
+ fBlendOptFlags = kInvalid_BlendOptFlag;
}
/**
@@ -759,6 +775,7 @@ public:
*/
void enableState(uint32_t stateBits) {
fFlagBits |= stateBits;
+ fBlendOptFlags = kInvalid_BlendOptFlag;
}
/**
@@ -768,6 +785,7 @@ public:
*/
void disableState(uint32_t stateBits) {
fFlagBits &= ~(stateBits);
+ fBlendOptFlags = kInvalid_BlendOptFlag;
}
/**
@@ -892,6 +910,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 +944,15 @@ private:
fStencilSettings.setDisabled();
fCoverage = 0xffffffff;
fDrawFace = kBoth_DrawFace;
+
+ fOptSrcBlend = kOne_GrBlendCoeff;
bsalomon 2014/07/17 18:41:03 Do we even need to set the blend flags here?
egdaniel 2014/07/17 19:35:50 By blend flags are you referring to the Src and Ds
+ fOptDstBlend = kZero_GrBlendCoeff;
+ fBlendOptFlags = kInvalid_BlendOptFlag;
}
+ 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 +971,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') | src/gpu/GrDrawState.cpp » ('J')

Powered by Google App Engine
This is Rietveld 408576698